使用 nginx 作为反向代理运行 Apache2

使用 nginx 作为反向代理运行 Apache2

我的目标是从新的 Ubuntu 16.04 服务器提供安全的电子邮件服务。为了实现此目的,我想设置 Apache2 并使用 nginx 作为其反向代理运行。

我面临的问题是 Apache 无法启动,声称没有分配 SSL 证书(请参阅此问题末尾的终端输出),即使我(尚未)尝试使用 HTTPS。

我的问题:

  • 如果 Apache 在本地端口上运行,nginx 知道任何 SSL 证书还不够吗?
  • 我需要做什么才能让 Apache 开始监听本地地址?

这是我对于需要做的事情的理解。如果您能指出我的理解有误,我将不胜感激。

  • 安装 nginx 和 Apache2
  • 创建一个 nginx 服务器块以:
    • 监听端口 80(和 443)
    • (将流量从端口 80 重定向到端口 443)
    • (处理 SSL 认证)
    • 将对 PHP 文件的所有请求转发到 127.0.0.1:8080 的 Apache
  • 设置 Apache 以:
    • 仅监听 8080 端口,不在端口 443 上
    • 不了解任何 SSL 认证

我喜欢一次解决一个问题,因此我目前暂时搁置 SSL 证书问题,并尝试让 Apache 仅在端口 80 上使用 nginx 作为其反向代理运行。


以下是我现有的配置文件:

nginx

$ sudo nano /etc/nginx/sites-available/webmail

server {
  listen   80;

  root /var/www/webmail/web;
  index index.php index.html index.htm;

  server_name webmail.mydomain.com;

  # Look for...
  # * the exact path
  # * a default (index.*) file, considering the path to be a directory
  # ... and if that fails:
  # * get the index.php script at the root to deal with the request

  location / {
    try_files $uri $uri/ /index.php;
  }

  # If the chosen path leads to a PHP fie:
  # * forward the request to Apache running at 127.0.0.1:8080
  # * after having modified certain headers

  location ~ \.php$ {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;
    proxy_pass http://127.0.0.1:8080;
  }

  # If there are any Apache HT files in the chosen directory
  # ignore any direct requests for them

  location ~ /\.ht {
    deny all;
  }
}

Apache2

$ sudo nano /etc/apache2/sites-available/webmail.conf 

<VirtualHost 127.0.0.1:8080>
        ServerName webmail.mydomain.com
        ServerAdmin [email protected]
        DocumentRoot /var/www/webmail/web
        <Directory "/var/www/webmail/web">
            Options FollowSymLinks
            AllowOverride All
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Apache2 端口

$ sudo nano /etc/apache2/ports.conf

Listen 127.0.0.1:8080

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

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

请注意,我明确没有要求 Apache 监听端口 443。其他配置文件中是否有其他地方告诉 Apache 监听端口 443?


以下是我的占位符 PHP 和 HTML 文件,位于其预期位置:

索引.php

$ sudo nano /var/www/webmail/web/index.php

<?php
  echo "PHP from /var/www/webmail/web/index.php\n";
?>

索引.html

$ sudo nano /var/www/webmail/web/index.html

<html>
  HTML from /var/www/webmail/web/index.html
</html>

在浏览器中,请求http://webmail.mydomain.com/index.html成功按预期进行,但请求http://webmail.mydomain.com/index.php导致文件被下载,而不是执行。


以下是我尝试启动 Apache2 时发生的情况:

$ sudo /etc/init.d/apache2 restart
[ ok ] Restarting apache2 (via systemctl): apache2.service.

$ sudo service apache2 status
* apache2.service - LSB: Apache2 web server
   Loaded: loaded (/etc/init.d/apache2; bad; vendor preset: enabled)
  Drop-In: /lib/systemd/system/apache2.service.d
           `-apache2-systemd.conf
   Active: inactive (dead) since <Time>; 3s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 16059 ExecStop=/etc/init.d/apache2 stop (code=exited, status=0/SUCCESS)
  Process: 16043 ExecStart=/etc/init.d/apache2 start (code=exited, status=0/SUCCESS)

systemd[1]: Starting LSB: Apache2 web server...
apache2[16043]:  * Starting Apache httpd web server apache2
apache2[16043]: Action 'start' failed.
apache2[16043]: The Apache error log may have more information.
apache2[16043]:  *
apache2[16059]:  * Stopping Apache httpd web server apache2
apache2[16059]:  *
systemd[1]: Started LSB: Apache2 web server.

以下是 error.log 的内容:

$ sudo nano /var/log/apache2/error.log

[ssl:emerg] [pid 15943] AH02572: Failed to configure at least one certificate and key for myhostname.hostingservice.com:443
[ssl:emerg] [pid 15943] SSL Library Error: error:140A80B1:SSL routines:SSL_CTX_check_private_key:no certificate assigned
[ssl:emerg] [pid 15943] AH02311: Fatal error initialising mod_ssl, exiting. See /var/log/apache2/error.log for more information

(这在 var/log/apache2/error.log 中,没有更多信息。)

我错过了什么?


注意:此服务器的主要目的是提供 Meteor 应用程序。我选择使用 Phusion Passenger 和 Nginx 来实现这一点。除了电子邮件服务外,Apache 还将用于提供 WordPress 网站。

答案1

我现在已经让它工作了。我忘记删除了/etc/apache2/sites-disabled/default-ssl.conf,所以 Apache 试图运行一个不需要的安全站点。

我随后用于sudo certbot --nginx获取 Nginx 的证书,现在一切都运行安全。

相关内容