ユーザ用ツール

サイト用ツール


サイドバー

Index

はじめてのおつかい






DokuWiki整形記法


PlayGround



serverapps:nginx:phpfpm

NGiNX + php-fpm

phpを動作させるに当たってはphpに同梱されているphp-FPM(FastCGI Process Manager)を利用する。

Install

NGiNX

オプションの設定があるのでportsからインストールする。1)
2017.12.27:GEOIP、IMAGE_FILTER、PERL以外は最初からONになってるのでPKGでもOK

# cd /usr/ports/www/nginx
# make config
[X] : HTTP_ADDITION_MODULE
[X] : HTTP_CACHE_MODULE
[X] : HTTP_GEOIP_MODULE
[X] : HTTP_GZIP_STATIC_MODULE
[X] : HTTP_IMAGE_FILTER_MODULE
[X] : HTTP_PERL_MODULE
[X] : HTTP_REALIP_MODULE
[X] : HTTP_REWRITE_MODULE
[X] : HTTP_SSL
[X] : HTTP_STATUS_MODULE
# make install
# make clean
# pkg lock nginx

php

オプション(FPM)の設定があるのでportsからインストールする。 2017.12.27:現在はデフォルトでON

# pkg install php71

↓ここは古い

  # cd /usr/ports/lang/php56
  # make config
  [X] : FPM
  # make install
  # make clean
# pkg lock php56

php-extensions

pkg install php71-extensions

設定

/usr/local/etc/php.ini

とりあえずこんな感じ。2)

date.timezone = Asia/Tokyo    <= こうしないとエラーになるCMSが多い
memory_limit = 32M
upload_max_filesize = 10M
post_max_size = 20M
expose_php = off              <= phpのバージョンをheaderに表示しない

/usr/local/etc/php-fpm.conf

[global] 
events.mechanism = kqueue
...
include=/usr/local/etc/php-fpm.d/*.conf

/usr/local/etc/php-fpm.d/www.conf

[www]
user = www
group = www
listen = /var/run/php-fpm.sock  <= listenはソケットにした(DefaultはTCP:127.0.0.1:9000)
listen.owner = www              <= 設定しないと /var/run/php-fpm.sock failed (13: Permission denied) で動かない
listen.group = www              <= 
listen.mode = 0666              <= 

※5.6では今は一体化されてphp-fpm.confに内包されている

/usr/local/etc/nginx/nginx.conf

user  www www;
worker_processes         auto;
worker_cpu_affinity      auto;
worker_priority          0;
#worker_rlimit_nofile    8192;
error_log                /var/log/nginx/nginx-error.log  info;

pid /var/run/nginx.pid;
 
events {
  multi_accept        on;
  worker_connections  512;      <= 一つのworkerプロセスが同時に処理できる最大コネクション数
  accept_mutex on;
  accept_mutex_delay  100ms;
}
 
http {
  include       conf.d/options;  <= optionはファイルから
  include       conf.d/proxy; 
  include       conf.d/ssl;

  include       mime.types;
  default_type  application/octet-stream;

  access_log  /var/log/nginx/access.log main buffer=32k;     <= mainの定義はconf.d/options
 
  include sites/*.site;          <= site毎の設定はファイルから
}

/usr/local/etc/nginx/conf.d/options

3)

client_body_timeout       5s;
client_header_timeout     5s;
keepalive_timeout         75s;
send_timeout              15s;
charset                   utf-8;
gzip                      on;
gzip_static               on;
gzip_proxied              any;
ignore_invalid_headers    on;
keepalive_requests        50;
keepalive_disable         none;
max_ranges                1;
msie_padding              off;
open_file_cache           max=1000 inactive=2h;
open_file_cache_errors    on;
open_file_cache_min_uses  1;
open_file_cache_valid     1h;
output_buffers            1 512;
postpone_output           1440;
read_ahead                512K;
recursive_error_pages     on;
reset_timedout_connection on;
sendfile                  on;
server_tokens             off;
server_name_in_redirect   off;
source_charset            utf-8;
tcp_nodelay               on;
tcp_nopush                off;
gzip_disable              "MSIE [1-6]\.(?!.*SV1)";
limit_req_zone            $binary_remote_addr  zone=gulag:1m   rate=60r/m;
log_format                main  '$remote_addr $host $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $ssl_cipher $request_time';

/usr/local/etc/nginx/sites/default.site

以下の設定でデフォルトでは接続しなくなる

server {
    listen 80 default_server;        <= default_server:デフォルトサーバに指定
    return 444;                      <= コネクションクローズ
}

/usr/local/etc/nginx/sites/*.site

server {
        server_name example.com www.example.com;   <= 環境に合わせる
        # add_header  Cache-Control "public";      <= HTTP キャッシュ ヘッダの設定
        add_header  Cache-Control "private, no-store, no-cache, must-revalidate";
        add_header  Pragma "no-cache";
        add_header  X-Frame-Options "DENY";        <= クリックジャッキング対策
        limit_req   zone=gulag burst=2000 nodelay; <= かなり低めに設定しているので注意
                                                   <= gulag の定義はconf.d/options
        expires     max;
 
        listen 80;
        listen 443 ssl;                            <= SSL関連
        include conf.d/ssl;                        <= SSL関連
 
        root /usr/local/www/mySite;                <= 環境に合わせる
        index index.html index.htm index.php;
 
        location = /favicon.ico { return 204; }    <= No Content
 
        location ~* \.(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)$|^(\..*|Entries.*|Repository|Root|Tag|Template)$|\.php_ { deny all; }
 
        location ~ /\. {
                deny all;
                access_log off;
                log_not_found off;
        }
 
        location / {
                root /usr/local/www/mySite;       <= 環境に合わせる
                try_files $uri $uri/ /index.php?$args;
        }
 
 
        location ~ \.php$ { include conf.d/php-fpm; }
 
        error_page   500 502 503 504  /50x.html;
        location = /50x.html { root   /usr/local/www/nginx-dist; }
}

/usr/local/etc/nginx/conf.d/ssl

ssl_certificate /path/to/myCertificate.pem;       <= 環境に合わせる
ssl_certificate_key /path/to/myKey.pem;           <= 環境に合わせる
ssl_dhparam /path/to/dhparam4096.pem;             <= 環境に合わせる
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

/usr/local/etc/nginx/conf.d/php-fpm

fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
try_files  $uri = 404;
fastcgi_split_path_info  ^(.+\.php)(.*)$;
fastcgi_index  index.php;
fastcgi_intercept_errors  on;
fastcgi_ignore_client_abort  off;
fastcgi_connect_timeout  60;
fastcgi_send_timeout  180;
fastcgi_read_timeout  180;
fastcgi_buffer_size  128k;
fastcgi_buffers  4 256k;
fastcgi_busy_buffers_size  256k;
fastcgi_temp_file_write_size  256k;
#fastcgi_param GEOIP_COUNTRY_CODE $geoip_country_code;
#fastcgi_param GEOIP_COUNTRY_NAME $geoip_country_name;
include fastcgi_params;  # pkg default file

起動

/etc/rc.conf

php_fpm_enable="YES"
nginx_enable="YES"

チェック

# service nginx configtest
Performing sanity check on nginx configuration:
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful

チェック用のページを作る

# sh -c 'echo "<?php phpinfo(); ?>" >  /usr/local/www/mySite/info.php'      <= 環境に合わせる

起動

# service php-fpm restart
# service nginx restart

参考

1)
perlが一緒にインストールされるので、先にpkgで入れておくのが吉
2)
/usr/local/etc/php.ini-productionをコピーして使うのも良いかと
3)
http節でinclude
serverapps/nginx/phpfpm.txt · 最終更新: 2023/08/27 16:35 by hayashi