pis*_*hio 0 nginx reverse-proxy apache-2.2
我正在尝试将 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>
Run Code Online (Sandbox Code Playgroud)
然后
#/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>
Run Code Online (Sandbox Code Playgroud)
最后
#/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;
}
Run Code Online (Sandbox Code Playgroud)
}
有关如何正确设置的任何帮助?谢谢
通常,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"
Run Code Online (Sandbox Code Playgroud)
如果您看到类似的内容,则可能意味着您的 NGINX 服务器无法与您的上游通信。如果您通过 SSH 连接到服务器,您可以运行一些命令来检查与上游的基本连接是否可以建立。尝试运行命令;
curl -I http://127.0.0.1:8080/
Run Code Online (Sandbox Code Playgroud)
这会向您的本地服务器发送 HTTP HEAD 请求。在输出中,第一行应该是这样的
HTTP/1.1 200 OK
Run Code Online (Sandbox Code Playgroud)
或者
HTTP/1.0 200 OK
Run Code Online (Sandbox Code Playgroud)
如果它不是 200 响应代码,则意味着 Apache 服务器有问题。如果是 500+ 错误,请检查 Apache 错误日志以查看问题所在。如果此命令给您任何类型的超时或错误,例如
curl: (7) couldn't connect to host
Run Code Online (Sandbox Code Playgroud)
Apache 服务器存在网络问题。
首先尝试检查您的防火墙,它可能阻止了端口。我认为通常所有防火墙都应该允许环回地址上的所有端口,但我可能是错的,所以总是值得检查。跑
iptables --list | grep 8080
Run Code Online (Sandbox Code Playgroud)
这将返回与端口 8080 相关的任何防火墙规则,它不会确认它是被阻止还是未阻止,但会标记任何明显的规则。接下来检查 Apache 是否正在运行并侦听它认为正在侦听的端口。
ps aux | grep httpd
Run Code Online (Sandbox Code Playgroud)
这将返回所有 Apache 进程,应该至少返回两个结果(一个 httpd 进程和一个grep httpd
进程),但根据您的配置可能会有更多。接下来检查端口运行这个
lsof -i :8080
Run Code Online (Sandbox Code Playgroud)
这将返回侦听端口 9000 的所有进程。您应该至少有一个“httpd”进程,它看起来像这样
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
httpd 25353 apache 3u IPv6 98385 TCP *:http (LISTEN)
Run Code Online (Sandbox Code Playgroud)
这是对“进程是否正确监听”的一个相当不错的诊断,如果您的防火墙正常,则进程已启动并在正确的端口上监听,但您仍然无法得到任何响应,甚至是错误,问题可能很大更深。发布 Apache 和 NGINX 错误日志的最后几行,它们可能会提供更多信息。