コンテキスト:
私はnginxにかなり慣れていないので、これを段階的に機能させる方法を考えています。私はこれまでしばらくこの問題を回避してきましたが、実際には、不適切な動作(各ホスト間でヘッダーが渡されない、要求の本文が空であるなど)の結果として、いずれかのアプリの開発が妨げられています。
Php-fpmコンテナーに3つのアプリがあり、独自のコンテナーにnginxサーバーがあります。 nginxコンテナは、要求されたホスト名(基本的な仮想ホスト構成)に基づいてphp-fpmコンテナに要求を提供するための単一のアクセスポイントとして機能します。 try_files
を使用するとすべてが正常に機能しますが、proxy_pass
に切り替えると問題が発生します。
Nginxの構成は、リクエストが処理されることになっているコンテナに一致するようにserver_name
が変更されていることを除いて、各php-fpmホストでほぼ同じです。
私の研究リソースはページの下部にリンクされています。
問題:
これは私が混乱しているところです。 proxy_pass
の設定に応じて、nginxログに表示されるエラーが変わります。 proxy_pass
を使用する状況下では、リクエストは実際には正常に完了しません。さまざまな設定とそれに関連するエラーは次のとおりです。
設定:
proxy_pass http://appX/; # upstream name
エラー:
nginx | 2018/05/08 22:19:48 [error] 10224#10224: *8442 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 172.18.0.1, server: appX.local, request: "GET / HTTP/1.1", upstream: "http://172.18.0.3:9000/", Host: "appX.local"
nginx | 172.18.0.1 - - [08/May/2018:22:19:48 +0000] "GET / HTTP/1.1" 502 568 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"
設定:
proxy_pass https://appX/; # upstream name
エラー:
nginx | 172.18.0.1 - - [08/May/2018:22:20:50 +0000] "GET / HTTP/1.1" 502 568 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"
nginx | 2018/05/08 22:20:50 [error] 13589#13589: *8446 peer closed connection in SSL handshake (104: Connection reset by peer) while SSL handshaking to upstream, client: 172.18.0.1, server: appX.local, request: "GET / HTTP/1.1", upstream: "https://172.18.0.3:9000/", Host: "appX.local"
設定:
proxy_pass http://appX.local/; # hostname
エラー(何度もループします(論理的には、httpsへのリダイレクトに基づきます):
nginx | 172.18.0.6 - - [08/May/2018:22:21:49 +0000] "GET / HTTP/1.0" 301 185 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "172.18.0.1"
設定:
proxy_pass https://appX.local/; # hostname
エラー(何度もループしますが、理由はわかりません):
nginx | 172.18.0.1 - - [08/May/2018:22:23:35 +0000] "GET / HTTP/1.1" 500 588 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"
設定:
proxy_pass https://appX:9000/;
エラー:
nginx | 2018/05/08 22:29:26 [error] 14426#14426: *9563 connect() failed (111: Connection refused) while connecting to upstream, client: 172.18.0.1, server: appX.local, request: "GET / HTTP/1.1", upstream: "https://172.18.0.6:9000/", Host: "appX.local"
nginx | 172.18.0.1 - - [08/May/2018:22:29:26 +0000] "GET / HTTP/1.1" 502 568 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"
設定:
proxy_pass https://appX.local:9000/;
エラー:
nginx | 2018/05/08 22:27:39 [error] 14426#14426: *9559 connect() failed (111: Connection refused) while connecting to upstream, client: 172.18.0.1, server: appX.local, request: "GET / HTTP/1.1", upstream: "https://172.18.0.6:9000/", Host: "appX.local"
nginx | 172.18.0.1 - - [08/May/2018:22:27:39 +0000] "GET / HTTP/1.1" 502 568 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36" "-"
試みた救済策:
proxy_pass
だけで試しましたtry_files $uri $uri/ /index.php?$args
で機能しますが、プロキシをバイパスします。構成:
ホスト名は私のホストの/etc/hostname
ファイルにあり、すべて期待どおりに応答します。
nginx.conf
worker_processes 1;
daemon off;
events {
worker_connections 1024;
}
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
http {
default_type application/octet-stream;
include /etc/nginx/conf/mime.types;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
}
/etc/nginx/conf.d/appX.conf:
upstream appX {
server appX:9000;
}
server {
listen 80;
listen [::]:80;
server_name appX.local appX;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_tokens off;
ssl on;
ssl_certificate /etc/nginx/certs/appX.crt;
ssl_certificate_key /etc/nginx/certs/appX.key;
ssl_dhparam /etc/nginx/certs/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
server_name appX.local appX;
root /var/www/appX;
index index.php index.html;
location / {
proxy_read_timeout 90;
proxy_connect_timeout 90;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header Host $Host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header Authorization $http_authorization;
proxy_pass_header Authorization;
proxy_next_upstream error timeout invalid_header;
proxy_hide_header X-Powered-By;
proxy_hide_header X-Pingback;
proxy_hide_header Link;
proxy_cache_bypass $http_pragma $http_authorization;
proxy_ssl_session_reuse off;
proxy_ssl_server_name on;
proxy_pass https://appX;
}
}
docker-compose.yml
version: '3.3'
services:
nginx:
image: evild/Alpine-nginx:1.9.15-openssl
container_name: apps_nginx
volumes:
- ./app-one:/var/www/app-one/:ro
- ./app-two:/var/www/app-two/:ro
- ./app-three:/var/www/app-three/:ro
- ./nginx/conf/nginx.conf:/etc/nginx/conf/default.conf:ro
- ./nginx/conf.d:/etc/nginx/conf.d:ro
- ./certs:/etc/nginx/certs
ports:
- 80:80
- 443:443
expose:
- "80"
- "443"
depends_on:
- php-app-one
- php-app-two
environment:
TZ: "America/Los_Angeles"
networks:
default:
aliases:
- app-one.local
- app-two.local
php-app-one:
environment:
TZ: "America/Los_Angeles"
image: joebubna/php
container_name: apps_php_app-one
restart: always
volumes:
- ./app-one:/var/www/app-one
ports:
- 9001:9000
networks:
- default
php-app-two:
environment:
TZ: "America/Los_Angeles"
image: joebubna/php
container_name: apps_php_app-two
restart: always
volumes:
- ./app-two:/var/www/app-two
ports:
- 9000:9000
networks:
- default
php-app-three:
image: joebubna/php
container_name: apps_php_app-three
restart: always
volumes:
- ./app-three:/var/www/app-three
- ./fastcgi_params:/var/www/fastcgi_params
ports:
- 9002:9000
depends_on:
- db
environment:
WORDPRESS_DB_Host: db:3306
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: root
WORDPRESS_DB_NAME: app_three
TZ: "America/Los_Angeles"
networks:
- default
db:
image: mysql:5.6
container_name: apps_mysql
volumes:
- db-data:/var/lib/mysql
- ./mysql/my.cnf:/etc/mysql/conf.d/ZZ-apps.cnf:ro
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_DATABASE: cora
TZ: "America/Los_Angeles"
ports:
- 3306:3306
expose:
- "3306"
networks:
- default
volumes:
db-data:
networks:
default:
driver: bridge
どんな助けでも大歓迎です。私は今日これにかなりの時間を費やしました、そして私はすべての読書と試行錯誤で私が逃したものに関してかなりよく立ち往生しています。
研究リソース:
https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/
https://www.liaohuqiu.net/posts/nginx-proxy-pass/
https://Gist.github.com/soheilhy/8b94347ff8336d971ad
https://groups.google.com/forum/#!topic/xnat_discussion/-S6eYsnwrXg
https://stackoverflow.com/questions/37346560/nginx-server-closes-ssl-connection-for-some-clients
https://stackoverflow.com/questions/38375588/nginx-reverse-proxy-to-heroku-fails-ssl-handshake
https://stackoverflow.com/questions/40580617/nginx-reverse-proxy-upstream-not-working
編集:ここにいる数人の親切な個人からの入力に基づいて、私はこのルートが私の元の問題から大きく逸脱しているため、さらに追求する必要はないと結論付けました。これは、混乱や、同じ問題をじっと見つめる時間が長すぎる場合があります。モデレーターがこの質問を閉じたい場合は、遠慮なくそうしてください。
Dockerのホスト名が/ etc/hostnameまたは/ etc/hostsで指定されていません。 Dockerには独自のコンテナ間通信があります。したがって、コンテナーを参照するときは、docker-compose.ymlで指定したサービス名を使用してコンテナーを参照できます。したがって、現時点では次のコンテナがあります。
コンテナに別のホスト名を指定したい場合は、これをdocker-compose.ymlで使用できます
container_name: 'some-container-name-different-to-the-name-of-service'
Nginx + php-fpmを連携させることはできますが、それぞれを独自のコンテナーに入れるのはかなり困難です。これは、docker-compose.ymlを使用せずにすべてを手動でセットアップするgithubリポジトリです。 Nginxとphp-fpmはそれぞれ独自のコンテナにあります: https://github.com/timogoosen/mediawiki-dockerized/blob/master/nginx/sites-enabled/site.conf これがnginxです構成。 nginxコンテナがホスト名とポートを使用してphp-fpmコンテナに接続していることがわかります。
fastcgi_pass php-fpm-container:9000;
READMEを参照してください。かなり説明的です。 https://github.com/timogoosen/mediawiki-dockerized/tree/master/nginx
あなたがしているように、私は問題を小さな部分に分割することを提案します。まず、それぞれ独自のコンテナでnginxとphp-fpmを機能させてから、次のものだけを含むランダムなページを提供します。
<?php
phpinfo();
php>
それが機能するようになったら、そこから進みます。
ここにあなたを助けるためのいくつかのリンクがあります: https://stackoverflow.com/questions/39901311/docker-ubuntu-bash-ping-command-not-foundhttps:// stackoverflow。 com/questions/30172605/how-to-get-into-a-docker-containerhttps://stackoverflow.com/questions/30151436/how-to-run-nginx-docker-container- with-custom-config