作者选择了电子前沿基金会作为Write for DOnations计划的一部分接受捐赠。
介绍
Apache 和 Nginx 是两种流行的开源 Web 服务器,通常与 PHP 一起使用。当托管具有不同要求的多个网站时,在同一虚拟机上运行它们会很有用。在单个系统上运行两个 Web 服务器的一般解决方案是使用多个 IP 地址或不同的端口号。
可以将同时具有 IPv4 和 IPv6 地址的服务器配置为在一种协议上为 Apache 站点提供服务,在另一种协议上为 Nginx 站点提供服务,但这目前并不实用,因为 ISP 对 IPv6 的采用仍然不普遍。拥有像一个不同的端口号81
或8080
第二web服务器是另一种解决方案,但与端口号分享的网址(例如)并不总是合理的或理想的。http://your_domain:81
在本教程中,您将 Nginx 配置为 Web 服务器和 Apache 的反向代理——所有这些都在单个服务器上。
根据 Web 应用程序,可能需要更改代码以保持 Apache 反向代理感知,尤其是在配置 SSL 站点时。为了避免这种情况,您将安装一个名为 Apache 的模块mod_rpaf
,它会重写某些环境变量,因此 Apache 似乎是直接处理来自 Web 客户端的请求。
我们将在一台服务器上托管四个域名。Nginx 将提供两个服务:(默认虚拟主机)和. 剩下的两个和将由 Apache 提供服务。我们还将配置 Apache 以使用 PHP-FPM 为 PHP 应用程序提供服务,这提供了比.nginx1.your_domain
nginx2.your_domain
apache1.your_domain
apache2.your_domain
mod_php
先决条件
要完成本教程,您需要具备以下条件:
- 一个新的 Ubuntu 20.04 服务器,按照Ubuntu 20.04的初始服务器设置进行配置,具有 sudo 非 root 用户和防火墙。
- 四个完全限定域名配置为指向您的服务器的 IP 地址。有关如何执行此操作的示例,请参阅如何使用 DigitalOcean 设置主机名的步骤 3 。如果您在其他地方托管域的 DNS,您应该在那里创建适当的 A 记录。
第 1 步 – 安装 Apache 和 PHP-FPM
让我们从安装 Apache 和 PHP-FPM 开始。
除了 Apache 和 PHP-FPM,我们还将安装 PHP FastCGI Apache 模块libapache2-mod-fastcgi
,以支持 FastCGI Web 应用程序。
首先,更新您的软件包列表以确保您拥有最新的软件包。
- sudo apt update
接下来,安装 Apache 和 PHP-FPM 包:
- sudo apt install apache2 php-fpm
FastCGI Apache 模块在 Ubuntu 的存储库中不可用,所以从kernel.org下载它并使用dpkg
命令安装它。
- wget https://mirrors.edge.kernel.org/ubuntu/pool/multiverse/liba/libapache-mod-fastcgi/libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb
- sudo dpkg -i libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb
接下来,让我们更改 Apache 的默认配置以使用 PHP-FPM。
第 2 步 – 配置 Apache 和 PHP-FPM
在这一步中,我们将8080
使用mod_fastcgi
模块将 Apache 的端口号更改为并配置它以与 PHP-FPM 一起使用。重命名Apache的ports.conf
配置文件:
- sudo mv /etc/apache2/ports.conf /etc/apache2/ports.conf.default
创建一个ports.conf
端口设置为的新文件8080
:
- echo "Listen 8080" | sudo tee /etc/apache2/ports.conf
注意: Web 服务器通常127.0.0.1:8080
在配置反向代理时设置为侦听,但这样做会将 PHP 的环境变量SERVER_ADDR的值设置为环回 IP 地址而不是服务器的公共 IP。我们的目标是设置 Apache,使其网站不会在其前面看到反向代理。因此,我们将其配置为侦听8080
所有 IP 地址。
接下来,我们将为 Apache 创建一个虚拟主机文件。<VirtualHost>
此文件中的指令将设置为仅在端口上为站点提供服务8080
。
禁用默认虚拟主机:
- sudo a2dissite 000-default
然后使用现有的默认站点创建一个新的虚拟主机文件:
- sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/001-default.conf
现在打开新的配置文件:
- sudo nano /etc/apache2/sites-available/001-default.conf
将侦听端口更改为8080
:
<VirtualHost *:8080>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
保存文件并激活新的配置文件:
- sudo a2ensite 001-default
然后重新加载Apache:
- sudo systemctl reload apache2
安装net-tools
包含以下netstat
命令的包:
- sudo apt install net-tools
验证 Apache 现在正在侦听8080
:
- sudo netstat -tlpn
输出应类似于以下示例,并apache2
监听8080
:
OutputActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1086/sshd
tcp6 0 0 :::8080 :::* LISTEN 4678/apache2
tcp6 0 0 :::22 :::* LISTEN 1086/sshd
一旦您确认 Apache 正在侦听正确的端口,您就可以配置对 PHP 和 FastCGI 的支持。
第 3 步 – 配置 Apache 以使用 mod_fastcgi
Apachemod_php
默认使用 PHP 页面,但它需要额外的配置才能使用 PHP-FPM。
注意:如果您在使用 的现有 LAMP 安装上尝试本教程mod_php
,请先使用 禁用它sudo a2dismod php7.4
。
我们将为 添加一个配置块mod_fastcgi
,这取决于mod_action
。mod_action
默认情况下是禁用的,所以我们首先需要启用它:
- sudo a2enmod actions
重命名现有的 FastCGI 配置文件:
- sudo mv /etc/apache2/mods-enabled/fastcgi.conf /etc/apache2/mods-enabled/fastcgi.conf.default
创建一个新的配置文件:
- sudo nano /etc/apache2/mods-enabled/fastcgi.conf
将以下指令添加到文件中以将文件请求传递.php
到 PHP-FPM UNIX 套接字:
<IfModule mod_fastcgi.c>
AddHandler fastcgi-script .fcgi
FastCgiIpcDir /var/lib/apache2/fastcgi
AddType application/x-httpd-fastphp .php
Action application/x-httpd-fastphp /php-fcgi
Alias /php-fcgi /usr/lib/cgi-bin/php-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php-fcgi -socket /run/php/php7.4-fpm.sock -pass-header Authorization
<Directory /usr/lib/cgi-bin>
Require all granted
</Directory>
</IfModule>
保存更改并执行配置测试:
- sudo apachectl -t
注意:如果您看到警告,您现在可以放心地忽略它。我们稍后会配置服务器名称。Could not reliably determine the server's fully /
qualified domain name, using 127.0.1.1. Set the /'ServerName' directive globally/
to suppress this message.
重新加载Apache,只要Syntax OK
显示:
- sudo systemctl reload apache2
现在让我们确保我们可以从 Apache 提供 PHP。
第 4 步 – 验证 PHP 功能
让我们通过创建一个phpinfo()
文件并从 Web 浏览器访问它来确保 PHP 正常工作。
创建文件/var/www/html/info.php
,其中包含对phpinfo
函数的调用:
- echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php
请注意,如果您遵循先决条件部分中的初始服务器设置,那么您可能启用了 Apache 防火墙。让我们继续并确保我们可以访问8080
当前无法访问的端口上的 IP 。我们将在步骤 10 中限制对该端口的公共访问。
首先允许端口8080
通过防火墙:
- sudo ufw allow 8080
由于我们要保护我们的 Apache 域,让我们继续确保端口上的 TLS 流量443
可以进入。
允许Apache Full
允许端口上的流量80
和443
:
- sudo ufw allow "Apache Full"
现在检查您的防火墙状态:
- sudo ufw status
如果您遵循先决条件,则输出将如下所示:
OutputTo Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Apache Full ALLOW Anywhere
8080 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Apache Full (v6) ALLOW Anywhere (v6)
8080 (v6) ALLOW Anywhere (v6)
您将看到该端口8080
并Apache Full
允许与任何其他防火墙规则一起使用。现在让我们查看我们的info.php
页面。
要info.php
在浏览器中查看,请转到。这将为您提供 PHP 正在使用的配置设置列表。你会看到类似这样的输出:http://your_server_ip:8080/info.php
在页面的顶部,检查服务器API说FPM / FastCGI的。在页面下方大约三分之二处,PHP 变量部分会告诉您SERVER_SOFTWARE是 Ubuntu 上的 Apache。这些确认mod_fastcgi
是活动的,并且 Apache 正在使用 PHP-FPM 来处理 PHP 文件。
第 5 步 – 为 Apache 创建虚拟主机
让我们为域和. 为此,我们将首先为两个站点创建文档根目录,并在这些目录中放置一些默认文件,以便我们可以轻松测试我们的配置。apache1.your_domain
apache2.your_domain
首先,创建文档根目录:
- sudo mkdir -v /var/www/apache1.your_domain /var/www/apache2.your_domain
然后index
为每个站点创建一个文件:
- echo "<h1 style='color: green;'>Apache 1</h1>" | sudo tee /var/www/apache1.your_domain/index.html
- echo "<h1 style='color: red;'>Apache 2</h1>" | sudo tee /var/www/apache2.your_domain/index.html
然后phpinfo()
为每个站点创建一个文件,以便我们可以测试 PHP 是否配置正确。
- echo "<?php phpinfo(); ?>" | sudo tee /var/www/apache1.your_domain/info.php
- echo "<?php phpinfo(); ?>" | sudo tee /var/www/apache2.your_domain/info.php
现在创建虚拟主机文件:apache1.your_domain
- sudo nano /etc/apache2/sites-available/apache1.your_domain.conf
将以下代码添加到文件中以定义主机:
<VirtualHost *:8080>
ServerName apache1.your_domain
ServerAlias www.apache1.your_domain
DocumentRoot /var/www/apache1.your_domain
<Directory /var/www/apache1.your_domain>
AllowOverride All
</Directory>
</VirtualHost>
该生产线AllowOverride All
可.htaccess
提供支持。
这些只是最基本的指令。有关在 Apache 中设置虚拟主机的完整指南,请参阅如何在 Ubuntu 18.04 上设置 Apache 虚拟主机。
保存并关闭文件。然后为. 首先创建文件:apache2.your_domain
- sudo nano /etc/apache2/sites-available/apache2.your_domain.conf
然后将配置添加到文件中:
<VirtualHost *:8080>
ServerName apache2.your_domain
ServerAlias www.apache2.your_domain
DocumentRoot /var/www/apache2.your_domain
<Directory /var/www/apache2.your_domain
AllowOverride All
</Directory>
</VirtualHost>
保存文件并退出编辑器。
现在两个 Apache 虚拟主机都已设置,使用a2ensite
命令启用站点。这将创建一个指向sites-enabled
目录中虚拟主机文件的符号链接:
- sudo a2ensite apache1.your_domain
- sudo a2ensite apache2.your_domain
再次检查 Apache 是否有配置错误:
- sudo apachectl -t
Syntax OK
如果没有错误,您将看到显示。如果您看到其他任何内容,请检查配置并重试。
一旦您的配置无错误,重新加载 Apache 以应用更改:
- sudo systemctl reload apache2
为了确认该网站是工作,开放和在浏览器中,验证每个站点显示的文件。http://apache1.your_domain:8080
http://apache2.your_domain:8080
index.html
您将看到以下结果:
此外,通过访问info.php
每个站点的文件来确保 PHP 正常工作。访问并在您的浏览器中。http://apache1.your_domain:8080/info.php
http://apache2.your_domain:8080/info.php
您将在每个站点上看到与在步骤 4 中看到的相同的 PHP 配置规范列表。
我们现在在端口 Apache 上托管了两个网站8080
。接下来让我们配置 Nginx。
第 6 步 – 安装和配置 Nginx
在这一步中,我们将安装 Nginx 并配置域并作为 Nginx 的虚拟主机。有关在 Nginx 中设置虚拟主机的完整指南,请参阅如何在 Ubuntu 20.04 上设置 Nginx 服务器块(虚拟主机)。nginx1.your_domain
nginx2.your_domain
使用apt
包管理器安装 Nginx :
- sudo apt install nginx
然后删除默认虚拟主机的符号链接,因为我们将不再使用它:
- sudo rm /etc/nginx/sites-enabled/default
我们稍后将创建我们自己的默认站点 ( )。nginx1.your_domain
现在我们将使用与 Apache 相同的过程为 Nginx 创建虚拟主机。首先为两个网站创建文档根目录:
- sudo 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 的虚拟主机所做的那样,在设置完成后创建index
和phpinfo()
测试文件:
- echo "<h1 style='color: green;'>Nginx 1</h1>" | sudo tee /usr/share/nginx/nginx1.your_domain/index.html
- echo "<h1 style='color: red;'>Nginx 2</h1>" | sudo tee /usr/share/nginx/nginx2.your_domain/index.html
- echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/nginx1.your_domain/info.php
- echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/nginx2.your_domain/info.php
现在为域创建一个虚拟主机文件:nginx1.your_domain
- sudo nano /etc/nginx/sites-available/nginx1.your_domain
Nginx 调用server {. . .}
配置文件服务器块的区域。为主要虚拟主机创建一个服务器块,. 在配置指令使得这个用于处理HTTP不匹配任何其他虚拟主机请求的默认虚拟主机。nginx1.your_domain
default_server
server {
listen 80 default_server;
root /usr/share/nginx/nginx1.your_domain;
index index.php index.html index.htm;
server_name nginx1.your_domain www.nginx1.your_domain;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
include snippets/fastcgi-php.conf;
}
}
保存并关闭文件。现在为 Nginx 的第二个域创建一个虚拟主机文件:nginx2.your_domain
- sudo nano /etc/nginx/sites-available/nginx2.your_domain
将以下内容添加到文件中:
server {
root /usr/share/nginx/nginx2.your_domain;
index index.php index.html index.htm;
server_name nginx2.your_domain www.nginx2.your_domain;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
include snippets/fastcgi-php.conf;
}
}
保存并关闭文件。
通过创建指向sites-enabled
目录的符号链接来启用两个站点:
- sudo ln -s /etc/nginx/sites-available/nginx1.your_domain /etc/nginx/sites-enabled/nginx1.your_domain
- sudo ln -s /etc/nginx/sites-available/nginx2.your_domain /etc/nginx/sites-enabled/nginx2.your_domain
测试 Nginx 配置以确保没有配置问题:
- sudo nginx -t
如果没有错误,则重新加载 Nginx:
- sudo systemctl reload nginx
现在phpinfo()
通过访问http://nginx1在 Web 浏览器中访问两个 Nginx 虚拟主机的文件。您的域/info.php 和http://nginx2。您的域名/info.php。再次查看 PHP 变量部分。
[“SERVER_SOFTWARE”]应该是nginx
,表示这些文件是由 Nginx 直接提供的。[“DOCUMENT_ROOT”]应指向您在此步骤之前为每个 Nginx 站点创建的目录。
至此,我们已经安装了 Nginx 并创建了两个虚拟主机。接下来,我们将配置 Nginx 来代理针对托管在 Apache 上的域的请求。
步骤 7 — 为 Apache 的虚拟主机配置 Nginx
让我们在server_name
指令中创建一个具有多个域名的额外 Nginx 虚拟主机。对这些域名的请求将被代理到 Apache。
创建一个新的 Nginx 虚拟主机文件以将请求转发到 Apache:
- sudo nano /etc/nginx/sites-available/apache
添加以下代码块;它指定了两个 Apache 虚拟主机域的名称并将它们的请求代理到 Apache。请记住在以下位置使用公共 IP 地址proxy_pass
:
server {
listen 80;
server_name apache1.your_domain www.apache1.your_domain apache2.your_domain www.apache2.your_domain;
location / {
proxy_pass http://your_server_ip:8080;
proxy_set_header Host $host;
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 $scheme;
}
}
保存文件并通过创建符号链接启用这个新的虚拟主机:
- sudo ln -s /etc/nginx/sites-available/apache /etc/nginx/sites-enabled/apache
测试配置以确保没有错误:
- sudo nginx -t
如果没有错误,请重新加载 Nginx:
- sudo systemctl reload nginx
打开浏览器并访问浏览器中的 URL 。向下滚动到PHP 变量部分并检查显示的值。http://apache1.your_domain/info.php
变量SERVER_SOFTWARE和DOCUMENT_ROOT确认这个请求是由 Apache 处理的。变量HTTP X REAL_IP和HTTP X FORWARDED_FOR由Nginx的增加了,应当显示您正在使用访问URL的计算机的公共IP地址(如果你直接端口访问Apache的8080
,你不会看到这些变量)。
我们已成功设置 Nginx 以将特定域的请求代理到 Apache。接下来,让我们配置 Apache 以设置REMOTE_ADDR
变量,就好像它直接处理这些请求一样。
步骤 8 — 安装和配置 mod_rpaf
在此步骤中,您将安装一个名为的 Apache 模块mod_rpaf
,该模块根据反向代理提供的值重写REMOTE_ADDR、HTTPS和HTTP_PORT的值。如果没有这个模块,一些 PHP 应用程序需要更改代码才能从代理后面无缝工作。该模块存在于 Ubuntu 的存储库中,libapache2-mod-rpaf
但它已经过时并且不支持某些配置指令。相反,我们将从源代码安装它。
移动到您的主目录并安装构建模块所需的包:
- sudo apt install unzip build-essential apache2-dev
从 GitHub 下载最新的稳定版本:
- wget https://github.com/gnif/mod_rpaf/archive/stable.zip
解压下载的文件:
- unzip stable.zip
切换到包含文件的新目录:
- cd mod_rpaf-stable
编译并安装模块:
- make
- sudo make install
接下来,在mods-available
将加载rpaf
模块的目录中创建一个文件:
- sudo nano /etc/apache2/mods-available/rpaf.load
将以下代码添加到文件中以加载模块:
LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf.so
保存文件并退出编辑器。
在此目录中创建另一个名为的文件,该文件rpaf.conf
将包含以下配置指令mod_rpaf
:
- sudo nano /etc/apache2/mods-available/rpaf.conf
将以下代码块添加到 configure mod_rpaf
,确保指定服务器的 IP 地址:
<IfModule mod_rpaf.c>
RPAF_Enable On
RPAF_Header X-Real-Ip
RPAF_ProxyIPs your_server_ip
RPAF_SetHostName On
RPAF_SetHTTPS On
RPAF_SetPort On
</IfModule>
以下是每个指令的简要说明。有关更多信息,请参阅mod_rpaf
自述文件。
- RPAF_Header – 用于客户端真实 IP 地址的标头。
- RPAF_ProxyIPs – 要为其调整 HTTP 请求的代理 IP。
- RPAF_SetHostName – 更新虚拟主机名称
ServerName
并ServerAlias
工作。 - RPAF_SetHTTPS –
HTTPS
根据中包含的值设置环境变量X-Forwarded-Proto
。 - RPAF_SetPort – 设置
SERVER_PORT
环境变量。当 Apache 位于 SSL 代理后面时很有用。
保存rpaf.conf
并启用模块:
- sudo a2enmod rpaf
这将创建文件的符号链接rpaf.load
,并rpaf.conf
在mods-enabled
目录中。现在做一个配置测试:
- sudo apachectl -t
如果没有错误,请重新加载 Apache:
- sudo systemctl reload apache2
在浏览器中访问phpinfo()
页面并检查PHP 变量部分。该REMOTE_ADDR变量现在也将是你的本地计算机的公网IP地址。http://apache1.your_domain/info.php
http://apache2.your_domain/info.php
现在让我们为每个站点设置 TLS/SSL 加密。
步骤 9 — 使用 Let’s Encrypt 设置 HTTPS 网站(可选)
在此步骤中,我们将为 Apache 上托管的两个域配置 TLS/SSL 证书。我们将通过 [Let’s Encrypt]( https://letsencrypt.org ]获取证书。Nginx 支持 SSL 终止,因此我们可以在不修改 Apache 的配置文件的情况下设置 SSL。该mod_rpaf
模块确保在 Apache 上设置所需的环境变量以使应用程序在 SSL 反向代理后无缝运行。
首先,我们将server {...}
两个域的块分开,以便每个域都可以拥有自己的 SSL 证书。/etc/nginx/sites-available/apache
在编辑器中打开文件:
- sudo nano /etc/nginx/sites-available/apache
修改文件,使其看起来像这样,并在它们自己的块中:apache1.your_domain
apache2.your_domain
server
server {
listen 80;
server_name apache1.your_domain www.apache1.your_domain;
location / {
proxy_pass http://your_server_ip:8080;
proxy_set_header Host $host;
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 $scheme;
}
}
server {
listen 80;
server_name apache2.your_domain www.apache2.your_domain;
location / {
proxy_pass http://your_server_ip:8080;
proxy_set_header Host $host;
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 $scheme;
}
}
我们将使用Certbot生成我们的 TLS/SSL 证书。它的 Nginx 插件将负责重新配置 Nginx 并在必要时重新加载配置。
certbot
使用 snapd安装
- sudo snap install --classic certbot
安装后,使用该 certbot
命令为和生成证书:apache1.your_domain
www.apache1.your_domain
- sudo certbot --agree-tos --no-eff-email --email your-email --nginx -d apache1.your_domain -d www.apache1.your_domain
此命令告诉 Certbot 使用nginx
插件,-d
用于指定我们希望证书有效的名称。
现在为第二个域执行命令:
- sudo 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,就好像通过 HTTPS 直接访问 Apache。设置这些变量后,PHP 应用程序无需专门配置为在反向代理后工作。
现在让我们禁用对 Apache 的直接访问。
步骤 10 — 阻止对 Apache 的直接访问(可选)
由于 Apache 正在侦听8080
公共 IP 地址上的端口,因此每个人都可以访问它。可以通过在防火墙规则集中使用以下 IPtables 命令来阻止它。
- sudo iptables -I INPUT -p tcp --dport 8080 ! -s your_server_ip -j REJECT --reject-with tcp-reset
请务必使用您服务器的 IP 地址代替突出显示的示例。一旦端口8080
在防火墙中被阻止,请测试 Apache 在其上是否无法访问。打开您的网络浏览器并尝试在端口 上访问 Apache 的域名之一8080
。例如:http://apache1。你的域名:8080
浏览器应显示“无法连接”或“网页不可用”错误消息。有了 IPtablestcp-reset
选项,局外人将看不到端口8080
和没有任何服务的端口之间的区别。
注意:默认情况下,IPtables 规则不会在系统重启后继续存在。有多种方法可以保留 IPtables 规则,但最简单的方法是iptables-persistent
在 Ubuntu 的存储库中使用。浏览本文以了解有关如何配置 IPTables 的更多信息。
现在让我们配置 Nginx 为 Apache 站点提供静态文件。
第 11 步 – 使用 Nginx 提供静态文件(可选)
当 Nginx 代理对 Apache 域的请求时,它会将对该域的每个文件请求发送到 Apache。Nginx 在提供静态文件(如图像、JavaScript 和样式表)方面比 Apache 更快。因此,让我们将 Nginx 的apache
虚拟主机文件配置为直接提供静态文件,但将 PHP 请求发送到 Apache。
/etc/nginx/sites-available/apache
在编辑器中打开文件:
- sudo nano /etc/nginx/sites-available/apache
您需要向location
每个服务器块添加两个附加块,并修改现有location
部分。此外,您需要告诉 Nginx 在哪里可以找到每个站点的静态文件。
如果您决定不使用 SSL 和 TLS 证书,请修改您的文件,使其看起来像这样:
server {
listen 80;
server_name apache2.your_domain www.apache2.your_domain;
root /var/www/your_domain;
index index.php index.htm index.html;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
proxy_pass http://your_server_ip:8080;
proxy_set_header Host $host;
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 $scheme;
}
location ~ /\.ht {
deny all;
}
}
server {
listen 80;
server_name apache1.your_domain www.apache1.your_domain;
root /var/www/your_domain;
index index.php index.htm index.html;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
proxy_pass http://your_ip_address:8080;
proxy_set_header Host $host;
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 $scheme;
}
location ~ /\.ht {
deny all;
}
}
如果您还希望 HTTPS 可用,请改用以下配置:
server {
listen 80;
server_name apache2.your_domain www.apache2.your_domain;
root /var/www/your_domain;
index index.php index.htm index.html;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
proxy_pass http://your_server_ip:8080;
proxy_set_header Host $host;
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 $scheme;
}
location ~ /\.ht {
deny all;
}
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
server {
listen 80;
server_name apache1.your_domain www.apache1.your_domain;
root /var/www/your_domain;
index index.php index.htm index.html;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
proxy_pass http://your_ip_address:8080;
proxy_set_header Host $host;
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 $scheme;
}
location ~ /\.ht {
deny all;
}
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
该try_files
指令使 Nginx 在文档根目录中查找文件并直接为它们提供服务。如果文件有.php
扩展名,则请求将传递给 Apache。即使在文档根目录中找不到该文件,请求也会传递给 Apache,以便永久链接等应用程序功能正常工作。
警告:该location ~ /\.ht
指令非常重要;这会阻止 Nginx 提供包含敏感信息的 Apache 配置文件的内容,例如.htaccess
和.htpasswd
。
保存文件并执行配置测试:
- sudo nginx -t
如果测试成功,请重新加载 Nginx:
- sudo service nginx reload
为了验证一切正常,你可以检查Apache的日志文件/var/log/apache2
,看到GET
的请求info.php
的文件和。使用命令查看文件的最后几行,并使用开关观察文件的变化:apache2.your_domain
apache1.your_domain
tail
-f
- sudo tail -f /var/log/apache2/other_vhosts_access.log
现在访问或在您的浏览器中,然后查看日志的输出。您会看到 Apache 确实在回复(您的端口将是或取决于您是否保护了实例):apache1.your_domain/info.php
apache2.your_domain/info.php
80
443
Output 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 的任何日志条目。Nginx 正在为他们服务。
完成对日志文件的观察后,按CTRL+C
停止拖尾。
使用此设置,Apache 将无法限制对静态文件的访问。静态文件的访问控制需要在 Nginx 的apache
虚拟主机文件中配置,但这超出了本教程的范围。
结论
您现在拥有一台带有 Nginx 服务和 的Ubuntu 服务器,以及 Apache 服务和. 尽管 Nginx 充当 Apache 的反向代理,但 Nginx 的代理服务是透明的,与 Apache 域的连接似乎直接由 Apache 本身提供。您可以使用此方法为安全和静态站点提供服务。nginx1.your_domain
nginx2.your_domain
apache1.your_domain
apache2.your_domain