作者选择了 Electronic Frontier Foundation作为 Write for Donations计划的一部分接受捐款。
介绍
Apache 和 Nginx 是常用 PHP 的两种流行的开源 Web 服务器,在托管具有不同要求的多个网站时,在同一虚拟机上运行两种 Web 服务器可能是有用的。
具有 IPv4 和 IPv6 地址的服务器可以配置为服务于一个协议上的 Apache 站点和另一个协议上的 Nginx 站点,但这目前并不实用,因为 ISP 的 IPv6 采用仍然不普遍。
在本教程中,您将将 Nginx 配置为 Web 服务器和 Apache 的反向代理 - 所有在一个服务器上。
根据 Web 应用程序,可能需要对代码进行更改,以保持 Apache 反向代理警惕,特别是当配置 SSL 站点时。 为了避免这种情况,您将安装一个名为mod_rpaf
的 Apache 模块,该模块会重写某些环境变量,以便 Apache 直接处理来自 Web 客户端的请求。
我们将在一个服务器上托管四个域名. 两个将由 Nginx 服务:nginx1.your_domain(默认虚拟主机)和nginx2.your_domain. 剩余的两个,apache1.your_domain和apache2.your_domain,将由 Apache 服务。
前提条件
要完成本教程,您将需要以下内容:
- [一个新的Ubuntu 20.04 server] (https://www.digitalocean.com/products/linux-distribution/ubuntu/),通过遵循[初始服务器设置与Ubuntu 20.04] (https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-20-04),带有sudo非root用户和防火墙来配置.
- 联合国 配置了四个完全合格的域名,以指向您的服务器的IP地址. 请参看如何用数字海洋设置主机名的第3步,以说明如何这样做。 如果您将域名 DNS 设置在其它位置, 您应该在那里创建相应的 A 记录 。 .
第1步:安装Apache和PHP-FPM
让我们先安装Apache和PHP-FPM。
除了Apache和PHP-FPM之外,我们还将安装PHP FastCGI Apache模块libapache2-mod-fastcgi
,以支持FastCGI Web应用程序。
首先,更新您的包列表,以确保您有最新的包。
1sudo apt update
接下来,安装 Apache 和 PHP-FPM 包:
1sudo apt install apache2 php-fpm
FastCGI Apache 模块在 Ubuntu 存储库中不可用,所以从 kernel.org下载并使用 dpkg
命令安装。
1wget https://mirrors.edge.kernel.org/ubuntu/pool/multiverse/liba/libapache-mod-fastcgi/libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb
2sudo dpkg -i libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb
接下来,让我们更改Apache的默认配置以使用PHP-FPM。
第2步:配置Apache和PHP-FPM
在此步骤中,我们将更改Apache的端口号为8080
,并将其配置为使用mod_fastcgi
模块的PHP-FPM。
1sudo mv /etc/apache2/ports.conf /etc/apache2/ports.conf.default
创建一个新的 ports.conf
文件,端口设置为 8080
:
1echo "Listen 8080" | sudo tee /etc/apache2/ports.conf
注意:网页服务器在配置反向代理时通常会听127.0.0.1:8080
,但这样做会将PHP的环境变量 SERVER_ADDR 的值设置为反向IP地址,而不是服务器的公共IP。
接下来,我们将为Apache创建一个虚拟主机文件. 该文件中的<VirtualHost>
指令将设置为仅在端口8080
上服务网站。
禁用默认虚拟主机:
1sudo a2dissite 000-default
然后创建一个新的虚拟主机文件,使用现有默认网站:
1sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/001-default.conf
现在打开新的配置文件:
1sudo nano /etc/apache2/sites-available/001-default.conf
将听力端口更改为8080
:
1[label /etc/apache2/sites-available/000-default.conf]
2<VirtualHost *:8080>
3 ServerAdmin webmaster@localhost
4 DocumentRoot /var/www/html
5 ErrorLog ${APACHE_LOG_DIR}/error.log
6 CustomLog ${APACHE_LOG_DIR}/access.log combined
7</VirtualHost>
保存文件并激活新的配置文件:
1sudo a2ensite 001-default
然后重新加载Apache:
1sudo systemctl reload apache2
安装包含netstat
命令的net-tools
包:
1sudo apt install net-tools
检查Apache是否正在听8080
:
1sudo netstat -tlpn
输出应该看起来像下面的例子,在apache2
听到8080
:
1[secondary_label Output]
2Active Internet connections (only servers)
3Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
4tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1086/sshd
5tcp6 0 0 :::8080 :::* LISTEN 4678/apache2
6tcp6 0 0 :::22 :::* LISTEN 1086/sshd
一旦您确认Apache在正确的端口上收听,您可以配置对PHP和FastCGI的支持。
步骤 3 — 配置 Apache 以使用mod_fastcgi
Apache 默认情况下使用mod_php
来服务 PHP 页面,但需要额外的配置来使用 PHP-FPM。
<$>[注] 注: 如果您正在尝试使用mod_php
的现有LAMP安装本教程,请先用sudo a2dismod php7.4
禁用它。
我们将为mod_fastcgi
添加一个配置块,这取决于mod_action
。
1sudo a2enmod actions
重命名现有的 FastCGI 配置文件:
1sudo mv /etc/apache2/mods-enabled/fastcgi.conf /etc/apache2/mods-enabled/fastcgi.conf.default
创建一个新的配置文件:
1sudo nano /etc/apache2/mods-enabled/fastcgi.conf
将下列指令添加到文件中,以将.php 文件的请求传送到 PHP-FPM UNIX 接口:
1[label /etc/apache2/mods-enabled/fastcgi.conf]
2<IfModule mod_fastcgi.c>
3 AddHandler fastcgi-script .fcgi
4 FastCgiIpcDir /var/lib/apache2/fastcgi
5 AddType application/x-httpd-fastphp .php
6 Action application/x-httpd-fastphp /php-fcgi
7 Alias /php-fcgi /usr/lib/cgi-bin/php-fcgi
8 FastCgiExternalServer /usr/lib/cgi-bin/php-fcgi -socket /run/php/php7.4-fpm.sock -pass-header Authorization
9 <Directory /usr/lib/cgi-bin>
10 Require all granted
11 </Directory>
12</IfModule>
保存更改并执行配置测试:
1sudo apachectl -t
注意: 如果您看到警告:无法使用 127.0.1.1 可靠地确定服务器的完整/合格域名,设置 /
ServerName`指令全球/以抑制此消息,您现在可以安全地忽略它。
重新加载Apache,只要Syntax OK
显示:
1sudo systemctl reload apache2
现在让我们确保我们可以从Apache服务PHP。
第4步:验证PHP功能
让我们确保PHP通过创建一个phpinfo()
文件并从Web浏览器访问它来工作。
创建文件 /var/www/html/info.php
,其中包含呼叫到 phpinfo
函数:
1echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php
请注意,如果您遵循初始服务器设置在 前提条件 部分,那么您可能已启用了Apache防火墙。让我们继续前进并确保我们可以在端口 8080
上访问我们的IP,目前无法访问。
首先允许8080
端口通过防火墙:
1sudo ufw allow 8080
既然我们要保护我们的Apache域,让我们继续前进,确保443
端口的TLS流量可以进入。
允许Apache Full
在80
和443
端口上允许流量:
1sudo ufw allow "Apache Full"
现在检查你的防火墙状态:
1sudo ufw status
如果您遵循前提条件,那么输出将是这样的:
1[secondary_label Output]
2To Action From
3-- ------ ----
4OpenSSH ALLOW Anywhere
5Apache Full ALLOW Anywhere
68080 ALLOW Anywhere
7OpenSSH (v6) ALLOW Anywhere (v6)
8Apache Full (v6) ALLOW Anywhere (v6)
98080 (v6) ALLOW Anywhere (v6)
您将看到8080
端口和Apache Full
端口是允许的,除了其他任何防火墙规则。
若要在浏览器中查看info.php
,请访问http://your_server_ip:8080/info.php
。这将为您提供使用的 PHP 配置设置列表,您将看到类似于此的输出:
在页面顶部,检查 Server API 说** FPM/FastCGI** . 页面下方约三分之二的路径,** PHP变量** 部分会告诉你** SERVER_SOFTWARE** 是Ubuntu上的Apache. 这些证实mod_fastcgi
是活跃的,而Apache正在使用PHP-FPM来处理PHP文件。
第5步:为Apache创建虚拟主机
让我们为apache1.your_domain
和apache2.your_domain
域创建Apache虚拟主机文件。
首先,创建文档根目录:
1sudo mkdir -v /var/www/apache1.your_domain /var/www/apache2.your_domain
然后为每个网站创建一个索引
文件:
1echo "<h1 style='color: green;'>Apache 1</h1>" | sudo tee /var/www/apache1.your_domain/index.html
2echo "<h1 style='color: red;'>Apache 2</h1>" | sudo tee /var/www/apache2.your_domain/index.html
然后为每个网站创建一个phpinfo()
文件,以便我们可以测试PHP是否正确配置。
1echo "<?php phpinfo(); ?>" | sudo tee /var/www/apache1.your_domain/info.php
2echo "<?php phpinfo(); ?>" | sudo tee /var/www/apache2.your_domain/info.php
现在为 apache1.your_domain
创建虚拟主机文件:
1sudo nano /etc/apache2/sites-available/apache1.your_domain.conf
将下列代码添加到文件中以定义主机:
1[label /etc/apache2/sites-available/apache1.your_domain.conf]
2 <VirtualHost *:8080>
3 ServerName apache1.your_domain
4 ServerAlias www.apache1.your_domain
5 DocumentRoot /var/www/apache1.your_domain
6 <Directory /var/www/apache1.your_domain>
7 AllowOverride All
8 </Directory>
9 </VirtualHost>
AllowOverride All
行允许支持.htaccess。
对于在 Apache 中设置虚拟主机的完整指南,请参阅 如何在 Ubuntu 18.04 上设置 Apache 虚拟主机。
保存并关闭文件. 然后为 apache2.your_domain
创建类似的配置。
1sudo nano /etc/apache2/sites-available/apache2.your_domain.conf
然后将配置添加到文件中:
1[label /etc/apache2/sites-available/apache2.your_domain.conf]
2 <VirtualHost *:8080>
3 ServerName apache2.your_domain
4 ServerAlias www.apache2.your_domain
5 DocumentRoot /var/www/apache2.your_domain
6 <Directory /var/www/apache2.your_domain
7 AllowOverride All
8 </Directory>
9 </VirtualHost>
保存文件并离开编辑器。
现在两个Apache虚拟主机已经设置了,使用a2ensite
命令启用网站,在sites-enabled
目录中创建一个符号链接到虚拟主机文件:
1sudo a2ensite apache1.your_domain
2sudo a2ensite apache2.your_domain
再次检查 Apache 对配置错误:
1sudo apachectl -t
如果没有错误,您将看到Syntax OK
显示,如果您看到其他任何东西,请查看配置并再次尝试。
重新加载 Apache 以应用更改,一旦您的配置没有错误:
1sudo systemctl reload apache2
要确认网站正在工作,请在浏览器中打开http://apache1.your_domain:8080
和http://apache2.your_domain:8080
并检查每个网站是否显示其index.html
文件。
你会看到以下结果:
此外,请确保 PHP 通过访问每个网站的 info.php
文件来工作。 请访问您的浏览器中的 http://apache1.your_domain:8080/info.php
和 http://apache2.your_domain:8080/info.php
。
您将在每个网站上看到相同的PHP配置规格列表,就像您在 Step 4 中看到的那样。
我们现在有两个网站托管在Apache上的端口8080
。
第6步:安装和配置 Nginx
在此步骤中,我们将安装 Nginx 并将域名 nginx1.your_domain
和 nginx2.your_domain
配置为 Nginx 的虚拟主机。有关在 Nginx 中设置虚拟主机的完整指南,请参阅 How To Set Up Nginx Server Blocks (Virtual Hosts) on Ubuntu 20.04。
使用apt
包管理器安装 Nginx:
1sudo apt install nginx
然后删除默认虚拟主机的simlink,因为我们将不再使用它:
1sudo rm /etc/nginx/sites-enabled/default
我们将在稍后创建自己的默认网站(nginx1.your_domain
)。
现在我们将使用我们在Apache中使用的相同程序为 Nginx创建虚拟主机,首先为两个网站创建文档根目录:
1sudo mkdir -v /usr/share/nginx/nginx1.your_domain /usr/share/nginx/nginx2.your_domain
我們會將 Nginx 網站保留在 /usr/share/nginx
,這就是 Nginx 默認想要的位置. 您可以將他們放置在 /var/www/html
以下與 Apache 網站,但這種分離可能有助於您將網站與 Nginx 聯繫起來。
与Apache的虚拟主机一样,在安装完成后创建)`文件进行测试:
1echo "<h1 style='color: green;'>Nginx 1</h1>" | sudo tee /usr/share/nginx/nginx1.your_domain/index.html
2echo "<h1 style='color: red;'>Nginx 2</h1>" | sudo tee /usr/share/nginx/nginx2.your_domain/index.html
3echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/nginx1.your_domain/info.php
4echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/nginx2.your_domain/info.php
现在创建一个虚拟主机文件为域 nginx1.your_domain
:
1sudo nano /etc/nginx/sites-available/nginx1.your_domain
Nginx 将配置文件中的服务器 {... }
区域称为服务器块 **. 创建主虚拟主机的服务器块,即
nginx1.your_domain` 。
1[label /etc/nginx/sites-available/nginx1.your_domain]
2server {
3 listen 80 default_server;
4
5 root /usr/share/nginx/nginx1.your_domain;
6 index index.php index.html index.htm;
7
8 server_name nginx1.your_domain www.nginx1.your_domain;
9 location / {
10 try_files $uri $uri/ /index.php;
11 }
12
13 location ~ \.php$ {
14 fastcgi_pass unix:/run/php/php7.4-fpm.sock;
15 include snippets/fastcgi-php.conf;
16 }
17}
现在为 Nginx 的第二个域创建一个虚拟主机文件,‘nginx2.your_domain’:
1sudo nano /etc/nginx/sites-available/nginx2.your_domain
将以下内容添加到文件中:
1[label /etc/nginx/sites-available/nginx2.your_domain]
2server {
3 root /usr/share/nginx/nginx2.your_domain;
4 index index.php index.html index.htm;
5
6 server_name nginx2.your_domain www.nginx2.your_domain;
7 location / {
8 try_files $uri $uri/ /index.php;
9 }
10
11 location ~ \.php$ {
12 fastcgi_pass unix:/run/php/php7.4-fpm.sock;
13 include snippets/fastcgi-php.conf;
14 }
15}
保存并关闭文件。
通过创建符号链接到网站启用
目录来启用两个网站:
1sudo ln -s /etc/nginx/sites-available/nginx1.your_domain /etc/nginx/sites-enabled/nginx1.your_domain
2sudo ln -s /etc/nginx/sites-available/nginx2.your_domain /etc/nginx/sites-enabled/nginx2.your_domain
测试 Nginx 配置以确保没有配置问题:
1sudo nginx -t
然后重新加载 Nginx 如果没有错误:
1sudo systemctl reload nginx
现在,通过访问 http://nginx1.your_domain/info.php 和 http://nginx2.your_domain/info.php 访问 Web 浏览器中的两个 Nginx 虚拟主机的 phpinfo()
文件。
SERVER_SOFTWARE
应该说nginx
,表示这些文件是由 Nginx 直接提供的。
在此时刻,我们已经安装了 Nginx 并创建了两个虚拟主机,接下来我们将配置 Nginx 来为在 Apache 上托管的域名提供代理请求。
第7步:为Apache的虚拟主机配置 Nginx
让我们在server_name
指令中创建一个额外的 Nginx 虚拟主机,其中包含多个域名。
创建一个新的 Nginx 虚拟主机文件,将请求转发到 Apache:
1sudo nano /etc/nginx/sites-available/apache
添加以下代码块;它指定了Apache虚拟主机域的名称,并向Apache代理他们的请求,请记住在proxy_pass
中使用公共IP地址:
1[label /etc/nginx/sites-available/apache]
2server {
3 listen 80;
4 server_name apache1.your_domain www.apache1.your_domain apache2.your_domain www.apache2.your_domain;
5
6 location / {
7 proxy_pass http://your_server_ip:8080;
8 proxy_set_header Host $host;
9 proxy_set_header X-Real-IP $remote_addr;
10 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
11 proxy_set_header X-Forwarded-Proto $scheme;
12 }
13}
保存文件并通过创建象征链接启用这个新的虚拟主机:
1sudo ln -s /etc/nginx/sites-available/apache /etc/nginx/sites-enabled/apache
测试配置以确保没有错误:
1sudo nginx -t
如果没有错误,请重新加载 Nginx:
1sudo systemctl reload nginx
打开浏览器并访问您的浏览器中的 URL http://apache1.your_domain/info.php
. 向下滚动到 PHP 变量 部分并检查显示的值。
变量 SERVER_SOFTWARE 和** DOCUMENT_ROOT** 证实该请求由Apache处理。变量** HTTP_X_REAL_IP** 和** HTTP_X_FORWARDED_FOR** 由Nginx添加,应该显示您使用访问URL的计算机的公共IP地址(如果您直接在端口 8080
上访问了Apache,则不会看到这些变量)。
我们已经成功设置了 Nginx 来向 Apache 提供特定域的代理请求,接下来,让我们将 Apache 配置为将REMOTE_ADDR
变量设置为直接处理这些请求。
第8步:安装和配置mod_rpaf
在此步骤中,您将安装一个名为mod_rpaf
的Apache模块,该模块会根据反向代理提供的值重写 REMOTE_ADDR 、** HTTPS** 和** HTTP_PORT** 的值。如果没有这个模块,一些PHP应用程序将需要代码更改,以便从代理程序后面无缝工作。
移动到您的主目录并安装构建模块所需的包:
1sudo apt install unzip build-essential apache2-dev
从GitHub下载最新稳定版本:
1wget https://github.com/gnif/mod_rpaf/archive/stable.zip
提取下载的文件:
1unzip stable.zip
更改包含文件的新目录:
1cd mod_rpaf-stable
编译和安装模块:
1make
2sudo make install
接下来,在mods-available
目录中创建一个文件,将加载rpaf
模块:
1sudo nano /etc/apache2/mods-available/rpaf.load
将下列代码添加到文件中来加载模块:
1[label /etc/apache2/mods-available/rpaf.load]
2LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf.so
保存文件并离开编辑器。
在此目录中创建另一个名为rpaf.conf
的文件,该文件将包含对mod_rpaf
的配置指令:
1sudo nano /etc/apache2/mods-available/rpaf.conf
添加以下代码块来配置mod_rpaf,确保您指定服务器的IP地址:
1[label /etc/apache2/mods-available/rpaf.conf]
2 <IfModule mod_rpaf.c>
3 RPAF_Enable On
4 RPAF_Header X-Real-Ip
5 RPAF_ProxyIPs your_server_ip
6 RPAF_SetHostName On
7 RPAF_SetHTTPS On
8 RPAF_SetPort On
9 </IfModule>
请参阅)以获得更多信息。
RPAF_Header - 用于客户端的实际IP地址的标题.* RPAF_ProxyIPs* - 调节HTTP请求的代理IP。** RPAF_SetHostName* - 更新vhost名称以便ServerName
和ServerAlias
工作。** RPAF_SetHTTPS* - 根据X-Forwarded-Proto
中包含的值设置了HTTPS
环境变量。
保存rpaf.conf
并启用该模块:
1sudo a2enmod rpaf
这将创建mods-enabled
目录中的rpaf.load
和rpaf.conf
文件的符号链接。
1sudo apachectl -t
重新加载Apache如果没有错误:
1sudo systemctl reload apache2
访问您的浏览器中的phpinfo()
页面http://apache1.your_domain/info.php
和http://apache2.your_domain/info.php
并检查PHP变量
部分。
现在让我们为每个网站设置TLS/SSL加密。
步骤 9 — 使用 Let's Encrypt 设置 HTTPS 网站(可选)
在此步骤中,我们将为在 Apache 上托管的两个域配置 TLS/SSL 证书。我们将通过 Let's Encrypt获取证书。 Nginx 支持 SSL 终止,因此我们可以设置 SSL 而不修改 Apache 的配置文件。 mod_rpaf
模块确保在 Apache 上设置所需的环境变量,以使应用程序在 SSL 反向代理程序后无缝工作。
首先,我们将将两个域的服务器 {...}
块分开,以便每个域都有自己的SSL证书。在您的编辑器中打开文件 `/etc/nginx/sites-available/apache:
1sudo nano /etc/nginx/sites-available/apache
修改文件,使其看起来像这样,在自己的服务器
块中使用apache1.your_domain
和apache2.your_domain
:
1[label /etc/nginx/sites-available/apache]
2 server {
3 listen 80;
4 server_name apache1.your_domain www.apache1.your_domain;
5
6 location / {
7 proxy_pass http://your_server_ip:8080;
8 proxy_set_header Host $host;
9 proxy_set_header X-Real-IP $remote_addr;
10 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
11 proxy_set_header X-Forwarded-Proto $scheme;
12 }
13 }
14 server {
15 listen 80;
16 server_name apache2.your_domain www.apache2.your_domain;
17
18 location / {
19 proxy_pass http://your_server_ip:8080;
20 proxy_set_header Host $host;
21 proxy_set_header X-Real-IP $remote_addr;
22 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
23 proxy_set_header X-Forwarded-Proto $scheme;
24 }
25 }
我们将使用 Certbot来生成我们的TLS/SSL证书,其 Nginx插件将负责重新配置 Nginx,并在需要时重新加载配置。
使用Snapd安装certbot
1sudo snap install --classic certbot
一旦安装,请使用certbot
命令生成apache1.your_domain
和www.apache1.your_domain
的证书:
1sudo certbot --agree-tos --no-eff-email --email your-email --nginx -d apache1.your_domain -d www.apache1.your_domain
这个命令告诉Certbot使用nginx
插件,使用-d
来指定我们希望证书有效的名称。
现在执行第二个域的命令:
1sudo certbot --agree-tos --no-eff-email --email your-email --nginx -d apache2.your_domain -d www.apache2.your_domain
您可以在浏览器中使用https://
前缀访问Apache的域名之一;请访问https://apache1.your_domain/info.php
或https://apache2.your_domain/info.php
。
请参阅 PHP 变量 部分,变量** SERVER_PORT** 已设置为** 443** 和** HTTPS** 设置为** on** ,就好像 Apache 是通过 HTTPS 直接访问的。
现在,让我们禁用直接访问Apache。
步骤 10 — 阻止直接访问 Apache (可选)
由于Apache在公共IP地址上的端口8080
上倾听,所以它可以被所有人访问,可以通过在您的防火墙规则集中使用以下IPtables命令来阻止它。
1sudo iptables -I INPUT -p tcp --dport 8080 ! -s your_server_ip -j REJECT --reject-with tcp-reset
请确保使用您的服务器的 IP 地址,而不是所示的示例。一旦您的防火墙中被阻止的端口 8080,请测试它是否无法访问 Apache. 打开您的 Web 浏览器并尝试在端口
80 上访问 Apache 的域名之一。
浏览器应该显示无法连接
或网页不可用
错误消息. IPtables的tcp-reset
选项可用,外部用户不会看到端口8080
和没有任何服务的端口之间的差异。
<$>[注] 注: IPtables 规则无法默认地重新启动系统。有几种方法可以保存 IPtables 规则,但最简单的方法是在 Ubuntu 存储库中使用 iptables-persistent
。 探索 这篇文章以了解如何配置 IPTables。 <$>
现在,让我们配置 Nginx 来为 Apache 站点提供静态文件。
步骤 11 — 使用 Nginx 服务静态文件(可选)
当 Nginx 代理人请求 Apache 域时,它会将该域的每个文件请求发送给 Apache. Nginx 比 Apache 更快地提供像图像、JavaScript 和风格表这样的静态文件。
在您的编辑器中打开文件 /etc/nginx/sites-available/apache
:
1sudo nano /etc/nginx/sites-available/apache
您需要为每个服务器块添加两个额外的位置
块,以及修改现有的位置
部分,此外,您还需要告诉 Nginx在哪里找到每个网站的静态文件。
如果您已决定不使用 SSL 和 TLS 证书,请修改您的文件以使其看起来如下:
1[label /etc/nginx/sites-available/apache]
2server {
3 listen 80;
4 server_name apache2.your_domain www.apache2.your_domain;
5 root /var/www/your_domain;
6 index index.php index.htm index.html;
7
8 location / {
9 try_files $uri $uri/ /index.php;
10 }
11
12 location ~ \.php$ {
13 proxy_pass http://your_server_ip:8080;
14 proxy_set_header Host $host;
15 proxy_set_header X-Real-IP $remote_addr;
16 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
17 proxy_set_header X-Forwarded-Proto $scheme;
18 }
19
20 location ~ /\.ht {
21 deny all;
22 }
23}
24
25server {
26 listen 80;
27 server_name apache1.your_domain www.apache1.your_domain;
28 root /var/www/your_domain;
29 index index.php index.htm index.html;
30
31 location / {
32 try_files $uri $uri/ /index.php;
33 }
34
35 location ~ \.php$ {
36 proxy_pass http://your_ip_address:8080;
37 proxy_set_header Host $host;
38 proxy_set_header X-Real-IP $remote_addr;
39 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
40 proxy_set_header X-Forwarded-Proto $scheme;
41 }
42
43 location ~ /\.ht {
44 deny all;
45 }
46}
如果您也希望 HTTPS 可用,请使用以下配置:
1[label /etc/nginx/sites-available/apache]
2server {
3 listen 80;
4 server_name apache2.your_domain www.apache2.your_domain;
5 root /var/www/your_domain;
6 index index.php index.htm index.html;
7
8 location / {
9 try_files $uri $uri/ /index.php;
10 }
11
12 location ~ \.php$ {
13 proxy_pass http://your_server_ip:8080;
14 proxy_set_header Host $host;
15 proxy_set_header X-Real-IP $remote_addr;
16 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
17 proxy_set_header X-Forwarded-Proto $scheme;
18 }
19
20 location ~ /\.ht {
21 deny all;
22 }
23
24 listen 443 ssl;
25 ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
26 ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
27 include /etc/letsencrypt/options-ssl-nginx.conf;
28 ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
29}
30
31server {
32 listen 80;
33 server_name apache1.your_domain www.apache1.your_domain;
34 root /var/www/your_domain;
35 index index.php index.htm index.html;
36
37 location / {
38 try_files $uri $uri/ /index.php;
39 }
40
41 location ~ \.php$ {
42 proxy_pass http://your_ip_address:8080;
43 proxy_set_header Host $host;
44 proxy_set_header X-Real-IP $remote_addr;
45 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
46 proxy_set_header X-Forwarded-Proto $scheme;
47 }
48
49 location ~ /\.ht {
50 deny all;
51 }
52
53 listen 443 ssl;
54 ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
55 ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
56 include /etc/letsencrypt/options-ssl-nginx.conf;
57 ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
58}
「try_files」指令使 Nginx 在文档根中搜索文件并直接服务它们. 如果文件具有 `.php' 扩展,请求将传递给 Apache. 即使在文档根中没有找到文件,请求也会传递给 Apache,以便应用程序功能如 permalinks 无问题地工作。
<$>[警告] 警告: 位置 ~ /\.ht
指令非常重要;这防止 Nginx 服务于包含敏感信息的 Apache 配置文件的内容,如 .htaccess 和
.htpasswd。
保存文件并执行配置测试:
1sudo nginx -t
重新加载 Nginx 如果测试成功:
1sudo service nginx reload
要验证事情的运行,你可以检查Apache的日志文件在/var/log/apache2
并查看info.php
文件的info.php
请求apache2.your_domain
和apache1.your_domain
。
1sudo tail -f /var/log/apache2/other_vhosts_access.log
现在请访问您的浏览器中的apache1.your_domain/info.php
或apache2.your_domain/info.php
,然后从日志中查看输出。
1[secondary_label Output]
2 apache2.your_domain:80 your_server_ip - - [27/Aug/2020:18:18:34 -0400] "GET /info.php HTTP/1.0" 200 20414 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
然后访问每个网站的index.html
页面,你不会看到任何来自Apache的日志条目。
当您完成观察日志文件时,请按CTRL+C
以停止尾声。
通过此设置,Apache将无法限制对静态文件的访问,静态文件的访问控制需要在Nginx的apache
虚拟主机文件中进行配置,但这超出了本教程的范围。
结论
现在你有一个 Ubuntu 服务器, Nginx 服务于 nginx1.your_domain
和 nginx2.your_domain
,以及 Apache 服务于 apache1.your_domain
和 apache2.your_domain
。 虽然 Nginx 是 Apache 的反向代理,但 Nginx 的代理服务是透明的,并且 Apache 域的连接似乎是直接从 Apache 服务的。