Nginx 代理到 Apache

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)

}

有关如何正确设置的任何帮助?谢谢

Smu*_*dge 5

通常,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 错误日志的最后几行,它们可能会提供更多信息。