我在 4 台 Web 服务器前面有一对负载均衡器,它们在端口 80 上运行 nginx,并在端口 8081 上代理到 apache,用于传输非静态内容(如 php 代码)。我在这个配置下运行了多个域。当我在 80 上访问域以获取静态内容时,它运行正常。Nginx 返回了它应该返回的内容。当我访问 PHP 页面时,它总是访问默认虚拟主机。
当我通过负载平衡器访问 php 页面上的端口 8081 时,它可以正确地提供 php 页面和静态内容。
看来 nginx 未正确将域传递给 apache 以确定要提供什么服务。我应该在配置中的哪个位置查找此错误,还是我误解了正在发生的事情?
这是我的 nginx proxy_params 内容:
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
我的服务器块包含以下代码:
location ~ /\. {
deny all;
}
location ~.*\.(3gp|gif|jpg|jpeg|png|ico|wmv|avi|asf|asx|mpg|mpeg|mp4|pls|mp3|mid|wav|swf|flv|html|htm|txt|js|css|exe|zip|tar|rar|gz|tgz|bz2|uha|7z|doc|docx|xls|xlsx|pdf|iso|ico)$ {
expires 7d;
try_files $uri @apache;
}
location / {
proxy_pass http://127.0.0.1:8081;
}
location @apache {
proxy_pass http://127.0.0.1:8081;
}
答案1
proxy_params 文件并未像我所想的那样通过某种默认包含方式包含在配置中。我已通过使用 proxy_pass 将 include /etc/nginx/proxy_params 添加到我的每个位置来更正此问题。“proxy_set_header Host $http_host;”这个东西至关重要。
如果有人能提供更简洁的解决方案,让我只需在配置中设置一次,而不是每次都设置,我会非常高兴。如果你能提供给我,我会给你信用。
以下是每个服务器块中生成的位置块:
location ~ /\. { deny all; }
# Serve up the static files through nginx
# This provides speed improvements
location ~.*\.(3gp|gif|jpg|jpeg|png|ico|wmv|avi|asf|asx|mpg|mpeg|mp4|pls|mp3|mid|wav|swf|flv|html|htm|txt|js|css|exe|zip|tar|rar|gz|tgz|bz2|uha|7z|doc|docx|xls|xlsx|pdf|iso|ico)$ {
expires 7d;
try_files $uri @apache;
}
# Try it in the local Apache on port 8081
location / {
proxy_pass http://127.0.0.1:8081;
include /etc/nginx/proxy_params;
}
location @apache {
proxy_pass http://127.0.0.1:8081;
include /etc/nginx/proxy_params;
}