本当にあったエンジニア的に怖い話 ~ HTTP Status Code 0 と curl: (35) SSL connect error
- 2017 11/15
WordPress (Nginx + PHP-FPM) なサイトで Admin ページで Bad Gateway を頻発させていました。
Nginx のエラーログ
tail -F /var/log/nginx/codenote.net/error.log [error] 3029#0: *12410 connect() to unix:/var/run/php-fpm/www.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 185.11.147.17, server: codenote.net, request: "POST /xmlrpc.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm/www.sock:", host: "codenote.net"
PHP-FPM のエラーログ
tail -F /var/log/php-fpm/error.log WARNING: [pool www] server reached pm.max_children setting (30), consider raising it
エラーログに書いてあるように pm.max_children の設定値の上限に達しているので設定値を上げて解決させましょう。
# vim /etc/php-fpm.d/www.conf # 30 で上限に達していたので適当に 50 に上げてみましょう pm.max_children = 50 |
設定変更した後、PHP-FPM を reload して設定を反映させます。
service php-fpm reload |
再度 tail -F /var/log/php-fpm/error.log でエラーログを監視して WARNING メッセージが表示されなくなったら解決できたと思います。
まだ WARNING メッセージが表示されていたら、更に pm.max_children を 60, 70 と上げていってメッセージが出力されなくなるまで調整しましょう。
Nginx + PHP-FPM 構成で、502 bad gateway が頻発する問題が発生しました。
エラーログ
2013/09/15 19:02:06 [error] 2281#0: *23 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 125.1.92.146, server: codenote.net, request: “GET /php/1322.html HTTP/1.1”, upstream: “fastcgi://unix:/var/run/php-fpm/www.sock:”, host: “codenote.net”
request_terminate_timeout が短すぎるのが原因だったので、120秒に変更することで解決しました。
# vim /etc/php-fpm.d/www.conf
request_terminate_timeout = 120s |
Mac に PHP5.4 を Homebrew でインストールしたのでメモ。
デフォルトでは、PHPのFormulaは無いので、homebrew-phpを使ってインストールします。
brew tap homebrew/dupes brew tap josegonzalez/homebrew-php |
PHP5.4 のインストールオプションを確認します。
% brew options php54 --32-bit Build 32-bit only. --homebrew-apxs Build against apxs in Homebrew prefix --with-cgi Enable building of the CGI executable (implies --without-apache) --with-debug Compile with debugging symbols --with-fpm Enable building of the fpm SAPI executable (implies --without-apache) --with-gmp Build with gmp support --with-homebrew-openssl Include OpenSSL support via Homebrew --with-imap Include IMAP extension --with-intl Include internationalization support --with-libmysql Include (old-style) libmysql support --with-mssql Include MSSQL-DB support --with-pgsql Include PostgreSQL support --with-thread-safety Build with thread safety --with-tidy Include Tidy support --with-unixodbc Build with unixodbc support --without-apache Build without shared Apache 2.0 Handler module --without-bz2 Build without bz2 support --without-mysql Remove MySQL/MariaDB support --without-pear Build without PEAR |
% brew install php54 \ > --with-fpm \ > --with-homebrew-openssl \ > --with-intl \ > --with-pgsql ... ==> make install ==> /usr/local/Cellar/php54/5.4.16/bin/pear config-set php_ini /usr/local/etc/php/5.4/php.ini ==> Caveats The php.ini file can be found in: /usr/local/etc/php/5.4/php.ini ✩✩✩✩ PEAR ✩✩✩✩ If PEAR complains about permissions, 'fix' the default PEAR permissions and config: chmod -R ug+w /usr/local/Cellar/php54/5.4.16/lib/php pear config-set php_ini /usr/local/etc/php/5.4/php.ini ✩✩✩✩ Extensions ✩✩✩✩ If you are having issues with custom extension compiling, ensure that this php is in your PATH: PATH="$(brew --prefix josegonzalez/php/php54)/bin:$PATH" PHP54 Extensions will always be compiled against this PHP. Please install them using --without-homebrew-php to enable compiling against system PHP. ✩✩✩✩✩ INTL Support ✩✩✩✩✩ icu4c is broken as of mxcl/homebrew#03ed757c, so you will need to install intl as a separate extension: brew install php54-intl ✩✩✩✩ FPM ✩✩✩✩ To launch php-fpm on startup: * If this is your first install: mkdir -p ~/Library/LaunchAgents cp /usr/local/Cellar/php54/5.4.16/homebrew-php.josegonzalez.php54.plist ~/Library/LaunchAgents/ launchctl load -w ~/Library/LaunchAgents/homebrew-php.josegonzalez.php54.plist * If this is an upgrade and you already have the homebrew-php.josegonzalez.php54.plist loaded: launchctl unload -w ~/Library/LaunchAgents/homebrew-php.josegonzalez.php54.plist cp /usr/local/Cellar/php54/5.4.16/homebrew-php.josegonzalez.php54.plist ~/Library/LaunchAgents/ launchctl load -w ~/Library/LaunchAgents/homebrew-php.josegonzalez.php54.plist The control script is located at /usr/local/Cellar/php54/5.4.16/sbin/php54-fpm Mountain Lion comes with php-fpm pre-installed, to ensure you are using the brew version you need to make sure /usr/local/sbin is before /usr/sbin in your PATH: PATH="/usr/local/sbin:$PATH" You may also need to edit the plist to use the correct "UserName". Please note that the plist was called 'org.php-fpm.plist' in old versions of this formula. To have launchd start php54 at login: ln -sfv /usr/local/opt/php54/*.plist ~/Library/LaunchAgents Then to load php54 now: launchctl load ~/Library/LaunchAgents/homebrew.mxcl.php54.plist Warning: /usr/local/sbin is not in your PATH You can amend this by altering your ~/.bashrc file ==> Summary /usr/local/Cellar/php54/5.4.16: 490 files, 38M, built in 5.1 minutes |
Pear の設定
% chmod -R ug+w /usr/local/Cellar/php54/5.4.16/lib/php % pear config-set php_ini /usr/local/etc/php/5.4/php.ini config-set succeeded |
php54-intl のインストール
% brew install php54-intl |
PHP で、./configure へ指定したオプションを確認する方法をメモ。
./configure した、ソースファイルのディレクトリへ移動して、config.nice ファイルの中身を確認します。
cat config.nice |
2つ目は、phpinfo を確認する方法です。
php -i | grep './configure' |
Apache + PHP4 + PostgreSQL で下記のようなエラーが出た場合の解決方法をメモ。
libphp4.so で使う libpq.so.2.1 が無いというエラーです。
# /etc/init.d/httpd configtest Syntax error on line 941 of /etc/httpd/conf/httpd.conf: Cannot load /etc/httpd/modules/libphp4.so into server: libpq.so.2.1: cannot open shared object file: No such file or directory |
libphp4.so のダイナミックリンクの関係を表示して確認すると、libpq.so.2.1 => not found となっていることが確認できます。
# ldd /etc/httpd/modules/libphp4.so libpam.so.0 => /lib/libpam.so.0 (0x40177000) libdl.so.2 => /lib/libdl.so.2 (0x40180000) libpq.so.2.1 => not found libcrypt.so.1 => /lib/libcrypt.so.1 (0x40184000) libresolv.so.2 => /lib/libresolv.so.2 (0x401b2000) libm.so.6 => /lib/libm.so.6 (0x401c4000) libnsl.so.1 => /lib/libnsl.so.1 (0x401e6000) libc.so.6 => /lib/libc.so.6 (0x401fd000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000) |
# find / -name libpq.so.2.1 /usr/local/src/postgresql-7.0.3/src/interfaces/libpq/libpq.so.2.1 /usr/local/pgsql/lib/libpq.so.2.1 |
postgres 以下にある libpq.so.2.1 を /lib 以下にシンボリックリンクを貼ります。
# ln -s /usr/local/pgsql/lib/libpq.so.2.1 /lib/libpq.so.2.1 |
ちゃんと libpq.so.2.1 が読み込めていることを確認できました。
# ldd /etc/httpd/modules/libphp4.so libpam.so.0 => /lib/libpam.so.0 (0x40177000) libdl.so.2 => /lib/libdl.so.2 (0x40180000) libpq.so.2.1 => /lib/libpq.so.2.1 (0x40184000) libcrypt.so.1 => /lib/libcrypt.so.1 (0x40196000) libresolv.so.2 => /lib/libresolv.so.2 (0x401c4000) libm.so.6 => /lib/libm.so.6 (0x401d6000) libnsl.so.1 => /lib/libnsl.so.1 (0x401f8000) libc.so.6 => /lib/libc.so.6 (0x4020f000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000) |
# vi /etc/httpd/conf/httpd.conf #LoadModule php4_module lib/apache/libphp4.so LoadModule php4_module /usr/lib/apache/libphp4.so |
[参考]:2日目突入ちぅ – やちまうの戯言
PHP4 をソースコードから再インストールする際に、make でエラーが出たので解決方法をメモ。
一度、make install してから、./configure のオプションを変更して、再インストールしたい。
# ./configure # make # make install |
# ./configure # make ... stub.lo: file not recognized: File truncated collect2: ld returned 1 exit status make[1]: *** [libphp4.la] エラー 1 make[1]: 出ます ディレクトリ `/usr/local/src/php-4.0.6' make: *** [all-recursive] エラー 1 |
上記のようなエラーが出た場合、make clean すればOK
# make clean # make # make install |
PHPでExcelを操作できるライブラリ「Excel_Reviser」の使うために参考になったサイトをメモ。
Excel_Reviser は PHP4 でも使えるのです。レガシー!
PHP にて「Warning: require_once(): Unable to allocate memory for pool.」とエラーログに出力されているのを見つけました。
APCのバグらしい。
・PHP :: Bug #58982 :: apc produces tons of warnings “Unable to allocate memory for pool.”
/etc/php.d/apc.ini の設定を変更して対応しました。
apc.mmap_file_mask=/tmp/apc.XXXXX |
↓(変更)
apc.mmap_file_mask=/dev/zero |
apc.mmap_file_mask string
–enable-mmap を用いて MMAP サポートつきでコンパイルされている場合、ここで mktemp 形式のファイルマスクを指定します。mmap モジュールは、 mmap されたメモリ領域をファイルに置くか共有メモリに置くかを、 これによって判断します。 ファイルベースの mmap を使用するには、この値を /tmp/apc.XXXXXX (正確に 6 つの X)のように指定します。 POSIX 形式の shm_open/mmap を使用するには、.shm をマスクのどこかで指定します。例: /apc.shm.XXXXXX 。 また、/dev/zero を指定することで、カーネルの /dev/zero インターフェイスを使用した anonymous mmap を使用することもできます。未定義の場合は、この方式が用いられます。
[引用元]:PHP: 実行時設定 – Manual
PHP で、EUC-JP から UTF-8 への機種依存文字の文字コード変換する方法をメモ。
mb_convert_encoding(mb_convert_encoding($value,"sjis-win","EUC-JP"),"UTF-8","sjis-win") |
EUC-JP から sjis-win へ変換後、sjis-win から UTF-8 へ変換することで、機種依存文字も含めて正常に文字コード変換できるみたいです。
・PHPで、いわゆる機種依存文字の文字コード変換(EUC-JP→UTF-8)にはまる - エンジニアが作る最新ITブログ by DODA