我使用 nginx 作為反向代理,監聽連接埠 80 (http)。我正在使用 proxy_pass 將請求轉發到後端 http 和 https 伺服器。我的 http 伺服器一切正常,但當我嘗試透過 nginx 反向代理存取 https 伺服器時,https 伺服器的 IP 顯示在客戶端的 Web 瀏覽器中。我希望顯示 nginx 伺服器的 uri,而不是 https 後端伺服器的 ip(同樣,這適用於 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」時,無法存取網頁(找不到頁面)。但是當我評論它時,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 網站無法透過 nginx 存取。
當我評論它時,我可以透過nginx到達https伺服器,但https伺服器的lan ip位址顯示在網址列中,儘管proxy_pass指令和proxy_redirect關閉。但它仍然適用於http伺服器(顯示nginx的ip而不是http伺服器ip)。
更精確一點:我一轉到 就沒有到達 https 網頁http://addressOfMyNginx/
。之前有一個警告頁面,因為證書沒有經過驗證。在此頁面上我仍在have http://addressOfMyNginx/
地址欄中。但是,當我點擊「仍然繼續訪問該網站」連結時,我被重定向到 https 網站,然後顯示 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