質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

3669閲覧

ローカルIPからだと高負荷に耐えられるPHPが、グローバルIPからではエラーを吐く

tajix_japan

総合スコア132

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2018/07/06 23:06

編集2018/07/07 05:36

症状は下記のとおりです。

ローカルIPからアクセスすると高負荷に耐えられるPHPが、グローバルIPからのアクセスに対しては(104: Connection reset by peer) または(110: Connection timed out)になってしまいます。

環境は下記のとおりです。
サーバー CenOS7.5
WEBサーバー nginx 1.14
https認証 Lets Encrypt

【1 サーバーの構築環境】

【1】
正規のドキュメント
192.168.1.100
ドキュメント設置先 /home/example/index.php
サーバーアクセス
https://example.com/index.php

【2】
テストドキュメント(正規ドキュメントの場所を見に行くローカルIP)
192.168.1.150
ドキュメント設置先 /home/example/index.php
サーバーアクセス
https://192.168.1.150/index.php

【2 テストしたこと】

1 上記を設定し、まずはテスト環境でApache Jmeter を使いテストしました。
https://192.168.1.150/index.php に高負荷(30秒間に960アクセス)をかけたところ、問題なく表示されました。 エラーも出ていません。
PHPおよび PHP-fpm、nginxの設定は問題ないと解釈しました。

【3 実戦設置】

2のテストで問題なかったため、正規のドキュメントルートで公開しました。

結果

recv() failed (104: Connection reset by peer) while reading response header from upstream
または
upstream timed out (110: Connection timed out) while connecting to upstream
のエラーが連発し、
https://example.com/index.php
はおろか
テスト環境では、高負荷でも見れたはずの
https://192.168.1.150/index.php
すら見れなくなりました。

エラーが出るのは
nginx_log/error.log
のみであり

php-fpm/error.log
php-fpm/www-error.log
にはエラーは出ません。

一方、同時に設置しているhtmlは問題なく見れます。
https://example.com/test.html
https://192.168.1.150/test.html

グローバルIPからのアクセスはせいぜい秒間数アクセスであり、テスト環境よりはるかに低負荷のものです。
また、PHPがエラーを吐くこと、htmlは見れることから、すくなくともサーバーまでのアクセスは到達しているようです。

ローカルIPからだと高負荷に耐えられるPHPが、グローバルIPからの接続ではエラーを吐くということです。

https認証のLets Encryptは何度も設置しており、どんな高負荷でも今までこのようなことはありませんでした。

何が問題かわかりますでしょうか?

よろしくお願いいたします。

追記します。

このトラブルになって2週間経過しており、
110エラー 104エラーでググって出てくることは全て試し、その結果はnginx やPHPの設定に反映させています。
phpそのものも、ローカルで接続したリバースプロキシサーバー(192.168.1.160)の内容を表示するというもので、ありきたりのソースです。下記のようなものでリバースプロキシサーバーの内容を表示しています。リバースプロキシサーバーは同一サーバー内に設定してており、この接続に問題はありません。

<?php date_default_timezone_set('Asia/Tokyo'); ?> <?php require_once("./phpQuery/phpQuery-onefile.php"); $sv=htmlspecialchars($_GET['s'], ENT_QUOTES, "UTF-8"); ?> <?php $html_upper = file_get_contents('http://192.168.1.160/1h/proxy1h_title_get.php?sv='.$sv.''); $doc_upper = phpQuery::newDocument($html_upper); ?>

タイトルGET部分

<?php $titlename = $doc["#under_title"]->text(); $titlename_trim= trim($titlename); echo $titlename_trim; ?>

以下、コンテンツ内容のGETも同様

よろしくお願いいたします。

追伸です。
(上記ソースがローカルIPを拾ってくることに対して追伸)

File get contentsだけだとローカルサーバーの内容は表示されませんが、今回はphpQuery-onefile.phpを使い、
ローカル内でスクレイピンクし、その結果を表示するものです。

PHPソースそのものは1年運用済みのもので、いまこの瞬間も問題なくグローバルに対して表示しています。

今回、アクセス過多のためCPU、メモリ、SSDを強化したサーバーを投入したいと考えています。
CentOS6から7に変えた以外は全て設定は従来問題なく使用できていたものに準じています。
リバースプロキシにローカルIPでアクセスすることそのものが原因ではないと思っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coco_bauer

2018/07/07 01:59

「グローバルIPからのアクセス」をして、成功することはあるのですか? それとも、毎回エラーですか?
tajix_japan

2018/07/07 02:24

ありがとうございます。PHPに関しては成功はありません。HTMLは成功します。
coco_bauer

2018/07/07 05:21

一般論として、グローバルIPのマシンから、プライベートアドレス(192.168.*.*)にアクセスすることはできません。何故なら、世界中に同じプライベートアドレスを持つマシンが多数存在しているからです。 グローバルIPのマシンから、質問にある192.168.1.150や192.168.1.100への通信の経路と中継する装置や中継するソフトの設定などを明らかにしてください。
tajix_japan

2018/07/07 05:28

ありがとうございます。確かに単にFile get contentsだけだとローカルサーバーの内容は表示されませんが、今回はphpQuery-onefile.phpを使い、ローカル内でスクレイピンクし、その結果を表示するものです。PHPソースそのものは1年運用済みのものです。今回、アクセス過多のためCPU、メモリ、SSDを強化したサーバーを投入しました。CentOS6から7に変えた以外は全て設定は従来問題なく使用できていたものに準じています。リバースプロキシにローカルIPでアクセスすることそのものが原因ではないと思っています。
tajix_japan

2018/07/12 13:29

大変遅くなりました。 結論から言うと、原因がわかりませんでした。 今回の目的はサーバー増強であり、CPU、メモリの増強はもちろんですが、読み込み速度の向上を 目的にSATA SSD→NVMe SSDに変更するというのが最大の目的でした。 NVMeの場合、SATAからのコピーができないこと、CentOS6のカーネルがNVMeを認識しないこと から、新たにCent OS7をインストールし、それ以外は従来の設定と同じにしたのですがこのエラーが 出てしまいました。 既に3週間を費やしており、これ以上の時間を無駄にできないため、CentOS6サーバーのコピー サイトを拡張し、ロードバランサーで繋ぐことで読み込み速度を維持するようにしたいと思います。 NVMe SSD が思ったほど体感読み込み速度が向上しなかったことも、SATAで十分と思う原因と なりました。 お騒がせしました。お時間をお取りいただき、ありがとうございました。
guest

回答2

0

過去ログを最初のエラーメッセージで検索するとnginxのエラーログで recv() failed (104: Connection reset by peer) が見つかります。これでなかったら、2つ目のエラーメッセージでググってみては?

差支えない範囲で現象を再現できる最低限のコードを提示した方が解決は早そうです。

投稿2018/07/06 23:40

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tajix_japan

2018/07/07 04:50

ありがとうございます。 このトラブルになって2週間経過しており、 110エラー 104エラーでググって出てくることは全て試し、その結果はnginx やPHPの設定に反映させています。 phpそのものも、ローカルで接続したリバースプロキシサーバー(192.168.1.160)の内容を表示するというもので、ありきたりのソースです。下記のようなものでリバースプロキシサーバーの内容を表示しています。リバースプロキシサーバーは同一サーバー内に設定してており、この接続に問題はありません。 <?php date_default_timezone_set('Asia/Tokyo'); ?> <?php require_once("./phpQuery/phpQuery-onefile.php"); $sv=htmlspecialchars($_GET['s'], ENT_QUOTES, "UTF-8"); ?> <?php $html_upper = file_get_contents('http://192.168.1.160/1h/proxy1h_title_get.php?sv='.$sv.''); $doc_upper = phpQuery::newDocument($html_upper); ?> タイトルGET部分 <?php $titlename = $doc["#under_title"]->text(); $titlename_trim= trim($titlename); echo $titlename_trim; ?> 以下、コンテンツ内容のGETも同様 よろしくお願いいたします。
Orlofsky

2018/07/07 04:55

このコメントまで読んでくれる人は少ないので、質問に追記してください。
tajix_japan

2018/07/07 05:02

ありがとうございます。追記しました。
tajix_japan

2018/07/12 13:29

大変遅くなりました。 結論から言うと、原因がわかりませんでした。 今回の目的はサーバー増強であり、CPU、メモリの増強はもちろんですが、読み込み速度の向上を 目的にSATA SSD→NVMe SSDに変更するというのが最大の目的でした。 NVMeの場合、SATAからのコピーができないこと、CentOS6のカーネルがNVMeを認識しないこと から、新たにCent OS7をインストールし、それ以外は従来の設定と同じにしたのですがこのエラーが 出てしまいました。 既に3週間を費やしており、これ以上の時間を無駄にできないため、CentOS6サーバーのコピー サイトを拡張し、ロードバランサーで繋ぐことで読み込み速度を維持するようにしたいと思います。 NVMe SSD が思ったほど体感読み込み速度が向上しなかったことも、SATAで十分と思う原因と なりました。 お騒がせしました。お時間をお取りいただき、ありがとうございました。
guest

0

ベストアンサー

ローカルマシンでは問題がないものの、インターネットを経由するとアクセスに問題が出る。というのなら通信経路(ネットワーク)に何か問題があるのかもしれませんね。

とはいえ、PHPに問題があったり、nginxの設定や、OSの設定に問題がある可能性もあります。

以下のような切り分けができると思うので、試してみると良いかと思います。

  1. PHPの問題かどうかを確かめるために、nginxにhtmlファイルを配置して、そこに高負荷でアクセスしてみる。

1 同じエラーがでたら、PHPの問題ではない。
2 同じエラーがでなかったら、PHPの問題である可能性が高い
2. nginxで設定を変更した箇所に問題があるか切り分けるために、nginxを可能な限りデフォルトの設定に戻して、そこに高負荷でアクセスしてみる。
1 同じエラーがでたら、nginxの設定で変更した箇所が影響している可能性が高い
2 同じエラーがでなかったら、nginxのチューニングが足りないか、OSやネットワークに問題があるか
3. SSLなしでhtmlに高負荷をかけてみる。
1 同じエラーがでたら、SSLが関係している可能性が高い
2 同じエラーがでなかったら、SSLは関係ない

この後に、別のサーバーで動かしてみたり、ローカルのVMで動かしてみる、などをして、切り分けを進めることができます。

切り分けが進むと、具体的なサーバーの設定を伝えなくても質問できるようになりますので、助けも求めやすくなるかと思います。

投稿2018/07/07 03:33

mtb_beta

総合スコア181

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tajix_japan

2018/07/07 04:53

ありがとうございます。 >nginxを可能な限りデフォルトの設定に戻して、そこに高負荷でアクセスしてみる。 これは気づきませんでした。たしかに1アクセスから問題が生じているためデフォルトから変化させたほうがいいですね。同様にphp-fpmも弄り倒していますのでここもチェックしてみます。 1は既に実施しており、問題ありませんでした。(htmlは表示されました) 2,3の方法を試してみます。またご報告させていただきます。 助かります!
tajix_japan

2018/07/12 13:28

大変遅くなりました。 結論から言うと、原因がわかりませんでした。 今回の目的はサーバー増強であり、CPU、メモリの増強はもちろんですが、読み込み速度の向上を 目的にSATA SSD→NVMe SSDに変更するというのが最大の目的でした。 NVMeの場合、SATAからのコピーができないこと、CentOS6のカーネルがNVMeを認識しないこと から、新たにCent OS7をインストールし、それ以外は従来の設定と同じにしたのですがこのエラーが 出てしまいました。 既に3週間を費やしており、これ以上の時間を無駄にできないため、CentOS6サーバーのコピー サイトを拡張し、ロードバランサーで繋ぐことで読み込み速度を維持するようにしたいと思います。 NVMe SSD が思ったほど体感読み込み速度が向上しなかったことも、SATAで十分と思う原因と なりました。 お騒がせしました。お時間をお取りいただき、ありがとうございました。
mtb_beta

2018/07/13 14:02

なるほど。 丁寧にありがとうございます。 お疲れ様でした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問