nginx 作为反向 SSL 代理(Apache + Varnish)跳过其自身的配置

nginx 作为反向 SSL 代理(Apache + Varnish)跳过其自身的配置

我有一个新的 Ubuntu 14.04 安装,并采取以下步骤:

  • Apache2 2.4.7
  • MariaDB 最新稳定版本
  • PHP 7.0.9(及多个模块)
  • 配置 Apache 以与 PHP7-FPM 配合使用 *
  • mod_rpaf 与 Apache2 协同工作**
  • PHPMyAdmin 4.6.3 与 PHP7.0.9 正常工作。
  • WordPress 4.6***
  • Varnish 4.0
  • NginX 1.10.1,SSL 证书位于 /etc/nginx/ssl

  • 和 ** -> 问题发生在这些配置之前和之后 *** -> wp-config.php 有强制 SSL 登录和 SSL 管理的代码。两者只在 Apache/Varnish 下工作正常。为 Apache 制作 SSL 证书,如果 Apache 设置为监听端口 443,则一切正常。

这是我的 /etc/apache2/ports.conf:

#NameVirtualHost 192.168.1.86
ServerName 192.168.1.86
Listen 8080

#<IfModule ssl_module>
#   Listen 443
#</IfModule>

#<IfModule mod_gnutls.c>
#   Listen 443
#</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

这是我的 /etc/apache2/sites-available/000-default.conf:

<IfModule mod_fastcgi.c>

    AddHandler php7-fcgi-www-data .php
    Action php7-fcgi-www-data /php7-fcgi-www-data
    Alias /php7-fcgi-www-data /usr/lib/cgi-bin/php7-fcgi-www-data
    FastCgiExternalServer /usr/lib/cgi-bin/php7-fcgi-www-data -socket /run/php/php7.0-fpm.www-data.sock -pass-header Authorization

    <Directory "/usr/lib/cgi-bin">
        Require all granted
    </Directory>

    <FilesMatch ".+\.ph(p[345]?|t|tml)$">
        SetHandler php7-fcgi-www-data
    </FilesMatch>

</IfModule>

<VirtualHost *:8080>

    ServerAdmin [email protected]
    DocumentRoot /var/www/html
    ServerName 192.168.1.86

    <Directory /var/www/html/>
      AllowOverride All
    </Directory>

    Alias /phpmyadmin "/usr/share/phpmyadmin/"
    <Directory "/usr/share/phpmyadmin/">
      Order allow,deny
      Allow from all
      Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

这是我的 /etc/varnish/default.vcl 中的“后端”部分:

backend default {
    .host = "192.168.1.86";
    .port = "8080";
}

这是我的 /etc/default/varnish 中的内容:

DAEMON_OPTS="-a :80 \
         -T localhost:6082 \
         -f /etc/varnish/default.vcl \
         -S /etc/varnish/secret \
         -s malloc,256m"

这是我的/etc/nginx/sites-available/default:

server {
    listen 443 ssl;

    server_name     192.168.1.86;
    ssl_certificate     /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;

    location / {
        proxy_pass http://192.168.1.86:80;

        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Port 443;
        proxy_set_header Host $host;
    }
}
  • /etc/nginx/nginx.conf 中没有端口 80 的踪迹。
  • /etc/apache2/sites-available/000-default.conf 与 sites-enabled 中的匹配
  • /etc/nginx/sites-available/default 与 sites-enabled 中的匹配
  • 在 /etc/nginx/sites-available/default 中尝试了很多与“listen 443”的组合,例如:

    监听 443 ssl 默认服务器;监听 [::]:443 ssl 默认服务器 ipv6only=on;

问题

https://192.168.1.86/wp-admin(或者https://192.168.1.86等)显示“无法连接”,无论我在 nginx conf 文件中做什么。尝试了很多方法。

Nginx 似乎没有问题(语法、配置),但是激活后却不起作用。错误日志显示:

2016/08/23 14:02:07 [emerg] 10857#10857: bind() to 0.0.0.0:80 failed (98: Address already in use)
2016/08/23 14:02:07 [emerg] 10857#10857: bind() to 0.0.0.0:80 failed (98: Address already in use)
2016/08/23 14:02:07 [emerg] 10857#10857: bind() to 0.0.0.0:80 failed (98: Address already in use)
2016/08/23 14:02:07 [emerg] 10857#10857: bind() to 0.0.0.0:80 failed (98: Address already in use)
2016/08/23 14:02:07 [emerg] 10857#10857: bind() to 0.0.0.0:80 failed (98: Address already in use)
2016/08/23 14:02:07 [emerg] 10857#10857: still could not bind()

由于某种原因,nginx 尝试占用端口 80,但它应该使用 443。

我看到其他人也遇到了同样的问题,例如: nginx 尝试绑定错误的端口

只是为了清楚起见:我确实知道有一台服务器使用端口 80。我不知道的是为什么 nginx 在应该使用 443 时尝试使用端口 80。

有人能帮忙吗?提前谢谢

答案1

您可以尝试一些不弄乱default文件配置的方法

a) 在中创建自己的配置文件/etc/nginx/sites-available,然后在中通过软链接启用它/etc/nginx/sites-enabled

b)通过删除链接 default完全禁用网站,或者简单地更改配置的端口,以便 nginx 监听端口 81(例如)default/etc/nginx/sites-enableddefault

因此,如果 Nginx 坚持监听 http 或导致此行为的任何原因,它将不会占用端口 80 并允许 Varnish 占用它。

或者升级到 Ubuntu 16.04 LTS,它将为您提供最新的所有内容,包括 Openssl v1.0.2+,以便您可以启用 HTTP/2 支持。

相关内容