同一台服务器上的 nginx 和 apache2

同一台服务器上的 nginx 和 apache2

我有带 nginx 和 apache2 的 ubuntu 16.04。有 2 个 DNS A 记录指向此机器:

  • app1.mydomain.com
  • app2.mydomain.com

我需要 apache 解析 app1.mydomain.com,nginx 解析 app2.mydomain.com。两者都在端口 80 上。可以吗?

此外,apache 需要处理 2 个不同的应用程序(site1 和 site2)。

我想:

  • app1.mydomain.com/site1-由 apache 解析并运行应用程序 site1
  • app1.mydomain.com/site2 - 由 apache 和 fire 应用程序 site2 解析
  • app2.mydomain.com - 使用 nginx 提供 ghost 应用程序

这是我的 Apache 配置:

<VirtualHost *:80>
    ServerAdmin [email protected]

    ServerName app1.mydomain.com

    ServerAlias www.app1.mydomain.com

    ErrorLog /var/www/site1/logs/error.log

    CustomLog /var/www/site1/logs/access.log combined

    WSGIScriptAlias /api /var/www/site1/application/index.py/

    Alias /static /var/www/site1/application/static

    <Directory /var/www/site1/application>
            Order deny,allow
            Allow from all
    </Directory>

    AddType text/html .py

    ErrorLog /var/www/site2/logs/error.log
    CustomLog /var/www/site2/logs/access.log combined

    WSGIScriptAlias /site2 /var/www/site2/index.py/
    Alias /site2/uploads /var/sftp/site2/uploads/

    <Directory /var/www/site2/>
            Order deny,allow
            Allow from all
    </Directory>

这是我的 NGINX 配置文件:

server {
listen 8080;
listen [::]:8080;

server_name app2.mydomain.com;
root /var/www/ghost/system/nginx-root;

location / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;
    proxy_pass http://127.0.0.1:2368;

}
location ~ /.well-known {
    allow all;
}

client_max_body_size 50m;
}

答案1

首先。Apache 和 Nginx 是 Web 服务器 -不是dns 服务器。它们不解决任何问题。这个问题与 DNS 无关,而是与 Web 服务器如何处理请求有关。

我需要 apache 解析 app1.mydomain.com,nginx 解析 app2.mydomain.com。两者都在端口 80 上。可以吗?

不,这是不可能的。两个应用程序不能监听同一个端口。您可以通过两种方式解决此问题:

  1. 让 Apache 监听端口 80,并将 app2.mydomain.com 的请求代理到 nginx,监听不同的端口,并直接为 app1.mydomain.com 提供服务。
  2. 相反。为 Apache 设置 nginx 代理。

或者 - 让两者由同一个 Web 服务器托管。Apache 和 nginx 在很多情况下在技术层面上可以互换,因此从应用程序的角度来看,这其实并不重要。从管理角度来看,它们有很大不同。

我注意到您在端口 8080 上运行 nginx,因此我假设您想使用 apache 作为代理。然后为 apache 创建一个新的虚拟主机,例如/etc/apache2-sites-available/app2.mydomain.com.conf

<VirtualHost *:80>
   DocumentRoot "/var/www"
   ErrorLog "logs/app2-error_log"
   CustomLog "logs/app2-access_log" common
   ServerName app2.mydomain.com
   ProxyRequests Off
   <Proxy *>
          Order deny,allow
          Allow from all
    </Proxy>
     Proxypass / http://localhost:8080/
</VirtualHost>

然后运行sudo a2enmod proxy_http; sudo a2ensite app2.mydomain.com; sudo service apache2 reload

这将启用 mod_proxy、mod_proxy_http 并使 apache 将对 VirtualHost app2.mydomain.com 的任何请求转发到 nginx,根据您的配置,nginx 在端口 8080 上运行。

我还没有测试过这个配置,所以可能需要进行一些调整。

附注:为什么需要 nginx?根据 nginx 设置,它只是代理在端口 2368 上运行的其他 Web 服务器的请求。您可以直接使用 apache 进行代理...

mod_proxy-文档可能对调整它有帮助。

答案2

从问题内容来看,您已经搞清楚了,只是每个端口号只能访问一个应用程序。您不能在同一个端口上同时运行 Apache2 和 Nginx。这是不可能的。

由于您提到您的 DNS 已经正常工作并指向正确的机器 (IP)。您可以app1.mydomain.com通过以下方式访问您的默认 ( port 80):

http://app1.mydomain.com

这与

http://app1.mydomain.com:80

您必须指定 Nginx 的端口,该端口已通过配置文件设置port 8080

使用它来访问你的site1:

http://app1.mydomain.com:8080

如果指定了错误的端口,则无论使用什么域名,都会加载默认页面。对于 Apache,默认为第一个虚拟主机,除非指定不同的端口。

相关内容