一、环境说明
- 系统:Ubuntu 16.04
- 架构:
- Nginx:监听 80 端口,对外提供服务,处理静态文件
- Apache:监听本机端口 8080,只对本机开放,由 Nginx 反向代理转发 PHP 动态请求
- 适用场景:
- 需要同时用到 Nginx 的高性能静态处理能力
- 又希望继续使用 Apache 的生态(如
.htaccess、各类 Apache 模块)
二、安装 Apache 与 PHP-FPM
sudo apt-get update
# 安装 Apache 与 FastCGI 支持
sudo apt-get install -y apache2 libapache2-mod-fastcgi
# 安装 PHP-FPM 及常用扩展
sudo apt-get install -y \
php7.0-fpm php7.0-mysql php7.0-xml php7.0-mbstring \
php7.0-gd php7.0-curl php7.0-json php7.0-cli php7.0-common
说明:
- 使用
php-fpm方式跑 PHP,而不是libapache2-mod-php7.0。libapache2-mod-fastcgi用于让 Apache 将 PHP 请求转交给 PHP-FPM。
如果系统默认启用了 php7.0 模块(libapache2-mod-php7.0)可以先禁用:
sudo a2dismod php7.0
启用所需模块(FastCGI 依赖 actions 等模块):
sudo a2enmod actions fastcgi alias
三、配置 Apache 监听内网端口
1. 修改监听端口
编辑 /etc/apache2/ports.conf:
sudo nano /etc/apache2/ports.conf
将其中的 Listen 修改或增加为:
Listen 8080
建议监听
0.0.0.0:8080或*:8080,便于本机上的 Nginx 通过 127.0.0.1 访问。
2. 修改默认虚拟主机
编辑 /etc/apache2/sites-available/000-default.conf:
sudo nano /etc/apache2/sites-available/000-default.conf
示例:
<VirtualHost *:8080>
ServerName mydomain.com
ServerAlias www.mydomain.com
DocumentRoot /usr/local/www/mydomain.com
<Directory /usr/local/www/mydomain.com>
AllowOverride All
Require all granted
</Directory>
# 这里可以继续添加日志、Rewrite 等配置
# ErrorLog ${APACHE_LOG_DIR}/error.log
# CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
保存后重载 Apache:
sudo systemctl reload apache2
3. 确认 Apache 监听端口
sudo netstat -tlpn | grep apache2
正常情况下会看到类似输出:
tcp6 0 0 :::8080 :::* LISTEN 3051/apache2
四、精简 Apache 模块与 KeepAlive 设置
由于真正对外提供服务的是 Nginx,Apache 只对 Nginx 提供后端服务,可以做一些精简。
1. 关闭 KeepAlive
编辑 /etc/apache2/apache2.conf:
sudo nano /etc/apache2/apache2.conf
找到(或添加):
KeepAlive Off
2. 禁用不必要模块(示例)
sudo a2dismod deflate
sudo a2dismod cgi
sudo a2dismod autoindex
sudo a2dismod negotiation
sudo a2dismod ssl
实际可根据自己站点需要调整,避免不必要的模块影响性能和安全。
五、配置 Nginx 作为前端服务器
假设 Nginx 的虚拟主机配置文件为 /etc/nginx/sites-available/mydomain.com。
情形一:Nginx 处理静态,PHP/动态交给 Apache
server {
listen 80;
server_name mydomain.com www.mydomain.com;
root /usr/local/www/mydomain.com;
access_log /var/log/nginx/mydomain_access.log;
error_log /var/log/nginx/mydomain_error.log;
# 默认由 Nginx 直接处理静态资源
location / {
try_files $uri $uri/ =404;
}
# 把所有 .php 请求转发给 Apache
location ~ \.php$ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
}
# 防止访问隐藏文件(如 .htaccess、.git 等)
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}
情形二:Nginx 找不到文件时,再交给 Apache(常见于 WordPress 等)
server {
listen 80;
server_name mydomain.com www.mydomain.com;
root /usr/local/www/mydomain.com;
access_log /var/log/nginx/mydomain_access.log;
error_log /var/log/nginx/mydomain_error.log;
# 优先由 Nginx 处理静态,如果找不到再交给后端 Apache
location / {
try_files $uri $uri/ @backend;
}
location @backend {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}
情形三:所有请求都交给 Apache,部分静态由 Nginx 提供
server {
listen 80;
server_name mydomain.com www.mydomain.com;
root /usr/local/www/mydomain.com;
access_log /var/log/nginx/mydomain_access.log;
error_log /var/log/nginx/mydomain_error.log;
# 默认全部请求转发到 Apache
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
}
# 示例1:某些静态目录由 Nginx 直接提供
location /static/ {
try_files $uri $uri/ =404;
}
# 示例2:通过后缀匹配静态资源交给 Nginx
location ~* \.(jpg|jpeg|gif|png|css|zip|pdf|txt|js|flv|swf|html|htm)$ {
try_files $uri =404;
access_log off;
expires 30d;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}
六、获取服务器 IP(可选)
如果需要快速查看服务器 IP,可以执行:
ip addr show eth0 | grep inet | awk '{print $2}' | cut -d / -f1
其中
eth0请根据自己的网卡名称修改(例如ens33、ens160等)。
七、小结
- 使用 Nginx 作为前端,适合做静态资源加速、连接复用和安全控制。
- Apache 放在后端,继续承担 PHP 解析和 Apache 模块相关功能。
- 通过正确设置端口、反向代理请求头(
X-Real-IP、X-Forwarded-For等),可以在后端应用中获得真实客户端 IP。 - 关闭 Apache 的 KeepAlive 并精简模块,可以降低资源占用,提升整体性能与稳定性。