如果有人能给我一些帮助,我将不胜感激。我刚刚尝试学习 nginx 反向代理,但遇到了一些有关上游名称语法的问题。
请参考这张照片 图:nginx反向代理服务器结构
当我 curl 192.168.189.140 时,代理服务器显示
[debug] vhost.c(811): [client 192.168.189.140] [strict] 主机名“bbs_server_pools”无效,问题靠近: _serve
[调试] vhost.c(902): [客户端 192.168.189.140] 客户端发送了格式错误的主机头: bbs_server_pools
我将上游名称 bbs_server_pools 更改为 bbs 后,一切正常。这与 nginx 的版本有关还是其他原因?
错误的 Nginx.conf 文件
worker_processes 1; error_log logs/error.log error; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; log_format main '$remote_addr - $remote_user [$time_local] "$request"' '$status $body_bytes_sent "$http_referer"' '"$http_user_agent" "$http_x_forwarded_for"'; server { listen 80; server_name bbs.etiantian.org; location / { proxy_pass http://bbs_server_pools; } } upstream bbs_server_pools { server 192.168.189.137:80; server 192.168.189.138:80 weight=3; } }
将 bbs_server_pools 更改为 bbs 后,nginx.conf 文件就好了
worker_processes 1; error_log logs/error.log error; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; log_format main '$remote_addr - $remote_user [$time_local] "$request"' '$status $body_bytes_sent "$http_referer"' '"$http_user_agent" "$http_x_forwarded_for"'; server { listen 80; server_name bbs.etiantian.org; location / { proxy_pass http://bbs; } } upstream bbs { server 192.168.189.137:80; server 192.168.189.138:80 weight=3; } }
答案1
此错误与 nginx 本身无关(好吧,几乎无关)。它由您的上游后端返回。原因是两个 HTTP 请求标头(包括Host
一个总是被重新定义,除非使用proxy_set_header
指示:
默认情况下,仅重新定义两个字段:
proxy_set_header Host $proxy_host; proxy_set_header Connection close;
Host
转发请求的标头值将在您的第一个配置和第二个配置中为。bbs_server_pools
但是bbs
,主机名的有效字符是从a
到 的ASCII 字母、从到 的z
数字和连字符 ( )。虽然下划线是 nginx 上游名称的有效字符,但它对主机名无效,这就是您从上游收到错误的原因。通常,最好使用以下方法保留原始请求的标头值0
9
-
Host
proxy_set_header Host $host;
(或者$http_host
,你可以检查差异这里)。但是,有些情况下您不应该这样做;检查这回答以了解有关该主题的更多信息。