我有带 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 上。可以吗?
不,这是不可能的。两个应用程序不能监听同一个端口。您可以通过两种方式解决此问题:
- 让 Apache 监听端口 80,并将 app2.mydomain.com 的请求代理到 nginx,监听不同的端口,并直接为 app1.mydomain.com 提供服务。
- 相反。为 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,默认为第一个虚拟主机,除非指定不同的端口。