私はポート 80 (http) でリッスンするリバース プロキシとして nginx を使用しています。バックエンドの http および https サーバーにリクエストを転送するために proxy_pass を使用しています。私の http サーバーではすべてがうまく動作しますが、nginx リバース プロキシ経由で https サーバーにアクセスしようとすると、クライアントの Web ブラウザーに https サーバーの IP が表示されます。https バックエンド サーバーの IP ではなく、nginx サーバーの URI を表示したいです (繰り返しますが、これは http サーバーではうまく動作しますが、https サーバーでは動作しません)。フォーラムのこの投稿
これが私の設定ファイルです:
server {
listen 80;
server_name domain1.com;
access_log off;
root /var/www;
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}
location / {
proxy_pass http://ipOfHttpServer:port/;
}
}
server {
listen 80;
server_name domain2.com;
access_log off;
root /var/www;
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}
location / {
proxy_pass http://ipOfHttpsServer:port/;
proxy_set_header X_FORWARDED_PROTO https;
#proxy_set_header Host $http_host;
}
}
「proxy_set_header Host $http_host」ディレクティブと「proxy_set_header Host $host」を試しても、Web ページにアクセスできません (ページが見つかりません)。 しかし、コメントすると、https サーバーの IP がブラウザーに表示されます (これは問題です)。
誰かアイデアを持っていますか?
他の設定ファイルは次のとおりです:
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_hide_header X-Powered-By;
proxy_intercept_errors on;
proxy_buffering on;
proxy_cache_key "$scheme://$host$request_uri";
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=cache:10m inactive=7d max_size=700m;
user www-data;
worker_processes 2;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
server_names_hash_bucket_size 64;
sendfile off;
tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
gzip on;
gzip_comp_level 5;
gzip_http_version 1.0;
gzip_min_length 0;
gzip_types text/plain text/html text/css image/x-icon application/x-javascript;
gzip_vary on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
ご協力いただきありがとうございます !
あなたのアドバイスと例に従い、キャッシュ ディレクティブをサーバー ブロックの外側に移動し、プロキシ ディレクティブをロケーション ブロックの内側に移動しました。それでもまったく同じ問題が発生します。proxy_set_header Host $host;
書き込むと、https Web サイトは nginx 経由ではアクセスできなくなります。
コメントすると、nginx 経由で https サーバーにアクセスできますが、proxy_pass ディレクティブと proxy_redirect がオフになっているにもかかわらず、https サーバーの LAN IP アドレスがアドレス バーに表示されます。ただし、http サーバーでは引き続き機能します (http サーバーの IP ではなく、nginx の IP が表示されます)。
もう 1 つ正確に言うと、 にアクセスしてもすぐに https Web ページにはアクセスできませんhttp://addressOfMyNginx/
。証明書が認証されていないため、その前に警告ページが表示されます。このページでは、have http://addressOfMyNginx/
アドレス バーにまだ が表示されています。ただし、「とにかく Web サイトに進む」リンクをクリックすると、https Web サイトにリダイレクトされ、https サーバーの IP アドレスが表示されます。
デバッグ ログを読んだ後、次のことがわかりました。
2012/07/30 17:24:13 [debug] 4412#0: *75 http proxy header:
"GET / HTTP/1.0^M
Host: nameOfMMyNginxServer^M
X-Real-IP: xxx.xxx.xxx.xxx^M
X-Forwarded-For: xxx.xxx.xxx.xxx^M
Connection: close^M
Accept: text/html, application/xhtml+xml, */*^M
Accept-Language: fr-FR^M
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)^M
Accept-Encoding: gzip, deflate^M
Cookie: a_cookie_which_has_nothing_to_do_with_my_nginx_and_mybackend_server^M
ここで、xxx.xxx.xxx.xxx は、nginx やバックエンド サーバーとは何の関係もないサーバーのパブリック アドレスです (前述の Cookie とも何の関係もありません)。
この Cookie に関係する可能性のあるサーバーをテストしてから、ブラウザのキャッシュと nginx のキャッシュを何度もリロード/再起動してクリアしました。しかし、xxx.xxx.xxx.xxx は実際にはこれとはまったく関係ありません。
前回の投稿にコメントできません。匿名アカウントで投稿し、ブラウザのキャッシュをクリアしたためです。そのため、SF は私を Vulpo として認識しなくなりました... (その後、アカウントを作成しました)。
答え1
proxy_redirect off
うまくいくはずです。proxy_pass
バックエンドに SSL を使用する場合は、SSL を使用するように変更する必要もあると思います。ただし、セキュリティを強化し、高速接続を維持するには、Unix ソケットの方がはるかに優れています。
私が推奨する nginx.conf:
# /etc/nginx/nginx.conf
user www-data;
worker_processes 2; # Do you really have two CPU cores?
events {
multi_accept on;
worker_connections 768;
use epoll;
}
http {
charset utf-8;
client_body_timeout 65;
client_header_timeout 65;
client_max_body_size 10m;
default_type application/octet-stream;
index index.html index.php /index.php;
keepalive_timeout 20;
reset_timedout_connection on;
send_timeout 65;
sendfile on;
server_names_hash_bucket_size 64;
tcp_nodelay off;
tcp_nopush on;
gzip on;
gzip_buffers 32 4k;
gzip_comp_level 2;
gzip_disable "msie6";
gzip_http_version 1.1;
gzip_min_length 1100;
gzip_proxied any;
gzip_static on;
gzip_types
#text/html is always compressed by HttpGzipModule
text/css
text/plain
application/javascript
application/x-javascript
application/json
application/x-json
application/rss+xml
application/xml
application/vnd.ms-fontobject
font/truetype
font/opentype
image/x-icon
image/svg+xml;
gzip_vary on;
include mime.types;
include conf.d/*.conf;
include sites-enabled/*;
}
私が推奨する仮想ホスト構成:
# /etc/nginx/sites-available/default.conf
proxy_cache_key "$scheme://$host$request_uri";
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=cache:10m inactive=7d max_size=700m;
server {
listen 80;
server_name example.com;
access_log off;
root /var/www;
# Consider using a map for this! If is bad!
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for;
proxy_intercept_errors on;
proxy_buffering on;
proxy_pass http://127.0.0.1:port$request_uri;
}
}
より高度な内容については、GitHub の私の nginx 設定をご覧ください (まだ完了していないので、まずコメントをさらに書く必要があります)。https://github.com/Fleshgrinder/nginx