LNMPA / LEMPA 在 Ubuntu 16.04 上配置:Nginx 前端 + Apache 后端
(即 Nginx 做静态/前端,Apache 处理 PHP 脚本)
1. 安装 Apache 和 PHP-FPM,并在 Apache 中安装 mod_rpaf
首先更新系统并安装 Apache、FastCGI 模块、mod_rpaf(用于将真实访客 IP 转发给 Apache),以及 PHP-FPM 和所需 PHP 扩展:
sudo apt-get update
sudo apt-get install apache2 libapache2-mod-fastcgi libapache2-mod-rpaf php-fpm
接着配置 Apache 使用 mod_fastcgi:
sudo a2dismod php7.0
# mod_fastcgi 依赖 mod_action,而 mod_action 默认被禁用,所以先启用它
sudo a2enmod actions
sudo apt install php7.0-fpm php7.0-mbstring php7.0-xml php7.0-mysql php7.0-common php7.0-gd php7.0-json php7.0-cli php7.0-curl libapache2-mod-php7.0
2. 配置 Apache 与 PHP-FPM
- 编辑
/etc/apache2/ports.conf,将 Apache 配置为监听某个非标准端口(本案例使用端口 88):Listen 88注意:如果绑定到 127.0.0.1:8080 时,PHP 环境变量SERVER_ADDR会被设置为回环地址,不利于脚本识别真实 IP。为让后端看不到反向代理,应设置为监听 8080 上所有 IP。 - 编辑 Apache 默认虚拟主机文件,比如
/etc/apache2/sites-available/000-default.conf:<VirtualHost *:88> … </VirtualHost> - 重新加载 Apache:
sudo systemctl reload apache2 - 验证 Apache 是否正在监听:
sudo netstat -tlpn输出应类似:tcp6 0 0 :::88 :::* LISTEN 3051/apache2 - 禁用 Apache 中不必要的模块,以及禁用 KeepAlive(因为由 Nginx 做前端):
- 在
/etc/apache2/apache2.conf中将KeepAlive改为Off - 执行:
sudo a2dismod deflate sudo a2dismod cgi sudo a2dismod autoindex sudo a2dismod negotiation sudo a2dismod ssl
- 在
3. 配置 Nginx 作为前端 Web 服务器
示例配置:将所有 .php 请求转发给 Apache,静态文件由 Nginx 直接处理。
server {
root /usr/local/www/mydomain.com;
server_name mydomain.com www.mydomain.com;
access_log logs/mydomain_access.log;
error_log logs/mydomain_error.log;
location / {
# 主机根目录:默认由 Nginx 处理
}
location ~ \.php {
# 捕获所有以 .php 结尾的请求
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
}
# 防止访问隐藏文件如 .htaccess, .bashrc 等
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 或 .htaccess 重写场景):
server {
root /usr/local/www/mydomain.com;
server_name mydomain.com www.mydomain.com;
access_log logs/mydomain_access.log;
error_log logs/mydomain_error.log;
location / {
try_files $uri $uri/ @backend;
}
location @backend {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
}
# …其余同上
}
如果你更愿意将所有请求都转发到 Apache(尽管仍由 Nginx 做前端代理):
server {
root /usr/local/www/mydomain.com;
server_name mydomain.com www.mydomain.com;
access_log logs/mydomain_access.log;
error_log logs/mydomain_error.log;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
}
# 示例1 – 指定某些静态目录从 Nginx 提供
location /css { }
# 示例2 – 使用正则匹配某些扩展名由 Nginx 提供
location ~* ^.+\.(jpg|jpeg|gif|png|css|zip|pdf|txt|js|flv|swf|html|htm)$ {
# 直接由 Nginx 提供这些静态资源
}
}
4. 获取服务器 IP 地址(简单方法)
ip addr show eth0 | grep inet | awk '{print $2}' | cut -d / -f1
小结
- 使用 Nginx 做前端,高效提供静态资源,处理代理/转发。
- Apache 放在后端处理 PHP 脚本,支持传统 Apache 模块、.htaccess 等。
- 注意端口配置、模块禁用及转发头(如
X-Real-IP、X-Forwarded-For)的正确设置,确保访客真实 IP 能被后端脚本获取。
如果你愿意,我可以帮你把这篇整理成 Markdown 格式(代码块、标题、目录、注释齐全)或者适配你所用的博客平台样式。你看需要吗?
你说:
Markdown 格式
ChatGPT 说:
好的,给你整理成干净、可直接发布的 Markdown 版本,排版、结构、代码块都处理好了👇
(如果你需要加目录、加脚注、适配某种博客主题,也可以继续告诉我)
LNMPA / LEMPA 在 Ubuntu 16.04 上配置
Nginx 作为前端 Web,Apache 作为后端 PHP 处理器
1. 安装 Apache、PHP-FPM 与 mod_rpaf
sudo apt-get update
sudo apt-get install apache2 libapache2-mod-fastcgi libapache2-mod-rpaf php-fpm
禁用 Apache 自带的 PHP 模块并启用必要扩展:
sudo a2dismod php7.0
sudo a2enmod actions
sudo apt install php7.0-fpm php7.0-mbstring php7.0-xml php7.0-mysql \
php7.0-common php7.0-gd php7.0-json php7.0-cli php7.0-curl \
libapache2-mod-php7.0
2. 配置 Apache
2.1 修改监听端口
编辑:
/etc/apache2/ports.conf
改为:
Listen 88
(或监听 8080 等端口)
2.2 修改默认虚拟主机
/etc/apache2/sites-available/000-default.conf
修改为:
<VirtualHost *:88>
...
</VirtualHost>
2.3 重载 Apache
sudo systemctl reload apache2
检查监听:
sudo netstat -tlpn
看到类似输出:
tcp6 0 0 :::88 :::* LISTEN 3051/apache2
2.4 禁用不需要的模块、关闭 KeepAlive
sudo a2dismod deflate
sudo a2dismod cgi
sudo a2dismod autoindex
sudo a2dismod negotiation
sudo a2dismod ssl
编辑:
/etc/apache2/apache2.conf
设置:
KeepAlive Off
3. 配置 Nginx(前端服务器)
➤ 方案 1:静态由 Nginx 处理,PHP 转发给 Apache
server {
root /usr/local/www/mydomain.com;
server_name mydomain.com www.mydomain.com;
access_log logs/mydomain_access.log;
error_log logs/mydomain_error.log;
location / {
# 静态资源由 Nginx 自己处理
}
location ~ \.php {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
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;
}
}
➤ 方案 2:try_files,找不到才交给 Apache(WordPress等推荐)
server {
root /usr/local/www/mydomain.com;
server_name mydomain.com www.mydomain.com;
access_log logs/mydomain_access.log;
error_log logs/mydomain_error.log;
location / {
try_files $uri $uri/ @backend;
}
location @backend {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
}
# 其余配置同上
}
➤ 方案 3:所有请求转发给 Apache(Nginx 仅做反代)
server {
root /usr/local/www/mydomain.com;
server_name mydomain.com www.mydomain.com;
access_log logs/mydomain_access.log;
error_log logs/mydomain_error.log;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
}
# 示例:特定静态目录仍由 Nginx 提供
location /css { }
# 示例:匹配常见静态扩展名
location ~* ^.+\.(jpg|jpeg|gif|png|css|zip|pdf|txt|js|flv|swf|html|htm)$ {
# 静态文件直接由 Nginx 提供
}
}
4. 获取服务器 IP(简单方式)
ip addr show eth0 | grep inet | awk '{print $2}' | cut -d / -f1
总结
- Nginx:负责前端流量、高性能静态文件、反向代理
- Apache:负责后端 PHP 解析、兼容性强,支持
.htaccess - 注意 真实 IP 转发 (
X-Real-IP)、Apache 模块禁用、端口配置等细节 - 三种配置方案可分别满足不同的项目需求








