ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Nginx 进阶(HTTPS / 动态站点 / PHP / 反向代理)与 ECshop 实战

Nginx 进阶(HTTPS / 动态站点 / PHP / 反向代理)与 ECshop 实战

Nginx 进阶(HTTPS / 动态站点 / PHP / 反向代理)与 ECshop 实战

本文主要讲解Nginx 进阶(HTTPS / 动态站点 / PHP / 反向代理)与 ECshop 实战,每个概念讲清「是什么、为什么、怎么用」,每条命令解释「意图和原因」,并通过对比表格、架构图解、逐步操作帮助理解。

📌 标注约定:【使用频率】极高 / 高 / 中 / 低;⭐ 重点 🔺 难点(易踩坑) 💡 生产经验

🔧本文统一使用的实验环境:

角色主机名IP 地址
通用服务端server10.1.8.11
客户端client(client.hero.cloud)10.1.8.12
代理 / 主站proxy、www(proxy.hero.cloud)10.1.8.20
后端 Web 1nginx1(nginx1.hero.cloud)10.1.8.21
后端 Web 2nginx2(nginx2.hero.cloud)10.1.8.22
后端 Web 3nginx3(nginx3.hero.cloud)10.1.8.23
  • 域名统一为hero.cloud;
  • 数据库相关密码统一为123。

今日内容地图:

章内容
1配置 SSL/TLS(HTTPS)
2静态站点 vs 动态站点
3PHP 站点(LNMP)
4反向代理原理
5location 与 proxy_pass 配置
6⭐ 反向代理实践(代理本地 / 远端,逐步)
7⭐ 项目实战 ECshop(综合实践,逐步)

文章目录

  • Nginx 进阶(HTTPS / 动态站点 / PHP / 反向代理)与 ECshop 实战
  • 第 1 章 配置 SSL/TLS(HTTPS)
    • 1.1 先理解:HTTP、HTTPS、证书
    • 1.2 ⭐ 三步生成自签名证书
    • 1.3 配置 HTTPS 站点
    • 1.4 HTTP 自动跳转 HTTPS(⭐ 常用)
    • 1.5 客户端测试
  • 第 2 章 静态站点 vs 动态站点
    • 2.1 核心区别
    • 2.2 ⭐ 全面对比
  • 第 3 章 PHP 站点(LNMP)
    • 3.1 Nginx 如何处理 PHP(🔺 流程)
    • 3.2 安装 PHP
    • 3.3 配置 Nginx 支持 PHP(⭐)
    • 3.4 配置分离(推荐做法)
  • 第 4 章 反向代理原理
    • 4.1 定义
    • 4.2 ⭐ 正向代理 vs 反向代理(高频面试)
    • 4.3 反向代理的作用
  • 第 5 章 location 与 proxy_pass 配置(🔺 核心)
    • 5.1 两个核心指令
    • 5.2 ⭐ location 五级匹配规则(优先级从高到低)
    • 5.3 🔺 proxy_pass 末尾带不带 / 的区别(极易出错)
    • 5.4 upstream 后端集群与转发头
    • 5.5 综合匹配示例
  • 第 6 章 ⭐ 反向代理实践(逐步操作)
    • 6.1 第一步:所有节点配置 hosts 与主机名
    • 6.2 第二步:配置三台后端 nginx(nginx1/2/3)
    • 6.3 第三步:配置 proxy 前端基础站点
    • 6.4 实践 A:代理「本地」目录(理解 location 优先级)
      • A-1 无符号(普通前缀)匹配
      • A-2 正则匹配
      • A-3 精确匹配
    • 6.5 实践 B:代理「远端」服务器(proxy_pass)
      • B-1 无符号(普通前缀)匹配
      • B-2 正则匹配
      • B-3 精确匹配
  • 第 7 章 ⭐ 项目实战:ECshop(综合实践,逐步)
    • 7.1 第一步:安装 Nginx
    • 7.2 第二步:安装并初始化 MariaDB
    • 7.3 第三步:安装 PHP 与 PHP-FPM
    • 7.4 第四步:配置商城虚拟主机
    • 7.5 第五步:创建商城数据库和账号
    • 7.6 第六步:部署 ECshop 文件
    • 7.7 第七步:浏览器执行安装向导
    • 7.8 第八步:访问前台与后台
  • 总结篇
    • 一、核心知识链路
    • 二、重点 / 难点 / 频率
    • 三、易错清单
    • 四、面试速记

第 1 章 配置 SSL/TLS(HTTPS)

【使用频率:高】现在几乎所有对外网站都强制 HTTPS。

1.1 先理解:HTTP、HTTPS、证书

  • HTTP(80 端口):数据明文传输,中间人可窃听、篡改。
  • HTTPS(443 端口):HTTP + SSL/TLS 加密,数据加密传输,并能验证服务器身份。
  • 证书的作用:由权威 CA(证书颁发机构)签发,证明"这个网站确实是它声称的那个"。
  • 实验环境没有 CA,我们做自签名证书(自己给自己签发),浏览器会提示"不安全",但加密功能完整。

证书涉及三个文件:

文件含义
私钥 .key服务器自己保管,绝不外泄,用来解密/签名
CSR .csr证书签名请求,包含网站信息,提交给 CA
证书 .crt用私钥签名后生成,发给浏览器的"身份证"

1.2 ⭐ 三步生成自签名证书

mkdircerts&&cdcerts# ① 生成 2048 位私钥openssl genrsa-outwww.key2048# ② 用私钥生成证书请求文件 CSRopenssl req-new-keywww.key-outwww.csr\-subj"/C=CN/ST=JS/L=NJ/O=HERO/OU=DEVOPS/CN=www.hero.cloud/emailAddress=webadmin@hero.cloud"# 🔺 CN 的值必须是网站域名(www.hero.cloud)# ③ 用自己的私钥对 CSR 签名,生成有效期 3650 天的证书openssl x509-req-days3650-inwww.csr-signkeywww.key-outwww.crt

1.3 配置 HTTPS 站点

# 证书放到统一目录mkdir/etc/ssl/certs/www.hero.cloudmvwww* /etc/ssl/certs/www.hero.cloudvim/etc/nginx/conf.d/vhost-www-ssl.conf
server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name www.hero.cloud; root /usr/share/nginx/html; ssl_certificate "/etc/ssl/certs/www.hero.cloud/www.crt"; # 证书(公钥) ssl_certificate_key "/etc/ssl/certs/www.hero.cloud/www.key"; # 私钥 }
systemctl restart nginx

1.4 HTTP 自动跳转 HTTPS(⭐ 常用)

再加一个 80 端口的 server,用 301 永久重定向:

# 上面的 443 server 保持不变…… # 80 端口:所有 http 请求 301 跳转到 https server { listen 80; listen [::]:80; server_name www.hero.cloud; return 301 https://$host$request_uri; # $host 域名,$request_uri 原始路径,保证跳转后页面路径不变 }
nginx-t&&systemctl restart nginx# 防火墙放行 httpsfirewall-cmd --add-service=https--permanentfirewall-cmd--reload

1.5 客户端测试

curlhttp://www.hero.cloud/# 返回 301 Moved Permanentlycurl-khttps://www.hero.cloud/# -k 忽略自签名证书"不安全"警告curl-Lkhttp://www.hero.cloud/# -L 跟随重定向,-k 忽略证书

💡 curl 参数:-k忽略证书校验;-L跟随 301/302 跳转。浏览器访问自签名站点需手动点"继续前往"。


第 2 章 静态站点 vs 动态站点

【使用频率:概念为面试高频,实践天天接触】

2.1 核心区别

  • 静态:页面提前写死成 .html 文件,服务器原样返回,无后端、不查数据库。
  • 动态:请求交给后端程序,程序读写数据库、实时拼接生成页面再返回。

2.2 ⭐ 全面对比

项目静态网站动态网站
内容所有人看到的一样,改内容要改源码因人/因时而异(个人中心、实时库存)
交互只能做前端动画,不能存数据(无法注册/留言/下单)支持注册、留言、下单、搜索、增删改查
服务器依赖只需 Nginx,无需语言环境/数据库Web 服务器 + 运行环境(PHP/JDK/Python)+ 数据库
性能成本极快、省资源、CDN 友好、便宜、SEO 友好需运算查库,高并发耗资源,成本高
典型例子纯官网、落地页、文档站淘宝、知乎、博客后台、管理系统
技术栈HTML+CSS+JS、Hugo/Hexo/VitePressLNMP、SpringBoot+MySQL、Django、Node.js

💡 现代趋势是"前后端分离 + 静态化":前端打包成静态资源放 Nginx/CDN,后端只提供数据接口(API),兼顾速度与交互。


第 3 章 PHP 站点(LNMP)

【使用频率:高】LNMP = Linux + Nginx + MySQL/MariaDB + PHP,是最经典的动态网站架构。

3.1 Nginx 如何处理 PHP(🔺 流程)

Nginx本身不会执行 PHP,需要交给 PHP-FPM:

浏览器请求 .php → Nginx 发现是 PHP 请求 → 通过 FastCGI 协议转发给 PHP-FPM(默认 127.0.0.1:9000) → PHP-FPM 调用 PHP 解释器执行代码 → 结果原路返回 Nginx → 返回浏览器
  • php-fpm:进程管理器,负责接收 Nginx 发来的 PHP 请求;
  • php:解释执行 PHP 代码。

3.2 安装 PHP

yuminstall-yphp php-fpm# 常用扩展一起装yuminstall-yphp-gd php-common php-pear php-mbstring php-mysqlnd# 修改 php-fpm 运行身份(关键,要和 Nginx 一致,否则权限不足)vim/etc/php-fpm.d/www.conf# user = nginx# group = nginxsystemctlenablephp-fpm--nowphp-v# 查看版本

3.3 配置 Nginx 支持 PHP(⭐)

vim/etc/nginx/conf.d/vhost-www.conf
server { listen 80; server_name www.hero.cloud; root /usr/share/nginx/html; # 匹配所有 .php 结尾的请求 location ~ \.php$ { try_files $uri =404; # 文件不存在直接 404(防伪造路径,安全) fastcgi_pass 127.0.0.1:9000; # 转发给 PHP-FPM fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 要执行的脚本绝对路径 include fastcgi_params; # 引入其他必需的 FastCGI 参数 } }
# 准备测试页echo"<?php phpinfo(); ?>">/usr/share/nginx/html/php_info.php nginx-t&&systemctl restart nginx# 客户端测试curlhttp://www.hero.cloud/php_info.php

3.4 配置分离(推荐做法)

把 PHP 的 location 拆到独立文件,主配置更干净:

# vhost-www.conf 的 server 内只加一行 include /etc/nginx/default.d/*.conf;
# /etc/nginx/default.d/php.conflocation ~\.php${try_files$uri=404;fastcgi_pass127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME$document_root$fastcgi_script_name;include fastcgi_params;}

第 4 章 反向代理原理

【使用频率:极高】反向代理是 Nginx 最重要的用途之一。

4.1 定义

反向代理(Reverse Proxy):代理服务器接收外网用户请求,转发给内部后端服务器,再把结果返回用户。客户端只和代理通信,看不到、也不直接连后端 IP。

4.2 ⭐ 正向代理 vs 反向代理(高频面试)

对比正向代理反向代理
代理对象代理客户端(如翻墙、公司上网代理)代理服务器端
客户端是否知情客户端主动配置、知道代理存在客户端无感知,以为代理就是目标服务器
谁被隐藏隐藏客户端隐藏后端服务器
典型HTTP 代理、VPNNginx、负载均衡器

4.3 反向代理的作用

  • 负载均衡:把请求分摊到多个后端,避免单机过载;
  • 缓存:缓存静态文件/热点页面,提速、减压;
  • 动静分离:静态资源 Nginx 直接返回,动态请求才转发后端;
  • 多站点 / 统一入口:一个入口按域名/路径分发到不同后端;
  • 安全:隐藏后端 IP,代理层做限流、拦截。

第 5 章 location 与 proxy_pass 配置(🔺 核心)

5.1 两个核心指令

  • location:定义 URL 路径的匹配规则;
  • proxy_pass:指定把请求转发到哪个后端。

5.2 ⭐ location 五级匹配规则(优先级从高到低)

优先级写法名称命中逻辑
1(最高)location = /path精确匹配URL 与路径完全一致
2location ^~ /path前缀匹配(跳正则)以路径开头,命中后不再检查正则
3location ~ 正则正则(区分大小写)符合正则即命中
3location ~* 正则正则(不区分大小写)符合正则即命中
4location /path普通前缀以路径开头,最长路径优先
5(最低)location /通用兜底所有未命中的请求

💡 多个正则规则按书写顺序,先命中先生效;普通前缀则是最长路径优先。

5.3 🔺 proxy_pass 末尾带不带 / 的区别(极易出错)

情况转发行为例子(location /api/,请求 /api/user/list)
带末尾 /http://后端/剔除location 匹配的前缀→http://后端/user/list
不带 /http://后端保留完整路径→http://后端/api/user/list

5.4 upstream 后端集群与转发头

http { upstream backend { # 定义后端集群,多个 server 自动轮询 server 10.1.8.21; server 10.1.8.22; server 10.1.8.23; } server { listen 80; server_name www.hero.cloud; location / { proxy_pass http://backend; proxy_set_header Host $host; # 传原始域名 proxy_set_header X-Real-IP $remote_addr; # 传客户端真实 IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # IP 链路 proxy_set_header X-Forwarded-Proto $scheme; # 传 http/https } } }

💡 不加X-Real-IP / X-Forwarded-For,后端日志里看到的来访 IP 全是代理机 IP,无法定位真实用户。

5.5 综合匹配示例

请求 URL命中规则转发到
/login= /login登录服务
/static/css/main.css^~ /static/静态服务(/css/main.css)
/img/1.jpg~* \.(jpg|png|gif)$静态服务(/img/1.jpg)
/api/user/info/api/(proxy_pass 带 /)API 服务(/user/info)
/index/兜底主后端服务

第 6 章 ⭐ 反向代理实践(逐步操作)

目标:用proxy(10.1.8.20)作为统一入口,后端有 nginx1/2/3(.21/.22/.23)。

6.1 第一步:所有节点配置 hosts 与主机名

所有节点(含 proxy、nginx1/2/3、client)编辑/etc/hosts:

127.0.0.1 localhost localhost.localdomain ::1 localhost localhost.localdomain 10.1.8.12 client.hero.cloud client 10.1.8.20 www.hero.cloud www 10.1.8.20 proxy.hero.cloud proxy 10.1.8.21 nginx1.hero.cloud nginx1 10.1.8.22 nginx2.hero.cloud nginx2 10.1.8.23 nginx3.hero.cloud nginx3

6.2 第二步:配置三台后端 nginx(nginx1/2/3)

# 每台后端都执行(以 nginx1 为例)yum-yinstallnginx systemctlenablenginx--nowfirewall-cmd --add-service=http--permanentfirewall-cmd --add-service=http# 各自准备不同首页($(hostname) 自动取主机名,便于区分)echoWelcome to$(hostname)>/usr/share/nginx/html/index.html

客户端先直连验证三台后端都正常:

[root@client ~]# curl http://nginx1.hero.cloud/ # Welcome to nginx1.hero.cloud[root@client ~]# curl http://nginx2.hero.cloud/ # Welcome to nginx2.hero.cloud[root@client ~]# curl http://nginx3.hero.cloud/ # Welcome to nginx3.hero.cloud

6.3 第三步:配置 proxy 前端基础站点

# proxy 上准备本地站点目录mkdir/var/nginxecho"Hello, Nginx">/var/nginx/index.htmlecho"Hello, Hero">/var/nginx/test.txtcp/usr/share/nginx/html/nginx-logo.png /var/nginx/
vim/etc/nginx/conf.d/proxy.conf
server { listen 80; server_name www.hero.cloud; location / { root /var/nginx; index index.html; } }
nginx-t&&nginx-sreload

客户端测试:

curlhttp://www.hero.cloud/# Hello, Nginxcurlhttp://www.hero.cloud/test.txt# Hello, Hero

思考:访问一个.nn等未知后缀文件会怎样?
答:该后缀不在mime.types中,Nginx 不知道如何展示,会把文件下载而不是显示内容。


6.4 实践 A:代理「本地」目录(理解 location 优先级)

先在 proxy 上造好测试目录:

# /var/nginx 下的子目录mkdir/var/nginx/nginx{1,2}echo"Hello, I'm here /var/nginx/nginx1">/var/nginx/nginx1/index.htmlecho"Hello, I'm here /var/nginx/nginx2">/var/nginx/nginx2/index.html# 独立目录mkdir/var/nginx1 /var/nginx2echo"Hello, Nginx1">/var/nginx1/index.htmlecho"Hello, Nginx2">/var/nginx2/index.html# www1/www2 目录(给正则、精确匹配用)forp1inwww{1..2};doforp2innginx{1,2};domkdir-p/var/$p1/$p2echo"Hello, I'm here /var/$p1/$p2">/var/$p1/$p2/index.htmldonedone

A-1 无符号(普通前缀)匹配

server { listen 80; server_name www.hero.cloud; location / { root /var/nginx; index index.html; } # 访问 /nginx1/ 时,root /var 拼接 → /var/nginx1 location /nginx1 { root /var; index index.html; } }

测试:

curlhttp://www.hero.cloud/nginx1/# Hello, Nginx1(命中 /nginx1 → /var/nginx1)curlhttp://www.hero.cloud/nginx2/# Hello, I'm here /var/nginx/nginx2(无规则,走 /)

结论:普通前缀匹配优先级高于兜底/。

A-2 正则匹配

在上面基础上加:

location ~ /nginx.* { root /var/www1; index index.html; }

测试:

curlhttp://www.hero.cloud/nginx1/# Hello, I'm here /var/www1/nginx1curlhttp://www.hero.cloud/nginx2/# Hello, I'm here /var/www1/nginx2

结论:正则匹配优先级高于普通前缀。

A-3 精确匹配

再加:

location = /nginx2/index.html { root /var/www2; }

测试:

curlhttp://www.hero.cloud/nginx1/# Hello, I'm here /var/www1/nginx1(走正则)curlhttp://www.hero.cloud/nginx2/# Hello, I'm here /var/www2/nginx2(精确命中首页)

结论:精确匹配优先级高于正则。

💡 三个实验层层递进,正好验证优先级:精确 =>正则 ~>普通前缀>兜底 /。


6.5 实践 B:代理「远端」服务器(proxy_pass)

B-1 无符号(普通前缀)匹配

server { listen 80; server_name www.hero.cloud; index index.html; location / { root /var/nginx; } # /nginx1/ 开头,转发到 nginx1;末尾带 /,会剔除 /nginx1/ 前缀 location /nginx1/ { proxy_pass http://nginx1.hero.cloud/; } }

测试:

curlhttp://www.hero.cloud/nginx1/# Welcome to nginx1.hero.cloud(转发到 nginx1)curlhttp://www.hero.cloud/nginx2/# Hello, I'm here /var/nginx/nginx2(无规则,走本地 /)

B-2 正则匹配

加一条正则,把 nginx1/2/3 都转发到 nginx2:

location ~ /nginx[123].* { rewrite ^/nginx[123](.*)$ $1 break; # 去掉 /nginxX 前缀;[123] 匹配 1/2/3 proxy_pass http://nginx2.hero.cloud; # 不带 URI,配合 rewrite }

测试:

curlhttp://www.hero.cloud/nginx1/# Welcome to nginx2.hero.cloudcurlhttp://www.hero.cloud/nginx2/# Welcome to nginx2.hero.cloudcurlhttp://www.hero.cloud/nginx3/# Welcome to nginx2.hero.cloud

结论:正则优先级高于普通前缀,三个请求都被正则捕获转到 nginx2。

B-3 精确匹配

再加:

location = /nginx3/ { proxy_pass http://nginx3.hero.cloud/; }

测试:

curlhttp://www.hero.cloud/nginx1/# Welcome to nginx2(走正则)curlhttp://www.hero.cloud/nginx2/# Welcome to nginx2(走正则)curlhttp://www.hero.cloud/nginx3/# Welcome to nginx3.hero.cloud(精确命中,转到 nginx3)

结论:精确匹配优先级最高,/nginx3/ 被"抢"回给 nginx3。

🔺 每次改配置都要nginx -t校验,再nginx -s reload;后端、代理的防火墙和 SELinux 也要放行。


第 7 章 ⭐ 项目实战:ECshop(综合实践,逐步)

ECShop 是一套开源在线商城系统,用来把 LNMP 整套知识串起来。环境 CentOS 7.9,可单独开一台机器(如 ecshop)。

7.1 第一步:安装 Nginx

yuminstall-ynginx systemctlenablenginx--nowecho"Nginx Test Page">/usr/share/nginx/html/index.htmlcurlhttp://127.0.0.1/# Nginx Test Page

7.2 第二步:安装并初始化 MariaDB

yuminstall-ymariadb-server systemctlenablemariadb--nowmysql_secure_installation# 按提示:设置 root 密码为 123、删除匿名用户、禁止远程 root、删除测试库

7.3 第三步:安装 PHP 与 PHP-FPM

yuminstall-yphp php-fpm php-gd php-mysqlnd php-mbstring php-common# 修改 php-fpm 运行身份为 nginxvim/etc/php-fpm.d/www.conf# user = nginx# group = nginxsystemctlenablephp-fpm--now

7.4 第四步:配置商城虚拟主机

vim/etc/nginx/conf.d/vhost-shop.conf
server { listen 80; server_name shop.hero.cloud; root /usr/share/nginx/html; index index.php; # 商城默认首页是 PHP location ~ \.php$ { try_files $uri =404; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
nginx-t&&systemctl restart nginx# 先放一个 PHP 测试页验证环境echo'<?php echo "PHP Test Page\n"; ?>'>/usr/share/nginx/html/test.phpcurlhttp://shop.hero.cloud/test.php# PHP Test Page

7.5 第五步:创建商城数据库和账号

mysql-uroot-p123
CREATEDATABASEecshop;CREATEUSERecshop@localhostIDENTIFIEDBY'123';GRANTALLPRIVILEGESONecshop.*TOecshop@localhost;FLUSHPRIVILEGES;exit;

7.6 第六步:部署 ECshop 文件

# 下载并解压(版本 ECShop_V4.1.20)wgethttp://192.168.49.200/class/course-materials/softwares/stage01/ECShop_V4.1.20_UTF8.zipunzipECShop_V4.1.20_UTF8.zip# 用商城代码替换默认站点目录mv/usr/share/nginx/html /usr/share/nginx/html.oricp-aECShop_V4.1.20_UTF8_release20250416/source/ecshop /usr/share/nginx/html# 关键:文件属主改为 nginx,否则无法读写/上传chown-Rnginx:nginx /usr/share/nginx/htmlchown-Rnginx:nginx /var/lib/php/# 设置 PHP 时区vim/etc/php.ini# [Date]date.timezone=Asia/Shanghai systemctl restart nginx php-fpm

🔺 商城类程序对目录权限很敏感,属主不对会出现白屏、无法安装、无法上传图片等问题。

7.7 第七步:浏览器执行安装向导

客户端先配 hosts:ECshop服务器IP shop.hero.cloud,然后浏览器访问http://shop.hero.cloud,按向导操作:

  1. 环境检查页:确认各项依赖(PHP 扩展、目录权限)都打勾,点「下一步:配置系统」;
  2. 填写数据库信息:
    • 数据库主机:localhost
    • 数据库账号:ecshop
    • 数据库密码:123
    • 数据库名:ecshop
    • 点「搜索」→ 选中搜索到的数据库 → 弹窗点「确定」;
  3. 设置管理员账号:填写后台管理员用户名、密码、邮箱;
  4. 点「立即安装」(如弹出窗口,关闭后重新点一次「立即安装」);
  5. 提示安装完成(激活系统可选,不激活也能用),关闭网页。

7.8 第八步:访问前台与后台

  • 商城前台:http://shop.hero.cloud—— 浏览商品、注册、下单;
  • 管理后台:http://shop.hero.cloud/admin—— 用安装时设置的管理员账号登录,可管理商品、订单、会员。

总结篇

一、核心知识链路

HTTPS:openssl 三步(私钥→CSR→自签证书)→ 443 server → 80 用 301 跳转 站点类型:静态(Nginx 直接返回) vs 动态(后端程序+数据库实时生成) PHP:Nginx 不执行 PHP → FastCGI 转给 php-fpm(9000) → php 解释执行 反向代理:客户端只连 proxy,proxy 用 proxy_pass 转发后端,隐藏后端 IP location 优先级:= 精确 > ^~ 前缀 > ~/~* 正则 > 普通前缀 > / 兜底 proxy_pass 带 / 去前缀;不带 / 保留前缀 ECshop:Nginx + MariaDB + PHP-FPM → 建库建账号 → 部署代码改属主 → Web 向导安装

二、重点 / 难点 / 频率

内容重要度频率
HTTPS 证书与 301 跳转⭐高
静态 vs 动态⭐高(面试)
Nginx + PHP-FPM 配置⭐高
正向 vs 反向代理⭐极高(面试)
location 五级优先级🔺极高
proxy_pass 带不带 /🔺极高
upstream 负载均衡、转发真实 IP 头⭐高
反向代理实践(本地/远端)🔺高
ECshop 综合部署🔺中

三、易错清单

  1. 🔺 自签名证书测试要加curl -k,跟随跳转加-L。
  2. 🔺 证书请求的 CN 必须等于网站域名。
  3. 🔺 php-fpm 的 user/group 要改成 nginx,否则权限不足。
  4. 🔺 Nginx 处理 PHP 必须配fastcgi_pass和SCRIPT_FILENAME,否则 PHP 源码被直接下载或报错。
  5. 🔺 location 优先级:精确 > 正则 > 普通前缀;正则按书写顺序、前缀按最长匹配。
  6. 🔺 proxy_pass 末尾/决定是否剔除路径前缀,是最常见的 404 原因。
  7. 🔺 反向代理要传 X-Real-IP / X-Forwarded-For,否则后端拿不到真实客户端 IP。
  8. 🔺 部署商城代码后必须chown -R nginx:nginx,并设置 PHP 时区。
  9. 🔺 每改配置先nginx -t再 reload;防火墙/SELinux 同步放行。

四、面试速记

  1. HTTP 和 HTTPS 区别?→ HTTP 明文 80;HTTPS 加密 443,靠证书验证身份。
  2. 静态网站和动态网站区别?→ 静态写死、直接返回、无数据库;动态由后端程序实时生成、可读写数据库。
  3. Nginx 如何处理 PHP?→ Nginx 通过 FastCGI 把 .php 转发给 PHP-FPM(9000),由 PHP 解释执行后返回。
  4. 正向代理和反向代理区别?→ 正向代理客户端、隐藏客户端;反向代理服务器端、隐藏后端。
  5. 反向代理作用?→ 负载均衡、缓存、动静分离、统一入口、安全隐藏后端。
  6. location 匹配优先级?→=>^~>~ / ~*> 普通前缀 >/。
  7. proxy_pass 带 / 和不带 / 的区别?→ 带 / 剔除 location 前缀;不带 / 保留完整路径。
  8. 为什么后端要配 X-Forwarded-For?→ 让后端获取经过代理转发的客户端真实 IP 链路。
  9. 部署一个 PHP 商城的步骤?→ 装 Nginx/MariaDB/PHP-FPM → 建库授权 → 部署代码改属主和时区 → 浏览器向导安装。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进