Nginx 代理 Apache

Nginx 代理 Apache

我正在尝试将 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 错误日志的最后几行,它们可能会提供更多信息。

相关内容