目次

NGINX with PHP on FreeBSD

FreeBSD上でNGINXとPHPが動作するServerを構築する。 なお、OSのInstallは別項に任せ省略する。

NGINX+PHP環境さえあれば様々なWeb Application Serverを構築できるので、その種を。今回は、Dokuwikiを設置するためのサーバーを作る。

前提

システム側の設定

これらの設定は、nginxなりphpなりをports/pkgを用いてInstallしない限り利用されないので、事前に設定しても通常問題にならないが、動作確認後に設定する方が望ましいことが多い。

PackageのInstall

導入するパッケージは以下の通り

# pkg install nginx-devel curl php73 php73-extensions
# pkg install php73-bz2 php73-curl php73-exif php73-fileinfo php73-ftp php73-gd php73-gettext php73-intl php73-mbstring php73-openssl php73-shmop php73-sockets php73-zip php73-zlib
# pkg install php73-mysqli php73-pdo_mysql

なお、Dokuwikiを動作させるだけなら、mysqliやpdo_mysqlは不要だが、WebApplicationがMySQLを利用することが多いので、一応入れておく。

Web Serverの設定

PHPとNGINXを設定すれば良い。

一般に、portsによって導入されたServer ApplicationやMiddlewareは、通常/usr/local以下に配置される。 pkgによってinstallされた各種ファイルがどこにあるかを確認したい場合、pkg info -l [packagename]でInstallされたファイル一覧が見られる。

PHP関連の設定

詳細なPHPの設定はPHP関連のマニュアルを参照してほしい。ここでは、日本時間で動作する最小限の設定を掲載する。

php.ini

この他に、post_max_sizeupload_max_filesizeも設定する方が良いが、Applicationによって異なるのでここには記さない。

また、logをsyslogで出力するように設定した場合は、/usr/local/etc/newsyslog.conf.d/を作成の上、以下のような内容のファイルを配置する。

php.conf
# logfilename                   [owner:group] mode count size when  flags [/pid_file] [sig_num]
/var/log/php.log                www:www       600  7     *    @T00  JC

php-fpm関連

NGINXからFastCGIを利用してRequestを受け付けるためのインターフェース。 軽いサーバーであれば特に修正の必要はない。

PHP-FPM全般の動作に関する設定は /usr/local/etc/php-fpm.conf に記述する。

Web Serviceに関する設定は、/usr/local/etc/php-fpm.d/www.conf に記述する。

nginx関連の設定

NGINXをpkgでinstallし service nginx onestart すれば、とりあえず NGINX は動作する。

あとは、アプリケーションに合わせてserver設定を行えば良い。

一例として、本サイト用のDokuWiki関連の設定を以下に挙げる。http directiveの中のserver directiveのみの記述であることに注意。

server {
  listen      80;
  server_name freebsd.seirios.org;

  access_log  /var/log/nginx/freebsd.seirios.org.acc  main;
  error_log   /var/log/nginx/freebsd.seirios.org.err  info;

  autoindex   off;
  index       index.html index.php doku.php;
  root        /www-contents/freebsd.seirios.org/;

  location / {
    try_files $uri $uri/ @dokuwiki;
  }

  location ~ ^/lib.*\.(gif|png|ico|jpg)$ {
    expires 30d;
  }

  location ~ ^/(data|conf|bin|inc)/ { deny all; }
  location ~ ^\.ht                  { deny all; }

  location = /robots.txt            { access_log off; log_not_found off; }
  location = /favicon.ico           { access_log off; log_not_found off; }
  location ~ /\.                    { access_log off; log_not_found off; deny all; }
  location ~ ~$                     { access_log off; log_not_found off; deny all; }

  location @dokuwiki {
    rewrite ^/_media/(.*)          /lib/exe/fetch.php?media=$1 last;
    rewrite ^/_detail/(.*)         /lib/exe/detail.php?media=$1 last;
    rewrite ^/_export/([^/]+)/(.*) /doku.php?do=export_$1&id=$2 last;
    rewrite ^/(.*)                 /doku.php?id=$1 last;
  }

  location ~ \.php$ {
    try_files $uri =404;
    include conf.http.d/fcgi-options;
  }
}

#minute hour mday month wday command # 0,10,20,30,40,50 * * * * /bin/sh /home/www/bin/WebDataSync.sh </code>

mweb02-php
#minute hour    mday    month   wday    command
#
5,15,25,35,45,55 * *    *       *       /bin/sh /home/www/bin/WebDataSync.sh

あとは、/var/log/cronを確認して、両方のサーバーでUNISONでの同期が行われていることを確認する。

最後に、newsyslog関係の設定を行う。/usr/local/etc/newsyslog.conf.d下に、unison.confを配置する。

unison.conf
# logfilename                   [owner:group] mode count size when  flags [/pid_file] [sig_num]
/home/www/unison.log            www:www       600  7     *    @T0003 JC