我正在尝试将 Nginx 设置为 Apache 的反向代理,用于在 :8080 上本地运行并可通过 进行外部访问的站点lessico.pistacchioso.com
。当前配置导致 502 - Bad Gateway 错误。
#/etc/apache2/ports.conf
Listen 127.0.0.1:8080
<IfModule mod_ssl.c>
# If you add NameVirtualHost *:443 here, you will also have to change
# the VirtualHost statement in /etc/apache2/sites-available/default-ssl
# to <VirtualHost *:443>
# Server Name Indication for SSL named virtual hosts is currently not
# supported by MSIE on Windows XP.
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
然后
#/etc/apache2/sites-enabled/lessico
NameVirtualHost 127.0.0.1:8080
<VirtualHost 127.0.0.1:8080>
ServerAdmin webmaster@localhost
ServerName lessico.pistacchioso.com
DocumentRoot /home/pistacchio/sites/lessico/
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /home/pistacchio/sites/lessico/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/access.log combined
Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
</VirtualHost>
最后
#/etc/nginx/sites-enabled/default
server {
listen 80;
server_name corpus.pistacchioso.com;
location / {
proxy_pass http://127.0.0.1:9000/;
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_max_temp_file_size 0;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
server {
listen 80;
server_name lemmi.pistacchioso.com;
access_log /var/log/nginx/localhost.access.log;
location / {
proxy_pass http://127.0.0.1:8080/;
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_max_temp_file_size 0;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}
有谁能帮我正确设置吗?谢谢
答案1
一般来说,502 表示 NGINX 服务器无法连接到您的上游代理。
该服务器充当网关或代理,并从上游服务器收到无效响应
如果您查看错误日志(可能是 /var/log/nginx/error.log、/var/log/nginx/error_log 或 /usr/local/nginx/var/log/error.log 之一,但请查看您的配置),您应该会看到一些相关错误。
2012/02/03 00:00:00 [alert] 31291#0: *240 round robin upstream stuck on 2 tries while connecting to upstream, client: 1.2.3.4, server: , request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "example.com"
如果您看到类似的东西,这可能意味着您的 NGINX 服务器无法与上游通信。如果您通过 SSH 连接到服务器,则可以运行一些命令来检查是否可以建立与上游的基本连接。尝试运行命令;
curl -I http://127.0.0.1:8080/
这会向本地服务器发送 HTTP HEAD 请求。输出中的第一行应类似于
HTTP/1.1 200 OK
或者
HTTP/1.0 200 OK
如果响应代码不是 200,则表示 Apache 服务器出现问题。如果错误代码超过 500,请检查 Apache 错误日志以查看问题所在。如果此命令出现任何类型的超时或类似错误
curl: (7) couldn't connect to host
Apache 服务器存在网络问题。
首先尝试检查您的防火墙,它可能阻止了端口。我认为通常所有防火墙都应该允许环回地址上的所有端口,但我可能错了,所以总是值得检查。运行
iptables --list | grep 8080
这将返回与端口 8080 相关的所有防火墙规则,它不会确认端口是否被阻止或未阻止,但会标记任何明显的规则。接下来检查 Apache 是否正在运行并监听它认为正在监听的端口。
ps aux | grep httpd
这将返回所有 Apache 进程,应该至少返回两个结果(一个 httpd 进程和一个grep httpd
进程),但可能还有更多结果,具体取决于您的配置。接下来要检查端口,请运行此命令
lsof -i :8080
这将返回所有在端口 9000 上监听的进程。你应该至少有一个“httpd”进程,它看起来像这样
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
httpd 25353 apache 3u IPv6 98385 TCP *:http (LISTEN)
这是对“进程是否正确监听”的相当不错的诊断,如果您的防火墙没有问题,进程已启动并监听正确的端口,但您仍然无法获得任何响应,甚至出现错误,则问题可能更加严重。发布 Apache 和 NGINX 错误日志的最后几行,它们可能会提供更多信息。