Nginx 进阶(HTTPS / 动态站点 / PHP / 反向代理)与 ECshop 实战
本文主要讲解Nginx 进阶(HTTPS / 动态站点 / PHP / 反向代理)与 ECshop 实战,每个概念讲清「是什么、为什么、怎么用」,每条命令解释「意图和原因」,并通过对比表格、架构图解、逐步操作帮助理解。
📌 标注约定:【使用频率】极高 / 高 / 中 / 低;⭐ 重点 🔺 难点(易踩坑) 💡 生产经验
🔧本文统一使用的实验环境:
角色 主机名 IP 地址 通用服务端 server 10.1.8.11 客户端 client(client.hero.cloud) 10.1.8.12 代理 / 主站 proxy、www(proxy.hero.cloud) 10.1.8.20 后端 Web 1 nginx1(nginx1.hero.cloud) 10.1.8.21 后端 Web 2 nginx2(nginx2.hero.cloud) 10.1.8.22 后端 Web 3 nginx3(nginx3.hero.cloud) 10.1.8.23
- 域名统一为hero.cloud;
- 数据库相关密码统一为
123。今日内容地图:
章 内容 1 配置 SSL/TLS(HTTPS) 2 静态站点 vs 动态站点 3 PHP 站点(LNMP) 4 反向代理原理 5 location 与 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.crt1.3 配置 HTTPS 站点
# 证书放到统一目录mkdir/etc/ssl/certs/www.hero.cloudmvwww* /etc/ssl/certs/www.hero.cloudvim/etc/nginx/conf.d/vhost-www-ssl.confserver { 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 nginx1.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--reload1.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/VitePress | LNMP、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.confserver { 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.php3.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 代理、VPN | Nginx、负载均衡器 |
4.3 反向代理的作用
- 负载均衡:把请求分摊到多个后端,避免单机过载;
- 缓存:缓存静态文件/热点页面,提速、减压;
- 动静分离:静态资源 Nginx 直接返回,动态请求才转发后端;
- 多站点 / 统一入口:一个入口按域名/路径分发到不同后端;
- 安全:隐藏后端 IP,代理层做限流、拦截。
第 5 章 location 与 proxy_pass 配置(🔺 核心)
5.1 两个核心指令
location:定义 URL 路径的匹配规则;proxy_pass:指定把请求转发到哪个后端。
5.2 ⭐ location 五级匹配规则(优先级从高到低)
| 优先级 | 写法 | 名称 | 命中逻辑 |
|---|---|---|---|
| 1(最高) | location = /path | 精确匹配 | URL 与路径完全一致 |
| 2 | location ^~ /path | 前缀匹配(跳正则) | 以路径开头,命中后不再检查正则 |
| 3 | location ~ 正则 | 正则(区分大小写) | 符合正则即命中 |
| 3 | location ~* 正则 | 正则(不区分大小写) | 符合正则即命中 |
| 4 | location /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 nginx36.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.cloud6.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.confserver { 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.htmldonedoneA-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 Page7.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--now7.4 第四步:配置商城虚拟主机
vim/etc/nginx/conf.d/vhost-shop.confserver { 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 Page7.5 第五步:创建商城数据库和账号
mysql-uroot-p123CREATEDATABASEecshop;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,按向导操作:
- 环境检查页:确认各项依赖(PHP 扩展、目录权限)都打勾,点「下一步:配置系统」;
- 填写数据库信息:
- 数据库主机:localhost
- 数据库账号:
ecshop - 数据库密码:
123 - 数据库名:
ecshop - 点「搜索」→ 选中搜索到的数据库 → 弹窗点「确定」;
- 设置管理员账号:填写后台管理员用户名、密码、邮箱;
- 点「立即安装」(如弹出窗口,关闭后重新点一次「立即安装」);
- 提示安装完成(激活系统可选,不激活也能用),关闭网页。
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 综合部署 | 🔺 | 中 |
三、易错清单
- 🔺 自签名证书测试要加
curl -k,跟随跳转加-L。 - 🔺 证书请求的 CN 必须等于网站域名。
- 🔺 php-fpm 的 user/group 要改成 nginx,否则权限不足。
- 🔺 Nginx 处理 PHP 必须配
fastcgi_pass和SCRIPT_FILENAME,否则 PHP 源码被直接下载或报错。 - 🔺 location 优先级:精确 > 正则 > 普通前缀;正则按书写顺序、前缀按最长匹配。
- 🔺 proxy_pass 末尾
/决定是否剔除路径前缀,是最常见的 404 原因。 - 🔺 反向代理要传 X-Real-IP / X-Forwarded-For,否则后端拿不到真实客户端 IP。
- 🔺 部署商城代码后必须
chown -R nginx:nginx,并设置 PHP 时区。 - 🔺 每改配置先
nginx -t再 reload;防火墙/SELinux 同步放行。
四、面试速记
- HTTP 和 HTTPS 区别?→ HTTP 明文 80;HTTPS 加密 443,靠证书验证身份。
- 静态网站和动态网站区别?→ 静态写死、直接返回、无数据库;动态由后端程序实时生成、可读写数据库。
- Nginx 如何处理 PHP?→ Nginx 通过 FastCGI 把 .php 转发给 PHP-FPM(9000),由 PHP 解释执行后返回。
- 正向代理和反向代理区别?→ 正向代理客户端、隐藏客户端;反向代理服务器端、隐藏后端。
- 反向代理作用?→ 负载均衡、缓存、动静分离、统一入口、安全隐藏后端。
- location 匹配优先级?→
=>^~>~ / ~*> 普通前缀 >/。 - proxy_pass 带 / 和不带 / 的区别?→ 带 / 剔除 location 前缀;不带 / 保留完整路径。
- 为什么后端要配 X-Forwarded-For?→ 让后端获取经过代理转发的客户端真实 IP 链路。
- 部署一个 PHP 商城的步骤?→ 装 Nginx/MariaDB/PHP-FPM → 建库授权 → 部署代码改属主和时区 → 浏览器向导安装。