NginxでWordPressなどをSSLに対応した



|[../](https://qiita.com/taconana/items/d382d08a83a2a67f3b6a) |
|---|

CentOS Stream 8にPHP7.4を入れ、Nginxで動作させた。そしてWordPress6.0も入れ、試してみている。80ポートで動作することは確認済みである。これらをSSLに対応し、443ポートでアクセスできるようにしてみた。

SSLの鍵は「[CentOS8.2でSSL証明書（Let's Encrypt）をセットアップする手順](https://qiita.com/taconana/items/a9e197e80b8c20c7d5ac)」で取得したものが使える。作業は、nginx.confなどを適切に記述して、再起動するだけである。
```
$ ls -lag /etc/nginx
drwxr-xr-x 2 root root 4096 2022-06-23 16:30 conf.d
-rw-r--r-- 1 root root 1077 2021-12-22 04:43 fastcgi.conf
-rw-r--r-- 1 root root 1007 2021-12-22 04:43 fastcgi_params
-rw-r--r-- 1 root root  910 2022-06-24 10:21 nginx-443.conf       // 新規
-rw-r--r-- 1 root root  476 2022-06-24 10:20 nginx-80.conf        // 新規
-rw-r--r-- 1 root root  530 2022-06-24 10:24 nginx-location.conf  // 新規
-rw-r--r-- 1 root root 1225 2022-06-24 10:13 nginx.conf           // 編集
```
nginx.confは、以下のように書いた。変更した部分のみを示しておく。
- ユーザーはApacheと連携したいので`www`に変更しておく。「[NginxとApacheの競合を避けて、wwwユーザに統一した](https://qiita.com/taconana/items/2b07ffaadfb024add81b)」を参照のこと
- httpディレクティブ内のserver記述を、nginx-80.confとnginx-443.confに分離している
```
$ vi /etc/nginx/nginx.conf

$ user nginx;
user www;
...
http {
	...
    include /etc/nginx/nginx-80.conf;
    include /etc/nginx/nginx-443.conf;
}
```
nginx-80.confは、以下の感じ。
- 443をdefault_serverにしたいので、80からは外しておく
- locationディレクティブは、共通化のためnginx-location.confにまとめておく
```
$ vi /etc/nginx/nginx-80.conf

    server {

#       listen       80 default_server;
        listen       80;
#       listen       [::]:80 default_server;
        listen       [::]:80;
#       server_name  _;
        server_name  kankeri.com www.kankeri.com;
#       root         /usr/share/nginx/html;
        root         /opt/php74/webapps;

        include /etc/nginx/default.d/*.conf;
        include /etc/nginx/nginx-location.conf;
    }
```
nginx-443.confは、以下の感じ。
- 443をdefault_serverにしておく
- SSLの鍵は「[CentOS8.2でSSL証明書（Let's Encrypt）をセットアップする手順](https://qiita.com/taconana/items/a9e197e80b8c20c7d5ac)」で取得したものを使う
- locationディレクティブは、共通化のためnginx-location.confにまとめておく
```
$ vi /etc/nginx/nginx-443.conf

    server {
        
        listen       443 ssl http2 default_server;
        listen       [::]:443 ssl http2 default_server;
#       server_name  _;
        server_name  kankeri.com www.kankeri.com;
#       root         /usr/share/nginx/html;
        root         /opt/php74/webapps;

#       ssl_certificate "/etc/pki/nginx/server.crt";
        ssl_certificate "/etc/letsencrypt/live/kankeri.com/fullchain.pem";
#       ssl_certificate_key "/etc/pki/nginx/private/server.key";
        ssl_certificate_key "/etc/letsencrypt/live/kankeri.com/privkey.pem";
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
        ssl_ciphers PROFILE=SYSTEM;
        ssl_prefer_server_ciphers on;

        include /etc/nginx/default.d/*.conf;
        include /etc/nginx/nginx-location.conf;
    }
```
nginx-location.confは、以下の感じ。
- オリジナルのnginx.confの記述をコピペして改変している
- .phpのとき、fastcgi(php-fpm)を呼び出す
```
$ vi /etc/nginx/nginx-location.conf

    index index.php index.html;
    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }
    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_script_name;
        include fastcgi_params;
    }
    location ~ /\. { deny all; }
    location ~* /wp-config.php { deny all; }
    location ~* /(?:uploads|files)/.*\.php$ { deny all; }
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires max;
        log_not_found off;
    }
    error_page 404 /404.html;
    location = /40x.html { }
    error_page 500 502 503 504 /50x.html;
    location = /50x.html { }

$ nginx -t
```
そもそも、php-fpm がよくわかっていなかったので、調べてみた。

- FPM：FastCGI Process Managerのこと。PHP用に php-fpm がある。
- FastCGI：プロセス初回実行時に該当プロセスを一定時間サーバー内に保持することで、次回以降、実行時の「プロセスの起動/終了」を省略し、 高速化や、プロセスの起動/終了に伴うCPUへの負荷を軽減する
- php-fpm：PHP用のFPM。単純なcgiだと、処理ごとにプロセスの生成と破棄を繰り返すため、オーバーヘッドが大きい。php-fpmだと、プロセスの使い回しができ、オーバーヘッドがなくなる。OPCacheも使える。

php-fpm 関連の設定を確認した。今回は特に触らない。既存の設定で十分だった。php-fpmとNginxを再起動する。

```
$ vi /etc/php-fpm.conf					// 特に触らず
$ vi /etc/php-fpm.d/www.conf			// 特に触らず
$ vi /etc/nginx/conf.d/php-fpm.conf 	// 特に触らず
upstream php-fpm {
   server unix:/run/php-fpm/www.sock;
}
$ ls -lag /run/php-fpm/
-rw-r--r-- 1 root root 7 2022-06-23 16:56 php-fpm.pid
srw-rw---- 1 www  www  0 2022-06-23 16:56 www.sock

$ systemctl restart php-fpm
$ systemctl restart nginx
```
|[../](https://qiita.com/taconana/items/d382d08a83a2a67f3b6a) |
|---|