Linuxの最近のブログ記事

Debianのapache2の設定方法

学生が、Raspberry-PiでCGIを使いたいらしいけど、設定の方法がDebianは一癖あるので、 説明資料を記述。

Debianの原則

Debianでは、基本的な設定ファイルは極力自分で触らない主義。

apache2 も同様で、便利なモジュールも設定ファイルは、必要なものは モジュール毎にインストール時に読み込ませて、触らない主義。

このための設定があって、 CGIとかPHPといったものは、モジュールで管理。

DebianのApache2設定ファイルの考え方

一般的なApacheでは、設定は、/etc/apache2/apache2.conf とか、 /etc/apache2/httpd.conf に記述する。 しかし、いくつものモジュールを使うと、これらの設定ファイルが、 巨大で理解困難になってしまう。

このためDebianのapache2 では、/etc/apache2/*-enabled で対応する。 /etc/apache2/apache2.conf には、以下のような行が書いてあり、 *-enabled配下の設定ファイルをすべて読み込んで起動する。

(( /etc/apache2/apache2.confの一部 ))
 IncludeOptional mods-enabled/*.load
 IncludeOptional mods-enabled/*.conf
 IncludeOptional conf-enabled/*.conf
 IncludeOptional site-enabled/*.conf

/etc/apache2/mods-enabled (mods-available)

  1. 必要なモジュールをインストールすると、 設定ファイルは /etc/apache2/mods-available に書き込まれる。
    (モジュール名.load モジュール名.conf)
      使えるモジュールは、以下のコマンドを使えば、一覧が見れる。
      $ aptitude search libapache2-mod
    
      インストールしたいモジュールが見つかったら
      $ sudo aptitude install libapache2-mod-モジュール
    
  2. 本当に使いたいモジュールは、以下のコマンドを実行。
      $ sudo /usr/sbin/a2enmod モジュール名
      /etc/apache2/mods-enabled に、mods-available への
      シンボリックリンクを作ってくれる。
    
    使いたくなくなったら、
      $ sudo /usr/sbin/a2dismod モジュール名
    
  3. a2enmodなどを実行したら、以下のコマンドで apache2を再起動
      $ sudo /etc/init.d/apache2 restart
    
    基本原則 /etc/apache2/mods-enabled の配下の設定ファイルは触らない。 どうしても設定ファイルを変更したい場合は、conf-enabled , site-enabled で設定。

/etc/apache2/sites-enabled (sites-available)

  1. apache2では、1台のコンピュータで複数のwebサイトを構築できる。 バーチャルホストの設定は1つのホスト毎に、sites-available の *.conf に記述。 ホスト毎の細かい設定は、この中に記述する。
  2. そのホストを使えるようにしたかったら、以下のコマンド。
      $ sudo /usr/sbin/a2ensite ホスト
      /etc/apache2/site-enabled に、site-available への
      シンボリックリンクを作ってくれる。
    
    ホストを使えないようにする。
      $sudo /usr/sbin/a2dissite ホスト
    
  3. a2ensite を実行したら、"/etc/init.d/apache2 restart"

/etc/apache2/conf-enabled (cont-available)

  1. site-* では、各ホスト毎の設定を書くけど、すべての仮想ホストに共通な 設定は、conf-enabled / conf-available を使う。
  2. 設定を /etc/apache2/conf-available の中に、設定名.conf で記述し、 以下のコマンドで有効にする。
      $ sudo /usr/sbin/a2enconf 設定名
      $ sudo /usr/sbin/a2disconf 設定名
    

(例)

CGIを使いたい (CGIは基本モジュールなのでlibapache2-mod-cgi などはしなくていい)

 $ sudo /usr/sbin/a2enmod cgi  # cgiモジュールの有効化
 $ sudo /etc/init.d/apache2 restart

PHP5を使いたい

 $ sudo aptitude install php5   # PHP5をインストール
 $ sudo aptitude install libapache2-mods-php5
                           # apache2のphp5モジュールをインストール
 $ sudo /usr/sbin/a2enmod php5  # php5モジュールの有効化
 $ sudo /etc/init.d/apache2 restart  # apache2 の再起動

ページは各ユーザの /home/user/public_html/ 配下に作らせたい。

 $ sudo /usr/sbin/a2enmod userdir

SSLのhttps://を使いたい

 $ sudo vi /etc/apache2/site-available/default-ssl.conf
 $ sudo /usr/sbin/a2ensite default-ssl
 $ sudo /etc/init.d/apache2 restart

I2Cを認識させる

(( i2cを認識させる設定 ))
$ sudo raspi-config
## 8 Advenced Options" -> "A7 I2C" よりI2Cを標準で認識するように設定
## /etc/modprobe.d/raspi-blacklist.confのblacklistがコメントアウト
# blacklist i2c-bcm2708 
## /etc/modules に以下の行が追加される
i2c-dev
i2c-bcm2708
$ sudo reboot

(( i2cが認識されたか確認 ))
$ sudo aptitude install i2c-tools

$ ls /dev/i2c-*
/dev/i2c-1
## Raspberry-Pi によっては、/dev/i2c-0 となるかも。
$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- 
## まだi2c機器を何も繋げていない...

(( i2cをユーザで使えるように ))
$ ls /dev/i2c-1
crw-rw---T 1 root i2c 89, 1  9月 10 09:02 /dev/i2c-1
## i2cを使うためのグループにユーザpiを加える。
$ sudo adduser pi i2c

カメラ制御で使うもの

Debian 8.0 / Jessie が stable となって配布が始まったので、 まずは影響の少ないサーバに入れてみる。 自宅や自室のサーバは、すでに Jessie に切り替え済みだけど、 久々だと、なかなか手間取る。

# aptitude remove `dpkg -l | awk '{print $2}' | egrep -e ^kde-`
# aptitude remove `dpkg -l | awk '{print $2}' | egrep -e ^gnome-`

あたりを実行して、依存の原因となりそうなパッケージはひとまず 減らしてから、

# aptitude update ; aptitude full-upgrade

ただし、処理中に libxml-libxml-perl が更新前の削除でエラーが発生し 手間取ってしまった。パッケージの依存情報の微妙なエラーがあるようだ。 この次に学科のメインサーバの更新となるが、 その際には、一番最初に削除してからにしよう。

再起動させたら失敗

更新は上手くいったが、翌朝再起動をかけたら起動しない。 Debian/Jessie/netinst のCDを作り、リカバリーモードで起動させる。

起動時には、ブートローダーで linux-image-2.16 なんかを探しているので、 古いブートローダーを使おうとしている。どうも、grub2のインストールで失敗していた様子。 以下のコマンドで、インストールを確認し再起動。

# aptitude install grub2
# grub-install /dev/sda
# update-grub
更新の最終段階は、夜中に家からの作業だったけど、reboot は翌朝にして正解だった...(x_x;

Chromebookが届く

先日導入を悩んでいたChromebookが届いた。余計な機能も無いし、 サックサク。キー入力も設定の中に検索,Controlキーの変更もあり 使い勝手の悪さの第一ハードルはなくなった。

しかしちょいと慣れだすと、無意識にカーソル移動にCtrl-Nとかの emacsキーバインドで操作して、その度にウィンドウが開いて、軽くイライラ。

でも、これなら、学生さんがレポートとかでGoogle Docsにはなるけど、 慣れちゃえばこれでパソコン仕事は十分とも思えてくる。 ネットワークが繋がらないところでどの程度使えるのかがカギかな。

プログラミング環境が無いし、どの程度で演習に使えるかと思ったけど、 Ctrl+Alt+Tで"chrome-OS"のshellに抜けることができる。 機能の中にはssh接続もあるし、これでサーバに接続すればなんでもアリじゃん...。 と思ったのだが、ssh経由でサーバにつないでemacs使ってプログラム編集をしようとしたら、 相変わらずCtrl-Nでウィンドウ開くわ、カーソル操作でもエスケープシーケンスの問題なのか反応がおかしくなる。

個人的には、じゃあ vi でいいじゃん...と思うけど、学生さんにはなぁ...

使い勝手の実験ということで、会議の議事録をChromebookで頑張ってみた。 入力速度や漢字入力の操作性では、問題は無かったけど、 ChromeブラウザでのEvernote Web版(Beta)を使ったのがマズかったかな。 範囲指定して、文字装飾かけると、文字が消えてしまう...(x_x;; Ctrl-Zで復活させると装飾がかかって復活してくれるけど.... 古いWeb版にしても、装飾かけると文字が消えるのは、相変わらずか...ダメじゃん。

unix講習会

卒研の5年生が、Raspberry-PiやらWebサーバ使いたいやらで、 unixを触る機会が多いけど、基本が解らないので 講習会をして欲しいとの要望から、unixの講習会を行いました。 卒研の時間を使ったけど、中途半端になってもいけないので、3時間コースになりました。

unixを使うには

unixを使うと言っても、色々な方法がある。 HDDインストール、USBインストール、 Windowsの仮想サーバ上にインストール(ただしLinuxは不安定)。 自前のサーバでなければ、Remote Desktopで接続、Rloginなどからssh接続。 ちょっと本物との違いがあるかもしれないけど、Cygwin,MinGWをインストール。

unixには様々なものがあるが、大きく分けるとBSD系(FreeBSD,NetBSD)、 Mac OS X、Linux。 Linuxといっても、Linux自体はカーネル部分だけであり、フリーの周辺ソフトを 取りまとめたディストリビューションがいくつかある。 有名なのは、RedHat系(CentOS,Fedra)、Debian系(Debian,Ubuntu)。 最近であれば、Ubuntuを入れるのが無難だろう。

unixの最初

まずは、login してもらって、ディレクトリ構成やら簡単な設定方法を説明。

/boot 起動に必要なもの
/bin  必要最低限の実行プログラム
/sbin 必要最低限の管理者向け実行プログラム
/lib  ライブラリやモジュールなど
/home ユーザのディレクトリ
/etc  設定ファイル
/var  プログラムが可変データを保存する場所
/tmp  だれでも書き込める作業用データの置き場
/usr/bin  一般的な実行プログラム
/usr/sbin 一般的な管理者向け実行プログラム
/usr/local/bin そのシステム固有の実行プログラム
/usr/local/sbin そのシステム固有の管理者向け実行プログラム
/dev  デバイスファイル

unixで設定を行う場合、システム全体に関係する設定は、/etc/配下のファイル、 各ユーザ固有の設定は、$HOME/配下の "." で始まる隠しファイルを使う。

各ユーザの情報は、/etc/passwd,/etc/group などで管理され、 passwdファイルの最後の欄には、login-shell などが記載される。

shellの基本

shellは、コマンドの対応処理をしてくれるが、基本設定は、.bashrc や .profile で 設定する。サーバの簡単な設定を行うだけであれば、基本的なバッチファイル (shell-script)の書き方を知っていればいい。

変数代入・参照、if,case などの概略だけを説明する。

そういえば、chmod で実行フラグの説明しなかったな...

shell-scriptでは、環境変数とshell変数があり、環境変数は子プロセス起動時に 引き継がれる。 環境変数で、重要な、LANG,PATH,LD_LIBRARY_PATH などを説明する。

分割コンパイルの説明

フリーのソフトを個別ダウンロード・コンパイルする学生も多い一方で、 make の意味やらが解らない人も多いので、分割コンパイルやmakeを説明。

複数のプログラムから、一つのプログラムを作る場合には、ヘッダファイルなどの 書き方が重要なので、4年の情報構造論でやったネタを分割する場合で説明。

(( list.h ))
struct List {
    int  data ;
    struct List* next ;
} ;
struct List* cons( int , struct List* ) ;
void print( struct List* ) ;
extern int count ;
------------------------------------------------
(( list.c ))
#include <stdio.h>
#include <stdlib.h>
#include "list.h"

int count = 0 ; // cons実行回数のカウント

struct List* cons( int x , struct List* n ) {
    struct List* nn ;
    count++ ;
    nn = (struct List*)malloc( sizeof( struct List ) ) ;
    if ( nn != NULL ) {
        nn->data = x ;
        nn->next = n ;
    }
    return nn ;
}
void print( struct List* p ) {
    for( ; p != NULL ; p = p->next )
        printf( "%d¥n" , p->data ) ;
}
------------------------------------------------
(( main.c ))
#include <stdio.h>
#include "list.h"

int main() {
    struct List* l = cons( 1 , cons( 2 , cons( 3 , NULL ) ) ) ;
    print( l ) ;
    printf( "%d¥n" , count ) ;
    return 0 ;
}

共通のヘッダファイルには、構造体宣言やプロトタイプ宣言を記載する。

Makefileの書き方

前述のlist.c,main.c をコンパイルするには、必要最小限の処理毎に行う場合は、 以下の3つのコマンドで行う。

$ gcc -c list.c
$ gcc -c main.c
$ gcc list.o main.o
----------------
   $ gcc list.c main.c であれば、一度にできるけどmakeの理解のため。

プログラムの修正があった場合には、3つのどのコマンドを実行すべきかは、 人間が考えるのは煩雑。そこで make を使う。 make は、ファイルの日付情報を元に必要最小限の処理を行ってくれる。

(( Makefile ))
a.out: list.o main.o
        gcc list.o main.o
list.o: list.c list.h
        gcc -c list.c
main.o: main.c list.h
        gcc -c main.c

しかし、gcc のコンパイラを別なものを使うとか、特殊なライブラリを使う場合、 makeの変数を使って書き換えを容易に行えるようにする。

CC = gcc
CFLAGS = -Wall # -DDEBUG

a.out: list.o main.o
        $(CC) list.o main.o
list.o: list.c list.h
        $(CC) $(CFLAGS) -c list.c
main.o: main.c list.h
        $(CC) $(CFLAGS) -c main.c

texlive-full でかっ

紀要の原稿の修正で、ファイルを触ったら、 epsファイルの位置がずれるトラブル。

いろいろ試したけど、うまくいかない。 以前は動いていたので、texlive の更新 のトラブルと考え、ひとまず texlive 関連を アンインストールし、stable にて再インストール。

# aptitude remove texlive
# aptitude install texlive/stable

すりゃいいんだろうけど、どれ消す、どれ入れるだ、 選択肢を選ぶのが大変なので、一時的に apt-source から testing,unstable を消して インストールを行う。

wheezy登場でoldstable運用

Debian 7.0(wheezy)の登場で、自分の管理しているサーバのいくつかは、 メンテナンス作業を行い、wheezy(stable)や、jessie(testing)に移行を終えた。 しかしながら、メインでサービスを動かしているサーバは、 移行で動かなくなりそうなサービスもあって、気軽に wheezy に移行できずにいる。

しかたがないので、3週ほど更新せずにいたけど、 そろそろ何らかの更新体制に設定する必要がある。 ということで、軟弱運用だけど、oldstable(squeeze) を利用するように設定した。 でも、oldstable も大抵1年間ほどなので、夏休みにでもボチボチ移行せねば...

Debian/wheezyのstable化が近づき、メイン稼働でないものから、 squeeze から wheezy に切り替え作業。 といっても、ちょっと心配なので、不要パッケージを削除して、 testing 用の sources.list を加え、ひとまず stable にとどめておく。

この作業で、update したら、qmail が更新された。 しかもお堅い配布方針で qmail-src から入れるしかなかった qmail で バイナリパッケージが提供されている。しかしながら、設定の方針の違いで パッケージのインストールに失敗した。

いまどき、postfix 入れろよ...という意見もあるだろうが、ひとまずはサービス維持を優先。

qmail を更新すると、alias のグループIDが、今までは nogroup/65534 になっていたけど、 nofiles というグループを作ってそれを使えとの指示。 さらに、ホームディレクトリを /var/qmail だったのを /var/lib/qmail に変更しろとの指示。

(( /etc/group ))
nofiles:x:64011:

(( /etc/password ))
alias:x:64010:64011:qmail alias,,,:/var/lib/qmail/alias:/bin/false
qmaild:x:64011:64011:qmail daemon,,,:/var/lib/qmail:/bin/false
qmails:x:64012:64010:qmail send,,,:/var/lib/qmail:/bin/false
qmailr:x:64013:64010:qmail remote,,,:/var/lib/qmail:/bin/false
qmailq:x:64014:64010:qmail queue,,,:/var/lib/qmail:/bin/false
qmaill:x:64015:64011:qmail log,,,:/var/lib/qmail:/bin/false
qmailp:x:64016:64011:qmail pw,,,:/var/lib/qmail:/bin/false

(( /etc/init.d/qmail ))
sh -c "start-stop-daemon --start --quiet --user qmaild \
  --pidfile /var/run/tcpserver_smtpd.pid --make-pidfile \
  --exec /usr/bin/tcpserver -- -R -H \
  -u `id -u qmaild` -g `id -g qmaild` -x /etc/tcp.smtp.cdb 0 smtp \
  $rblsmtpd /usr/sbin/qmail-smtpd 2>&1 \
  | $logger &"

sshfsを使ってみる

sshfs が、Mac OS X でも使えるとの記事を見つけて、試してみる。

まずは、osxfuse と sshfs を iMac にインストールする。 このサイトより、必要な .pkg と .dmg を取得&インストール。あっさり完了。

接続は、相手サイトにパスワード認証などが省略できるように、 ssh-keygen コマンドあたりを実行し、相手サイトに公開鍵をインストールしておく。 あとは、以下のコマンドで終わり。

(あらかじめ相手サイトに~/mntのマウントポイントを作っておく)
$ sshfs useid@remotehost:/home/path ~/mnt

確かに便利にはなったけど、コマンドで scp を打ち慣れていると、 そんなに「便利になった」感は、ない。

リモートサイトからローカルをマウント

FWの内側のローカルホストから、相手サイトにトンネルを掘る場合、 以下のsshコマンドをよく使ってる。

(ローカルホストにて)
$ ssh -R 100XX:localhost:22 remotehost
  # 100XXは適当なポート番号
(相手サイトにて)
$ slogin -p 100XX localhost
  # これで、FW内部にloginできる。

これができれば、相手サイトからFW内部のディスクもマウントできるから、あとはGUIで簡単に触れるようにするために、sshfs を実行。

(相手サイトにて)
$ sshfs userid@localhost: ~/mnt -p 100XX

ただし、実行しようとしたら、"/dev/fuse Permission Denied" のエラーが出た。 ということで、"sudo adduser 自分のID fuse"にて、fuseグループに所属させる。 一度、logout して再loginすれば、sshfs でマウントできる。

CentOSでSELinux無効化

ちょいと指定されたWebサービスを仕立てる必要があり、 その設定がRedHatベースなので、仮想サーバ上で CentOS を動かす。

ただ、設定を変えていたら、httpd が動かなくなる。 パーミッションなども確認したけど訳ワカメ状態なので 「この設定でこんなエラーメッセージでるはず無いじゃん」な メッセージでググると、CentOS では SELinux が動いているためっぽい。

SELinuxの設定で権限を与えようかと思ったけど、後々トラブルを呼び そうなので、SELinuxを停止させる方を選ぶ。 学内はFireWallの中だし、そんなにガチガチの設定も必要ないし、 仮想サーバで他のユーザの心配も不要だし、問題はないだろう。

# setenforce 0
# vi /etc/sysconfig/selinux
SELINUX=disabled   ...に変更

2015年12月

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

アーカイブ

Google

このアーカイブについて

このページには、過去に書かれたブログ記事のうちLinuxカテゴリに属しているものが含まれています。

次のカテゴリはMacです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。