Nginx 进阶HTTPS / 动态站点 / PHP / 反向代理与 ECshop 实战本文主要讲解Nginx 进阶HTTPS / 动态站点 / PHP / 反向代理与 ECshop 实战每个概念讲清「是什么、为什么、怎么用」每条命令解释「意图和原因」并通过对比表格、架构图解、逐步操作帮助理解。 标注约定【使用频率】极高 / 高 / 中 / 低⭐ 重点 难点易踩坑 生产经验本文统一使用的实验环境角色主机名IP 地址通用服务端server10.1.8.11客户端clientclient.hero.cloud10.1.8.12代理 / 主站proxy、wwwproxy.hero.cloud10.1.8.20后端 Web 1nginx1nginx1.hero.cloud10.1.8.21后端 Web 2nginx2nginx2.hero.cloud10.1.8.22后端 Web 3nginx3nginx3.hero.cloud10.1.8.23域名统一为hero.cloud数据库相关密码统一为123。今日内容地图章内容1配置 SSL/TLSHTTPS2静态站点 vs 动态站点3PHP 站点LNMP4反向代理原理5location 与 proxy_pass 配置6⭐ 反向代理实践代理本地 / 远端逐步7⭐ 项目实战 ECshop综合实践逐步文章目录Nginx 进阶HTTPS / 动态站点 / PHP / 反向代理与 ECshop 实战第 1 章 配置 SSL/TLSHTTPS1.1 先理解HTTP、HTTPS、证书1.2 ⭐ 三步生成自签名证书1.3 配置 HTTPS 站点1.4 HTTP 自动跳转 HTTPS⭐ 常用1.5 客户端测试第 2 章 静态站点 vs 动态站点2.1 核心区别2.2 ⭐ 全面对比第 3 章 PHP 站点LNMP3.1 Nginx 如何处理 PHP 流程3.2 安装 PHP3.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 第二步配置三台后端 nginxnginx1/2/36.3 第三步配置 proxy 前端基础站点6.4 实践 A代理「本地」目录理解 location 优先级A-1 无符号普通前缀匹配A-2 正则匹配A-3 精确匹配6.5 实践 B代理「远端」服务器proxy_passB-1 无符号普通前缀匹配B-2 正则匹配B-3 精确匹配第 7 章 ⭐ 项目实战ECshop综合实践逐步7.1 第一步安装 Nginx7.2 第二步安装并初始化 MariaDB7.3 第三步安装 PHP 与 PHP-FPM7.4 第四步配置商城虚拟主机7.5 第五步创建商城数据库和账号7.6 第六步部署 ECshop 文件7.7 第七步浏览器执行安装向导7.8 第八步访问前台与后台总结篇一、核心知识链路二、重点 / 难点 / 频率三、易错清单四、面试速记第 1 章 配置 SSL/TLSHTTPS【使用频率高】现在几乎所有对外网站都强制 HTTPS。1.1 先理解HTTP、HTTPS、证书HTTP80 端口数据明文传输中间人可窃听、篡改。HTTPS443 端口HTTP SSL/TLS 加密数据加密传输并能验证服务器身份。证书的作用由权威 CA证书颁发机构签发证明这个网站确实是它声称的那个。实验环境没有 CA我们做自签名证书自己给自己签发浏览器会提示不安全但加密功能完整。证书涉及三个文件文件含义私钥 .key服务器自己保管绝不外泄用来解密/签名CSR .csr证书签名请求包含网站信息提交给 CA证书 .crt用私钥签名后生成发给浏览器的身份证1.2 ⭐ 三步生成自签名证书mkdircertscdcerts# ① 生成 2048 位私钥openssl genrsa-outwww.key2048# ② 用私钥生成证书请求文件 CSRopenssl req-new-keywww.key-outwww.csr\-subj/CCN/STJS/LNJ/OHERO/OUDEVOPS/CNwww.hero.cloud/emailAddresswebadminhero.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-tsystemctl restart nginx# 防火墙放行 httpsfirewall-cmd --add-servicehttps--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 友好需运算查库高并发耗资源成本高典型例子纯官网、落地页、文档站淘宝、知乎、博客后台、管理系统技术栈HTMLCSSJS、Hugo/Hexo/VitePressLNMP、SpringBootMySQL、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 安装 PHPyuminstall-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-tsystemctl 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$uri404;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/list5.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 章 ⭐ 反向代理实践逐步操作目标用proxy10.1.8.20作为统一入口后端有 nginx1/2/3.21/.22/.23。6.1 第一步所有节点配置 hosts 与主机名所有节点含 proxy、nginx1/2/3、client编辑/etc/hosts127.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 第二步配置三台后端 nginxnginx1/2/3# 每台后端都执行以 nginx1 为例yum-yinstallnginx systemctlenablenginx--nowfirewall-cmd --add-servicehttp--permanentfirewall-cmd --add-servicehttp# 各自准备不同首页$(hostname) 自动取主机名便于区分echoWelcome to$(hostname)/usr/share/nginx/html/index.html客户端先直连验证三台后端都正常[rootclient ~]# curl http://nginx1.hero.cloud/ # Welcome to nginx1.hero.cloud[rootclient ~]# curl http://nginx2.hero.cloud/ # Welcome to nginx2.hero.cloud[rootclient ~]# curl http://nginx3.hero.cloud/ # Welcome to nginx3.hero.cloud6.3 第三步配置 proxy 前端基础站点# proxy 上准备本地站点目录mkdir/var/nginxechoHello, Nginx/var/nginx/index.htmlechoHello, 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-tnginx-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}echoHello, Im here /var/nginx/nginx1/var/nginx/nginx1/index.htmlechoHello, Im here /var/nginx/nginx2/var/nginx/nginx2/index.html# 独立目录mkdir/var/nginx1 /var/nginx2echoHello, Nginx1/var/nginx1/index.htmlechoHello, Nginx2/var/nginx2/index.html# www1/www2 目录给正则、精确匹配用forp1inwww{1..2};doforp2innginx{1,2};domkdir-p/var/$p1/$p2echoHello, Im 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/nginx1curlhttp://www.hero.cloud/nginx2/# Hello, Im here /var/nginx/nginx2无规则走 /结论普通前缀匹配优先级高于兜底/。A-2 正则匹配在上面基础上加location ~ /nginx.* { root /var/www1; index index.html; }测试curlhttp://www.hero.cloud/nginx1/# Hello, Im here /var/www1/nginx1curlhttp://www.hero.cloud/nginx2/# Hello, Im here /var/www1/nginx2结论正则匹配优先级高于普通前缀。A-3 精确匹配再加location /nginx2/index.html { root /var/www2; }测试curlhttp://www.hero.cloud/nginx1/# Hello, Im here /var/www1/nginx1走正则curlhttp://www.hero.cloud/nginx2/# Hello, Im here /var/www2/nginx2精确命中首页结论精确匹配优先级高于正则。 三个实验层层递进正好验证优先级精确 正则 ~普通前缀兜底 /。6.5 实践 B代理「远端」服务器proxy_passB-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转发到 nginx1curlhttp://www.hero.cloud/nginx2/# Hello, Im here /var/nginx/nginx2无规则走本地 /B-2 正则匹配加一条正则把 nginx1/2/3 都转发到 nginx2location ~ /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 第一步安装 Nginxyuminstall-ynginx systemctlenablenginx--nowechoNginx Test Page/usr/share/nginx/html/index.htmlcurlhttp://127.0.0.1/# Nginx Test Page7.2 第二步安装并初始化 MariaDByuminstall-ymariadb-server systemctlenablemariadb--nowmysql_secure_installation# 按提示设置 root 密码为 123、删除匿名用户、禁止远程 root、删除测试库7.3 第三步安装 PHP 与 PHP-FPMyuminstall-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-tsystemctl 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;CREATEUSERecshoplocalhostIDENTIFIEDBY123;GRANTALLPRIVILEGESONecshop.*TOecshoplocalhost;FLUSHPRIVILEGES;exit;7.6 第六步部署 ECshop 文件# 下载并解压版本 ECShop_V4.1.20wgethttp://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.timezoneAsia/Shanghai systemctl restart nginx php-fpm 商城类程序对目录权限很敏感属主不对会出现白屏、无法安装、无法上传图片等问题。7.7 第七步浏览器执行安装向导客户端先配 hostsECshop服务器IP shop.hero.cloud然后浏览器访问http://shop.hero.cloud按向导操作环境检查页确认各项依赖PHP 扩展、目录权限都打勾点「下一步配置系统」填写数据库信息数据库主机localhost数据库账号ecshop数据库密码123数据库名ecshop点「搜索」→ 选中搜索到的数据库 → 弹窗点「确定」设置管理员账号填写后台管理员用户名、密码、邮箱点「立即安装」如弹出窗口关闭后重新点一次「立即安装」提示安装完成激活系统可选不激活也能用关闭网页。7.8 第八步访问前台与后台商城前台http://shop.hero.cloud—— 浏览商品、注册、下单管理后台http://shop.hero.cloud/admin—— 用安装时设置的管理员账号登录可管理商品、订单、会员。总结篇一、核心知识链路HTTPSopenssl 三步私钥→CSR→自签证书→ 443 server → 80 用 301 跳转 站点类型静态Nginx 直接返回 vs 动态后端程序数据库实时生成 PHPNginx 不执行 PHP → FastCGI 转给 php-fpm(9000) → php 解释执行 反向代理客户端只连 proxyproxy 用 proxy_pass 转发后端隐藏后端 IP location 优先级 精确 ^~ 前缀 ~/~* 正则 普通前缀 / 兜底 proxy_pass 带 / 去前缀不带 / 保留前缀 ECshopNginx 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 明文 80HTTPS 加密 443靠证书验证身份。静态网站和动态网站区别→ 静态写死、直接返回、无数据库动态由后端程序实时生成、可读写数据库。Nginx 如何处理 PHP→ Nginx 通过 FastCGI 把 .php 转发给 PHP-FPM9000由 PHP 解释执行后返回。正向代理和反向代理区别→ 正向代理客户端、隐藏客户端反向代理服务器端、隐藏后端。反向代理作用→ 负载均衡、缓存、动静分离、统一入口、安全隐藏后端。location 匹配优先级→^~~ / ~* 普通前缀 /。proxy_pass 带 / 和不带 / 的区别→ 带 / 剔除 location 前缀不带 / 保留完整路径。为什么后端要配 X-Forwarded-For→ 让后端获取经过代理转发的客户端真实 IP 链路。部署一个 PHP 商城的步骤→ 装 Nginx/MariaDB/PHP-FPM → 建库授权 → 部署代码改属主和时区 → 浏览器向导安装。