LNMPA LEMPA Ubuntu 16.04 配置Nginx前端Web服务器 Apache后端

0
19

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

  1. 编辑 /etc/apache2/ports.conf,将 Apache 配置为监听某个非标准端口(本案例使用端口 88): Listen 88 注意:如果绑定到 127.0.0.1:8080 时,PHP 环境变量 SERVER_ADDR 会被设置为回环地址,不利于脚本识别真实 IP。为让后端看不到反向代理,应设置为监听 8080 上所有 IP。
  2. 编辑 Apache 默认虚拟主机文件,比如 /etc/apache2/sites-available/000-default.conf<VirtualHost *:88> … </VirtualHost>
  3. 重新加载 Apache: sudo systemctl reload apache2
  4. 验证 Apache 是否正在监听: sudo netstat -tlpn 输出应类似: tcp6 0 0 :::88 :::* LISTEN 3051/apache2
  5. 禁用 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-IPX-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 模块禁用、端口配置等细节
  • 三种配置方案可分别满足不同的项目需求

发布回复

请输入评论!
请输入你的名字