LNMPA / LEMPA 在 Ubuntu 16.04 上配置:Nginx 作为前端 Web 服务器,Apache 作为后端,主要用于处理 PHP

一、环境说明

  • 系统: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 请根据自己的网卡名称修改(例如 ens33ens160 等)。


七、小结

  • 使用 Nginx 作为前端,适合做静态资源加速、连接复用和安全控制。
  • Apache 放在后端,继续承担 PHP 解析和 Apache 模块相关功能。
  • 通过正确设置端口、反向代理请求头(X-Real-IPX-Forwarded-For 等),可以在后端应用中获得真实客户端 IP。
  • 关闭 Apache 的 KeepAlive 并精简模块,可以降低资源占用,提升整体性能与稳定性。