ワイヤード・パンチ

元・大阪人が、岡山の山奥でも生きていけることを証明するためのブログ。

nginx+php-fpm+wordpressで「502 Bad Gateway」と表示されてしまうエラーの対処法。

当ブログで使われているwordpressも、同じサーバに設置しているマストドンも、おとといまではapacheで動作させていました。

しかし、マストドンで推奨されているのはnginxであり、そのついでにwordpressもnginxで動かす方が早いらしいので、昨日乗り換えました。

それで本当に早くなったかはよくわからないのですが、乗り換えの際にwordpressでつまづいた箇所をメモしておきます。

広告

必要なファイルの作成。

今回はCentOS7で実行しています。

基本的にapacheからnginxへの乗り換えは、apacheを停止させて、nginx用に合わせたconfファイルを追加したのちに、nginxを起動するだけで完了するはずです。

でも今回は、そうはいかなかったのです。

WordPress – Nginx Configuration File (with SSL) –> https://github.com/LeCoupa/awesome-cheatsheets · GitHub

まず、wordpress用のnginxファイルは、上記サイトに記載されているコードをコピーし、「/etc/nginx/conf.d/wordpress.conf」として保存しました。

ただ、nginxでwordpressを動かす場合は、新たにphp-fpmというものもインストールする必要がありました。

記サイトのコードの場合は、今では古いバージョン5だったので、最新バージョンをインストールし、コード内にあるsockファイルの名前も変えました。

# wordpress.conf

#fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_pass unix:/var/run/php-fpm.sock;

続けて、php-fpmのためのファイルも作成する必要があります。パスは「/etc/php-fpm.d/www.conf」です。

EC2にnginx+php(php-fpm socket)環境を最速で構築 – Qiita

上記サイトなどを参考に、下記の箇所を変更しました。あとはデフォルトのままです。

; www.conf

;user = apache
user = nginx

;group = apache
group = nginx

;listen = 127.0.0.1:9000
listen = /var/run/php-fpm/php-fpm.sock

;listen.owner = nobody
;listen.group = nobody
listen.owner = nginx
listen.group = nginx

sockが作成されない。

上記のファイルを作成したあとは、「systemctl restart nginx」「systemctl restart php-fpm」コマンドを実行して、wordpressを開きます。

しかし、実際に開いてみても、「502 Bad Gateway」と書かれたエラーページが表示されてしまいました。

いったい何が起きているのかと、wordpress.confのerror_logという項目で指定した、エラーログを開いてみます。

error_log /var/log/nginx/wiredpunch.com.log crit;

すると、下記のようなメッセージがいくつもありました。

2017/12/08 13:38:27 [crit] 6768#6768: *35 connect() to unix:/var/run/php-fpm/php-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 106.xxx.xxx.xxx, server: wiredpunch.com, request: "GET /favicon.ico HTTP/2.0", upstream: "fastcgi://unix:/var/run/php-fpm/php-fpm.sock:", host: "wiredpunch.com", referrer: "https://wiredpunch.com/xxxxxxxx/"

メッセージから察するに、php-fpm.sockが存在していないように思われます。

wordpress.confやwww.confで、そのとおりsockファイルのパスを指定しましたが、実際にフォルダを開いてみても、本当に何もありませんでした。

restartしたときに作成されるはずなのですが、なぜ作成されていないのでしょうか。

そこで思いつく理由として、よくあるのは所有者の設定が正しくないこと。

FTPからphp-fpmフォルダのプロパティを開いてみると、フォルダの所有者がnginxになっていませんでした

他の所有者になっていたため、作成に失敗したのだと思われます。

「etc/passwd」ファイルを開いて、nginxのユーザとグループIDを確認し、先程のフォルダの権限を変更します。

それから再起動することで、ようやくsockファイルが作成されましたが、サイズはなぜか0バイト、しかも502エラーは直りません。

sockファイルが0バイト?

sockフォルダへアクセスは可能になったものの、作成されたファイルは0バイト。

もしかして作成の際にエラーが発生したのでしょうか?

今度はphp-fpmのログファイルを見てみます。ログの場所は「/var/log/php-fpm/error.log」となります。

すると、下記のようなメッセージが延々と続いていました。

[08-Dec-2017 20:22:33] NOTICE: Terminating ...
[08-Dec-2017 20:22:33] NOTICE: exiting, bye-bye!
[08-Dec-2017 20:22:53] NOTICE: fpm is running, pid 879
[08-Dec-2017 20:22:53] NOTICE: ready to handle connections
[08-Dec-2017 20:22:53] NOTICE: systemd monitor interval set to 10000ms

上2行はrestartの処理のうち、終了時に付けられたものなので正常として、下3行はおそらく起動時。

しかし、これではエラーが起きているように見えません。

次に、www.confの下記のコメントアウトを外して、もう一度restartします。

; www.conf

;catch_workers_output = yes
catch_workers_output = yes

すると、今度はエラーログに以下が追加されていました。

[08-Dec-2017 12:17:15] WARNING: [pool www] child 4591 said into stderr: "ERROR: Unable to set php_value 'soap.wsdl_cache_dir'"

どうやら、php-soapというものをインストールしてなかったのが原因でしょうか。

上記をインストール後、またrestartをしてみます。すると、上記のメッセージは出なくなりましたが、sockは相変わらず0バイトのままですし、502エラーもそのまま

足りない記述があった。

必要なものをインストールしたし、権限も直した。それなのに502エラーが直らない。

もうお手上げかと思ったのですが、また別のサイトを参考に、手順を再確認してみました。

すると複数のサイトにて、初めにwordpress.confを作成するときには無かった記述が追加されているのを確認。

それを追加して、またrestartしてみました。

# (中略)

location ~ \.php$ {
	fastcgi_split_path_info ^(.+\.php)(/.+)$;
	fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
	fastcgi_index index.php;
	fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #この行を追加
	include fastcgi_params;
}

すると、ようやく502エラーは出なくなり、正常にwordpressを開くことができました。

この作業に何時間も費やしてしまったため、昨日はその間だけ当サイトが開けない状態でした。

もしご訪問しようとしていた方がいらっしゃったら、すみませんでした。現在はこのとおり、正常にご覧になれます。

ところで、sockファイルが0バイトだった件ですが、それで問題ないようです。

sockファイルを読みに行くという処理ができてなかったんですかね。

余談。

nginxの正しい読み方は「エンジンエックス」らしいですが、ちょっと無理やりすぎませんかね…。

「エ」で始まるんなら、初めは「e」じゃないと…。

nvidiaだって読み方は「エヌビディア」ですし、nginxはどうしても「エヌジンクス」って読んでしまいます。

後者の方が短いし。