NGINX with PHP on FreeBSD
FreeBSD上でNGINXとPHPが動作するServerを構築する。 なお、OSのInstallは別項に任せ省略する。
NGINX+PHP環境さえあれば様々なWeb Application Serverを構築できるので、その種を。今回は、Dokuwikiを設置するためのサーバーを作る。
前提
- FreeBSDがInstall済みのServerがある
- Internetに接続できている
- 外部にFirewallがあり、本Server自身ではFirewall処理を行わない(本来は行うべきだが割愛)
- 可能な限りpkg/portsで構築する
- Applications(Dokuwikiなど)自身のInstallは(本記事の)スコープ外
システム側の設定
/etc/rc.conf.local
に以下を追加- rc.conf.local
nginx_enable="YES" php_fpm_enable="YES"
これらの設定は、nginxなりphpなりをports/pkgを用いてInstallしない限り利用されないので、事前に設定しても通常問題にならないが、動作確認後に設定する方が望ましいことが多い。
PackageのInstall
導入するパッケージは以下の通り
- sudu
- nginx
- curl
- php73, php73-extensions
- 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
# 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
/usr/local/etc/php.ini
を作成し、編集するsudo cp /usr/local/etc/php.ini-production /usr/local/etc/php.ini
- php.ini.diff
*** php.ini-production Thu Jan 10 10:30:41 2019 --- php.ini Tue Jan 15 01:45:39 2019 *************** *** 955,960 **** --- 955,961 ---- ; Defines the default timezone used by the date functions ; http://php.net/date.timezone ;date.timezone = + ;date.timezone = + date.timezone = Asia/Tokyo ; http://php.net/date.default-latitude ;date.default_latitude = 31.7667
この他に、post_max_size
やupload_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
に記述する。
- logをsyslog経由で記録する場合に設定する程度で多くの場合問題はない
Web Serviceに関する設定は、/usr/local/etc/php-fpm.d/www.conf
に記述する。
- 通常の設定で多くの場合問題はないが、アクセス数が多いものなどでは、preforkする子の数を増やす方が良い。
- pm.max_children, pm.min_spare_servers, pm.max_spare_servers, slowlog, request_slowlog_timeout あたりが修正対象
- もちろん、logをsyslog経由で飛ばすなら、newsyslog関連の設定を行うべきである。
/usr/local/etc/newsyslog.conf.d/php-fpm.conf
- php-fpm.conf
# logfilename [owner:group] mode count size when flags [/pid_file] [sig_num] /var/log/php-fpm.log www:www 600 7 * @T00 JC /var/log/php-fpm.slow.log www:www 600 7 * @T00 JC
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