fast-cgiの設定

前回の記事でmariaDBとFast-cgiが主な負荷になっていることが判明しました。今回はFast-cgiの設定とuhttpdをnginxに切り替えてみます。
phpinfoでPHPを調べてみるとServer-APIの項目がCGI/FastCGIとなっていました。
これをFPM/FastCGIに変更する方法を説明します。uhttpdは/etc/config/uhttpdを設定するだけで動きましたが、
nginxは設定がややこしく、openwrt公式だけ見ても非常にわかりにくいです。nginx公式も参考にしたほうがいいでしょう。
nginxでphpを動かすためにはphp-fpmに処理を任せています。
そのため、nginxとphp-fpmの設定を個別に行う必要があります。
nginxの設定は/etc/nginx フォルダ    php-fpmは/etc/php7-fpm/www.confです。
wikiの通りにphp.locationsを設定しただけでは動きません。
ここではまずnginxでphpinfoを表示させることにします。今回もluciを使わない設定で行っていますのでluciを使いたい人は他サイトを参考にしてください。

opkg update && opkg install nginx-ssl php7-fpm

Nginxのserverブロックデフォルト設定は/etc/nginx/conf.d/_lan.confにあります。
LANにつないでいる機器の全てのポート80と443を受け付ける設定になっています。
自動的にopenwrt自己署名証明書_lan.crtと_lan.keyが作成されます。
ここではLetsEncryptの証明書を用いますので_lan.confを用いません。
/etc/nginx/conf.d/_lan.confを
/etc/nginx/conf.d/_lan.conf.disabledにリネーム
crontab -e
3 3 12 12 * /usr/bin/nginx-util 'add_ssl’ '_lan’のラインを消します。
nginx.conf(httpブロック)とexample.conf(serverブロック)とphp.locations(phpブロック)
の3つのファイルに分けてそれをinucludeします。
以下のような形で内包しています。
/etc/nginx/nginx.conf
├──/etc/nginx/example.com.conf

                                     └──etc/nginx/php.locations

/etc/nginx/fastcgi_paramsに以下を加えます。

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;

/etc/nginx/example.com.confのserverブロックの設定

server {
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
server_name .example.com;
keepalive_timeout 60;
ssl_certificate '/etc/nginx/conf.d/cert.pem’;
ssl_certificate_key '/etc/nginx/conf.d/cert.key’;
ssl_session_cache 'shared:SSL:10m’;
ssl_session_timeout ’10m’;
index index.php index.html;
try_files $uri $uri/ /index.php$is_args$args;
etag off;
include conf.d/*.locations;
}

あとは公式の通りにphp.locationsを加えます。

location ~ [^/]\.php$ {
#error_log /dev/null;
fastcgi_connect_timeout 300s;
fastcgi_read_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_buffer_size 32k;
fastcgi_buffers 4 32k;
fastcgi_busy_buffers_size 32k;
fastcgi_temp_file_write_size 32k;
# client_header_timeout 10s;
client_body_timeout 10s;
send_timeout 60s; # default, increase if experiencing a lot of timeouts.
output_buffers 1 32k;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param HTTP_PROXY “"; # Mitigate https://httpoxy.org/ vulnerability.
fastcgi_pass unix:/var/run/php7-fpm.sock;
}

client_header_timeout 10s;はエラーが出たのでアンコメントしました。
ここで/www/index.php

<?php
phpinfo();
?>

を表示させるとPHP v7.4.9の情報が並びますのでモジュールの状態を確認してみると
cgi-fcgi,core,date,hash,libxml,pcre,posix,Reflection,SPL,standard,zlibとなっていました。
hashがすでに入っているのでphp7-mod-hashがなくなっているようです。
またデフォルトではPHP-FPMの実行ユーザーがnobodyとなっていました。
openwrtはデフォルトではwww-dataグループがあるのに、よくあるwww-dataユーザーがありません。

OpenWrt

Posted by taroumaru