ユーザ用ツール

サイト用ツール


サイドバー

Site Contents

転載・引用について

RSS

server:nginx_php

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_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 に記述する。

  • 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
server/nginx_php.txt · 最終更新: 2019/05/10 12:46 (外部編集)