nginx+php5-fpmで504や104のエラーが出たら・・・

504のエラーが出た場合

client—①—nginx—②—php5-fpm—③—mysql

504 gateway time-out 

上記の構成として、この場合、②においてnginx—>php5-fpmでphp5の処理が遅くnginxが切断してしまった。
という事なので、nginxのfastcgiのtimeout値を伸ばしてあげる必要があります。

例えば、以下のようなファイルを作成して、nginxを再起動します。

% sudo vi /etc/nginx/conf.d/fastcgi.conf
---
fastcgi_intercept_errors on;
fastcgi_ignore_client_abort off;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 300;     < --- ココ
fastcgi_read_timeout 300;      <--- ココ
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
---

% sudo /etc/init.d/nginx restart

※reloadでも良いかもしれません

104のエラーが出た場合

client---①---nginx---②---php5-fpm---③---mysql

recv() failed (104: Connection reset by peer) while reading response header from upstream, client:

において、php5が処理時間がかかってしまって、nginx—>php5-fpmにクエリは投げられたけど、nginx< —php5-fpmに返す際に、php5-fpmがコネクションを切っちゃったケース。

% sudo vi /etc/php5/fpm/pool.d/www.conf
---
;pm.process_idle_timeout = 10s;
   ↓
pm.process_idle_timeout = 30s;
---

% sudo vi /etc/php5/php.ini
---
max_execution_time = 30   ←  60などに増やす
---

% sudo /etc/init.d/php5-fpm restart



それでも改善しない場合は、phpの動作を確認します。
% sudo vi /etc/php5/fpm/pool.d/www.conf
---
;pm.status_path = /status
   ↓
pm.status_path = /status

;php_admin_value[error_log] = /var/log/fpm-php.www.log
   ↓
php_admin_value[error_log] = /var/log/fpm-php.www.log
---

% sudo /etc/init.d/php5-fpm restart

php5-fpmのプロセスが足りない場合
→ /etc/php5/fpm/pool.d/www.conf : pm.max_children = 5 や、pm.max_spare_servers = 3を増やす
※ pm = dynamicを確認

mysqlの接続数も増やす 5×3=15だったのを増やした分だけ接続できるように!

s sudo vi /etc/mysql/my.cnf
---
max_connections=128    < --- pm.max_children x pm.max_spare_servers以上にする
---

ここにイイカンジでまとまってました。

WordPressのSSL化(Nginx)

SSLの取得

無料で使えるSSLで、sslの証明書を取得しましょう!
やり方は、この方の記事が大変わかりやすいです。→ StartSSLの無料サーバー証明書を使う

概要

http:// でも https:// でもアクセスできるサイトにしようと思います。

  1. wp-config.phpの編集
  2. nginxの設定

設定する

  1. wp-config.phpの編集
    schemeによってhttpsにするか判断します。

    /** SSL setting */
    define('FORCE_SSL_ADMIN', true);
    if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
      $_SERVER['HTTPS']='on';
    
  2. nginxの設定
    wordpressが動作しているnginxの設定に、以下の様にx_forwarded_protoに $schemeをセットします。

    < 略>
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Remote-Addr $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    < 略>
    

    設定を反映します。

    % sudo /etc/init.d/nginx reload
    

無限リダイレクトループに陥ったら

GoogleでwordpressのSSL化で検索すると「設定」→「一般」→「WordPress アドレス (URL)」と「サイトアドレス (URL)」
のスキーマを http:// を https:// にするとありますが、これをやると、ページがループしてアクセスできなくなっちゃうことがあります。
こうなるともう、管理ページにすらログインできなくなっちゃうので、mysqlの以下のカラムの値を無理やり修正する必要が出てきます。

mysql -u USER -p PASS DBNAME
mysql> show databases;
mysql> connect YOUR-DATABASE-NAME
mysql> SELECT * FROM wp_options WHERE option_name = 'siteurl';
mysql> SELECT * FROM wp_options WHERE option_name = 'home';
mysql> begin;
mysql> UPDATE wp_options SET option_value='http://YOURDOMAIN' WHERE option_name = 'siteurl'
mysql> UPDATE wp_options SET option_value='http://YOURDOMAIN' WHERE option_name = 'home'
mysql> SELECT * FROM wp_options WHERE option_name = 'siteurl';
mysql> SELECT * FROM wp_options WHERE option_name = 'home';
mysql> commit;
mysql> \q

これでアクセスしたら治ります。。。

あと、プラグインも試しましたが、やはりループを起しましたとさ。ヽ(´ー`)ノ