news 2026/9/11 5:00:17

Nginx速成实战:从安装配置到反向代理与负载均衡

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Nginx速成实战:从安装配置到反向代理与负载均衡

Nginx这个名字,后端和运维的朋友每天都要打交道。部署前端项目要用它,给后端接口做反向代理要用它,负载均衡、HTTPS证书、日志切割,几乎每个环节都有它的影子。我当年刚接触时也被一堆配置项搞得头大,location、proxy_pass、upstream这些东西看着就懵。后面踩了不少坑,才把整条链路理顺。这篇博文就按“速成”的思路来写,不铺开讲理论,直接从“把服务跑起来”到“能接真实项目”,把日常工作里最常用到的Nginx技能讲透。无论你是刚转行做运维的新人,还是被临时拉去配服务器的后端开发,看完这篇基本能上手处理绝大多数场景。

很多人一学Nginx就去啃官方文档,结果几千页的Manual直接把人劝退。我的经验是,Nginx入门不需要全套知识,你只需要搞懂三件事:怎么装、怎么配、怎么查日志。这三件事搞定了,你就能解决90%的日常问题。剩下的10%,遇到再搜也不迟。

1. 先搞清楚Nginx到底在解决什么问题

1.1 Nginx的角色定位

网上把Nginx吹得天花乱坠,什么高并发、高性能、异步非阻塞,这些词汇对于一个刚入门的人来说其实没有任何帮助。我换个方式给你讲。

你把Nginx想象成一个物业前台。访客来了,先到前台,前台根据访客要拜访哪户人家,告诉他去几栋几单元;如果他要找的人不在,前台还能帮忙把消息记录下来,等他回来了再转交。这个“告诉访客去哪找对应服务”的动作,就是反向代理;如果小区有多栋楼都住着同一个公司的人,前台帮忙分流让访客分别去不同楼找人,这就是负载均衡;如果访客只是想在楼下大堂看看宣传册,不用上楼,前台直接递给他一份,这就是静态资源服务。

这样一比喻就清楚了。Nginx是一个高性能的HTTP服务器和反向代理服务器,它站在用户请求和后端服务之间,统一接收请求,再按照你配置的规则把请求转发给对应的处理程序。我们日常工作中90%的Nginx配置,都是围绕着“转发规则”来做的。

1.2 速成的正确姿势:按场景学配置

很多教程喜欢把Nginx的配置文件从头到尾一行行讲,这对新手来说其实是灾难。因为配置文件里的几十个指令,你实际工作中可能一年都用不到一半。

我的建议是,按场景去学。你遇到了“前端页面打不开”的问题,就去查server块怎么配;你遇到了“接口请求503”,就去查proxy_pass怎么配;你遇到了“服务器扛不住高并发”,再去研究upstream和负载均衡策略。场景驱动学习,效率远高于从第一行读到最后一行的“教科书式学习”。

这篇文章后面所有的内容,我都按照这个思路来组织。每个章节解决一类真实场景,你把这个场景对应的配置吃透,下次再遇到类似问题就能直接拍板。

2. 安装与启动:先把Nginx跑起来

2.1 Linux环境下的安装与启动命令

绝大多数生产环境都是Linux,所以先从Linux说起。以CentOS和Ubuntu两个最常见的发行版为例。

CentOS/RHEL系列使用yum安装,但默认源里的Nginx版本通常比较老,建议先添加Nginx官方源再安装:

# 添加官方源 sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm # 安装 sudo yum install -y nginx # 启动 sudo systemctl start nginx # 设置开机自启 sudo systemctl enable nginx # 查看运行状态 sudo systemctl status nginx

Ubuntu/Debian系列用apt安装:

sudo apt update sudo apt install -y nginx # 启动 sudo systemctl start nginx # 开机自启 sudo systemctl enable nginx

还有一个容易被新手忽略的细节:改完配置后要测试配置文件语法是否正确。用nginx -t,如果输出syntax is oktest is successful,再执行重载。千万不要改完配置直接重启服务,万一语法写错了,服务可能会直接挂掉,线上业务就断了。

# 测试配置语法 nginx -t # 配置无误后重新加载 nginx -s reload

reloadrestart的区别得说清楚。reload是平滑重载,Nginx会先检查新配置语法,然后把旧的worker进程慢慢停掉,用新配置启动新的worker进程,正在处理的请求不会中断。而restart是强制重启,所有连接都会断开。生产环境里尽量用reload,不要用restart。

如果你是Ubuntu 14.04这类老系统,没有systemd,那就会用到init.d脚本。/etc/init.d/nginx start/etc/init.d/nginx stop/etc/init.d/nginx reload,这套老命令现在虽然用得少了,但在一些存量服务器上还是能碰到。

2.2 Windows环境部署Nginx

Windows服务器上部署Nginx也很常见,尤其是Windows Server 2016、2019这些系统。Nginx官方提供了Windows版本,直接去官网下载zip压缩包,解压就能用,不需要安装。

下载的时候注意看版本号,Windows版本没有官方预编译的稳定版标识,建议选择mainline版本以外的stable稳定版。解压出来的目录结构是这样的:

C:\nginx-1.24.0\ ├── conf\ # 配置文件目录 ├── contrib\ ├── docs\ ├── html\ # 默认站点目录 ├── logs\ # 日志目录 ├── temp\ └── nginx.exe # 主程序

Windows下启动Nginx直接在命令行里执行:

cd C:\nginx-1.24.0 start nginx.exe

注意这里要用start,不用start的话,命令行窗口会被Nginx进程占住,关掉窗口Nginx就停了。用start启动后,Nginx会在后台运行。

停止和重载的命令:

nginx.exe -s stop # 强制停止 nginx.exe -s reload # 重新加载配置 nginx.exe -t # 测试配置语法

Windows下改端口是高频操作。很多人装完Nginx发现启动不了,进去看日志才发现是80端口被占用。IIS、SQL Server Reporting Services这些服务都会抢80端口。改端口很简单,打开conf目录下的nginx.conf,找到listen 80;,改成你想要的端口,比如listen 8080;,保存后执行nginx -s reload即可。

我个人的经验是,Windows机器上最好把Nginx注册成Windows服务来管理,不然每次开机都要手动启动。用NSSM(Non-Sucking Service Manager)这个小工具,一行命令就能把nginx.exe注册为服务:

nssm install nginx "C:\nginx-1.24.0\nginx.exe" nssm set nginx AppParameters "-p C:\nginx-1.24.0" nssm start nginx

这样Nginx就能跟随Windows开机自启,也能通过服务管理器统一管理。

2.3 安装后的第一件事:验证进程与页面

无论哪种系统,装完Nginx后都要做两件事:确认进程活着、确认页面能打开。

# 确认进程存在 ps -ef | grep nginx # 确认端口监听 netstat -tlnp | grep 80 # 用curl抓取默认页面 curl http://localhost

如果看到了Welcome to nginx!的页面,恭喜你,Nginx已经跑起来了。接下来所有的工作,都是基于这个跑起来的服务做配置。

3. 配置文件逐段拆解:nginx.conf到底写了什么

3.1 从整体结构入手:全局块、events块、http块

Nginx的默认配置文件路径在Linux下通常是/etc/nginx/nginx.conf,Windows下在conf\nginx.conf。打开这个文件,整体结构大致是这样的:

# 全局块:全局生效,通常配置运行用户、worker进程数等 user nginx; worker_processes auto; # events块:配置连接处理机制 events { worker_connections 1024; } # http块:HTTP服务器的核心配置,绝大部分配置都在这里 http { include /etc/nginx/mime.types; default_type application/octet-stream; # 日志格式定义 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # 虚拟主机配置 server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } } }

我见过不少新手一上来就盯着location看,其实整个配置文件的骨架就三段:全局块管的是Nginx进程本身跑在什么环境下;events块管的是连接怎么处理;http块管的是网页服务怎么做。你理解了这三层,配置文件在你眼里就不是天书了。

这里有个高频面试题也是高频实际疑问:worker_processesworker_connections到底怎么设置?worker_processes建议设为CPU核心数,可以用auto自动检测;worker_connections表示每个worker进程能同时保持的最大连接数。两者相乘,大致就是Nginx能支撑的最大并发连接数。机器是4核CPU,worker_processes设置为4,worker_connections设置为1024,最大并发就是4096,这个指标对你评估服务器容量有直接参考意义。

3.2 server块和location块是配置的核心

server块代表一个虚拟主机。一个Nginx可以配置多个server,通过listen的端口号和server_name的域名来区分请求应该交给哪个server处理。

location块是server内部的路由规则。它匹配的是URL中域名后面的路径部分。举个实际例子:

server { listen 80; server_name example.com; # 匹配所有请求 location / { proxy_pass http://backend_server; } # 以/api开头的请求 location /api/ { proxy_pass http://api_server; } # 以.png结尾的请求 location ~ \.png$ { root /data/images; } }

关于location的匹配规则,网上讨论很多,我直接给你一个优先级结论:

  1. =精确匹配,优先级最高,匹配到了直接使用,不再往下找
  2. ^~前缀匹配,如果匹配到了,且是最长前缀,就不再看正则
  3. ~~*正则匹配,按书写顺序匹配,找到即停
  4. /通用前缀匹配,兜底规则,所有请求都匹配

这个优先级背下来就行,实际配置里最常用的是location /location /api/location = /,后两个是健康检查常配的路径。

3.3 修改配置后如何让改动生效

这里必须要强调完整流程了。我见过太多生产事故,都是因为改完配置直接restart导致的。

正确的操作流程是:

# 第一步:修改配置文件(建议先备份原始文件) cp nginx.conf nginx.conf.bak # 第二步:检查语法 nginx -t # 第三步:平滑重载 nginx -s reload

nginx -t这个命令太重要了。它会帮你检查配置文件语法,如果有错误,会明确告诉你第几行有问题。我在真实项目里养成一个习惯,凡是涉及配置变更,哪怕只是改一个数字,也要走一遍nginx -t再reload,这个习惯帮我避免了好几次线上故障。

4. 三大高频实战场景一次讲透

4.1 反向代理:一个入口访问多个内部服务

公司内部往往有很多服务:Java的Spring Boot应用、Python的Flask应用、Node.js服务,各自跑在不同的端口上。总不能每个服务都让用户记一个端口去访问,这时候Nginx就派上用场了。

我举个例子。一台服务器上有两个服务:

  • Java服务跑在8080端口,处理/api/请求
  • Vue前端跑在3000端口,处理静态页面

使用Nginx做一个反向代理,统一从80端口入口:

server { listen 80; server_name www.example.com; # 前端页面请求转发到Vue开发服务器 location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # API请求转发到Java后端 location /api/ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }

这里有个关键点:proxy_set_header这三行大部分人都知道要配,但很多人不理解为什么。我来解释一下。

Nginx做反向代理时,后端服务收到的请求来源是Nginx本身,而不是真实的客户端。X-Real-IPX-Forwarded-For这两个头就是用来传递真实客户端IP的。后端应用读取访问日志或者做用户行为分析时,如果没有这两个头,拿到的IP全是Nginx服务器的IP,那日志就没有任何分析价值了。

另外说一句,代理到TongWeb这类国产Java中间件时,配置方式基本一样,都是locationproxy_pass。TongWeb有时候对请求头校验更严格,proxy_set_header Host $host;必须配上,否则后端拿到的Host是内网IP,可能会触发一些校验逻辑。

4.2 负载均衡:upstream后端集群配置

一台服务器扛不住流量了怎么办?最直接的办法是多加几台服务器,然后用Nginx把请求分发到各个服务器上。这就是负载均衡。

Nginx的负载均衡通过upstream指令实现。我在实际项目里最常用的配置是这样的:

upstream backend_cluster { # 不写任何策略的话,默认是轮询 server 192.168.1.10:8080 weight=3; server 192.168.1.11:8080 weight=1; server 192.168.1.12:8080 backup; } server { listen 80; server_name example.com; location / { proxy_pass http://backend_cluster; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }

上面这个配置里,192.168.1.10192.168.1.11是两台正常的后端服务器,请求会按照3:1的比例轮询分发。192.168.1.12是备用服务器,只有前两台都挂了才会接手请求。这种“主备+权重”的混合架构,处理中小规模流量的高可用场景已经足够了。

Nginx支持几种负载均衡算法,我整理了一下:

算法关键字适用场景
轮询默认后端服务器配置相近的场景
加权轮询weight服务器性能有差异的场景
IP哈希ip_hash需要客户端会话保持的场景
最少连接least_conn请求处理时间差异大的场景
一致性哈希hash $request_uri需要按URL分发的缓存场景

这里最大的坑在于会话保持。如果后端应用用了Session,没有做分布式Session共享,那你用了默认的轮询策略后,用户第一次请求被分到A服务器登录了,第二次请求被分到B服务器,B服务器没有这个用户的Session,就会提示未登录。最简单的解决办法是用ip_hash,让同一个IP的请求始终保持在同一台服务器上。当然,更好的方案是改造后端,使用Redis等中间件做Session共享,但那属于后端开发的范畴,这里不展开。

如果后端是OpenShift这类容器平台上的服务,反向代理配置也是同样的思路。OpenShift的路由本身可以做流量分发,但如果你的集群没有暴露外部路由,或者需要通过统一的Nginx入口管理多个集群服务,就可以把OpenShift的服务地址直接写进upstream:

upstream openshift_service { server myapp-myproject.apps.internal.example.com:443; } server { listen 8443 ssl; server_name myapp.example.com; location / { proxy_pass https://openshift_service; proxy_set_header Host myapp-myproject.apps.internal.example.com; } }

需要注意HTTPS后端和SSL证书的头传递问题,这种场景下proxy_ssl_server_name on;proxy_set_header要配合着设置,否则后端证书校验会失败。

4.3 部署Vue3等静态项目:root与alias的区别

前后端分离的项目越来越多,前端构建出来的dist目录直接交给Nginx托管,部署方式堪称最简单但又最容易配错的一个场景。很多人在两个指令上栽过跟头:rootalias

先说结论:

  • root会把location中的路径拼接到root指定的目录后面
  • alias会用alias指定的目录直接替换location中的路径

举个例子。访问http://example.com/vue3/,假设项目文件在/data/projects/vue3/dist目录下:

使用root配置:

location /vue3/ { root /data/projects/vue3/dist; }

实际访问路径是/data/projects/vue3/dist/vue3/,明显不对,会404。因为root会把URL中的/vue3/拼上去。

使用alias配置:

location /vue3/ { alias /data/projects/vue3/dist/; }

实际访问路径是/data/projects/vue3/dist/,这才是正确的结果。因为alias用后面的路径直接替换了/vue3/这个前缀。

这个坑我见过太多次了。新手部署Vue项目,用root配置半天打不开页面,打开F12看到404,第一反应是后端接口问题,查了一圈才发现是路径映射错了。

部署Vue3项目还有一个绕不开的问题:history路由。Vue3默认使用history模式的话,URL里没有#号,比如http://example.com/user/1。这个路径在Nginx层面是不存在的文件,直接访问会404。解决方案是加一个try_files指令:

server { listen 80; server_name example.com; root /data/projects/demo/dist; index index.html; location / { try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://backend_api; } }

try_files $uri $uri/ /index.html的含义是:先查找请求对应的真实文件,找不到就尝试找目录,目录也找不到就返回index.html。这样无论前端路由怎么跳,刷新页面时Nginx都会返回前端入口文件,再由Vue Router接管并渲染对应页面。

Windows服务器上部署Vue3项目思路一样,只是路径分隔符要写成Windows风格,alias D:/projects/vue3/dist/;。注意Windows下路径末尾的斜杠也别落下,不然路径拼接时会出问题。

5. Docker部署Nginx并挂载多个项目目录

5.1 镜像版本怎么选

Docker化部署在现在的环境里几乎成了标配。使用docker pull nginx拉取镜像时,很多人直接不写版本号,拉个latest回来。我个人建议明确指定版本号,比如docker pull nginx:1.21.5

原因很简单:latest标签会跟随上游更新而变化,今天拉的是1.24,过阵子再拉可能就变成1.26了,大版本迭代往往伴随着配置指令行为的变化,可能会导致你的配置文件突然失效。生产环境明确锁定版本号,之后的部署行为才是可预期、可复现的。

# 拉取指定版本 docker pull nginx:1.21.5 # 查看本地镜像 docker images | grep nginx

5.2 挂载多项目目录的目录设计

用Docker跑Nginx最大的优势之一就是挂载宿主机目录,这样修改配置文件和部署前端代码时都不需要重新构建镜像。

以一台要部署三个项目目录的服务器为例,我会这样设计目录结构:

/opt/nginx/ ├── conf.d/ # 存放各个项目的server配置文件 │ ├── project-a.conf │ ├── project-b.conf │ └── project-c.conf ├── html/ │ ├── project-a/ # 项目A的静态文件 │ ├── project-b/ # 项目B的静态文件 │ └── project-c/ # 项目C的静态文件 ├── logs/ │ ├── access.log │ └── error.log └── nginx.conf # 主配置文件

容器启动命令:

docker run -d \ --name nginx \ -p 80:80 \ -p 443:443 \ -v /opt/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \ -v /opt/nginx/conf.d:/etc/nginx/conf.d:ro \ -v /opt/nginx/html:/usr/share/nginx/html:ro \ -v /opt/nginx/logs:/var/log/nginx \ --restart=always \ nginx:1.21.5

这里我解释几个关键参数的含义。-p 80:80是把宿主机的80端口映射到容器的80端口,只有做了这个映射,外部的请求才能进入容器内的Nginx。-v是挂载目录,冒号前面是宿主机路径,后面是容器内路径,:ro表示只读挂载,防止容器内进程意外修改配置。--restart=always确保Docker服务重启后容器会自动拉起,这是生产环境的保命配置。

启动完成后,进容器验证一下Nginx是否正常:

# 进入容器 docker exec -it nginx bash # 测试配置文件语法 nginx -t # 查看当前生效的配置 nginx -T

如果你使用的是docker compose,配置会更清晰:

version: '3.8' services: nginx: image: nginx:1.21.5 container_name: nginx ports: - "80:80" - "443:443" volumes: - /opt/nginx/nginx.conf:/etc/nginx/nginx.conf:ro - /opt/nginx/conf.d:/etc/nginx/conf.d:ro - /opt/nginx/html:/usr/share/nginx/html:ro - /opt/nginx/logs:/var/log/nginx restart: always

要注意的是,Docker容器内的Nginx配置路径和物理机有所区别,比如/etc/nginx/conf.d/这个目录在部分官方镜像的默认nginx.conf里是通过include指令引入的。如果你改了主配置或者新增了conf.d下的文件,必须reload或重启容器才生效:

# 执行nginx -t并reload docker exec nginx nginx -t docker exec nginx nginx -s reload

还有一种场景是编译Nginx时动态链接第三方库,比如要添加http_sub_module做反向代理内容替换、添加http_stub_status_module做状态监控。官方镜像默认是不带这些模块的,需要自己编译或者找包含这些模块的镜像。如果你只是需要字符替换功能,Nginx内置的sub_filter指令其实就够了,改一下配置就能用:

location / { proxy_pass http://backend; sub_filter '旧内容' '新内容'; sub_filter_once off; }

这个指令在做反向代理时替换页面文本很有用,比如后端返回的静态资源路径是/static/,你希望通过Nginx改成CDN地址/cdn/static/,就能用sub_filter实现。

6. 日志、SSL与常见问题排查

6.1 日志路径与常见定位手段

日志是排查Nginx问题时最重要的线索,也是很多新手最容易忽视的部分。默认情况下,Nginx的访问日志和错误日志路径在:

  • Linux:/var/log/nginx/access.log/var/log/nginx/error.log
  • Windows:nginx安装目录下的logs\access.loglogs\error.log
  • Docker:启动时-v挂载的宿主机目录,比如上面的/opt/nginx/logs/

调试的时候优先看error.log,里面会记录具体的错误原因。比如端口被占用、配置文件语法错误、worker进程启动失败,都会在这里留下记录。

我举个例子。启动Nginx时报错,错误日志里写[emerg] bind() to 0.0.0.0:80 failed (98: Address already in use),这说明80端口被占用了。排查方法:

# 查看80端口被哪个进程占用 lsof -i :80 # 或 netstat -tlnp | grep 80

拿到占用进程的PID后,确认是可杀掉的进程就停掉,再重新启动Nginx。这个问题的出现频率极高,尤其是Windows机器,IIS默认监听80端口,安装Nginx后经常冲突。

日志还有一个使用场景:核对请求有没有打到预期的后端。客户反馈“某个接口特别慢”,你先打开access.log,看看对应接口的request_timeupstream_response_time两个字段,基本就能判断是Nginx层慢还是后端服务慢。

6.2 配置HTTPS:私钥类型与证书链

现在部署HTTPS几乎成了标配。Nginx配置HTTPS的核心就是证书和私钥。很多人在这一块遇到迷惑:Nginx支持哪几种类型的私钥?

Nginx支持的是PEM格式的私钥,内容以-----BEGIN PRIVATE KEY----------BEGIN RSA PRIVATE KEY-----开头。常见的私钥类型包括:

私钥格式Nginx是否支持说明
PEM支持最常见的格式,文本可读
DER需要转换二进制格式,需要转成PEM
PFX/P12不支持直接使用Windows常见的证书格式,需转换
JKS不支持Java环境常见,需转成PEM

如果你拿到的是PFX格式的证书(很多Windows服务器申请证书时会导出成这个格式),就不能直接给Nginx用,需要先用OpenSSL转换:

# 将PFX格式证书转为PEM格式证书和私钥 openssl pkcs12 -in certificate.pfx -out certificate.pem -nodes

转换完成后,Nginx配置大概是这样的:

server { listen 443 ssl; server_name example.com; ssl_certificate /etc/nginx/ssl/example.crt; ssl_certificate_key /etc/nginx/ssl/example.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; location / { proxy_pass http://backend; } }

配置HTTPS时我最常遇到的坑,是证书文件路径写错或者证书链不完整。访问时一直报“证书无效”,但浏览器查看证书看不出问题。这种情况多半是部署时只上传了站点证书,没有上传中间证书链。正确的做法是把站点证书和中间证书合并成一个文件,或者用ssl_trusted_certificate指定证书链文件。

6.3 常见问题速查表

最后把高频问题整理成一张速查表,方便你实际排查时对照使用。

现象可能原因排查思路
首页显示Welcome to nginx而不是自己项目的页面server块的root或index配置没生效检查server_name和listen配置,是否匹配了当前访问的域名和端口
页面404root路径不对或location匹配不到检查root/alias路径,检查location块的匹配规则
接口能通但前端页面刷新404前端使用的是history路由给location / 加上try_files配置
502 Bad Gateway后端服务没启动或端口不对检查proxy_pass指向的内网地址和端口能否访问
504 Gateway Timeout后端处理请求超时适当增大proxy_read_timeout参数
403 Forbidden权限问题检查静态文件目录的Linux读写权限,index文件是否存在
启动时报Address already in use端口被其他进程占用lsof或netstat查端口占用,停掉冲突进程或改Nginx监听端口

这里额外说一个排查效率技巧:每次修改Nginx配置后,如果出现异常,第一反应不要直接百度错误信息,而是先做两个动作:

# 1. 测试配置语法 nginx -t # 2. 查看错误日志最近20行 tail -n 20 /var/log/nginx/error.log

这两个命令能解决80%的Nginx问题。剩下的20%才是配置逻辑层面的问题,需要结合上文提到的location匹配规则、proxy_pass路径拼接等知识去分析。

还有一个处理方案值得一提:当你手头恰好没有测试环境,又不敢直接动生产配置,可以复制一份Nginx配置,修改listen端口,比如改成8081,然后单独启动一个Nginx实例去做验证。确认没问题后再去改生产配置。这个操作我做过不止一次,稳妥可靠。

等你把上面这些场景都跑通了,Nginx的基本盘就算拿下了。后面再遇到更复杂的场景,比如HTTP/2、gzip压缩调优、缓存配置、限流防刷、日志按天切割,都是基于这篇文章的骨架去扩展。我自己刚接触Nginx时也是从“配一个能用的代理”开始的,很多指令只有亲手配过、踩过坑才记得牢。如果这篇文章能帮你少走几个弯路,那目的就达到了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 4:59:02

Unity悬疑推理游戏开发复盘:架构设计与性能优化实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 4:58:51

本地部署大模型实战:Ollama+llama.cpp+transformers量化避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 4:58:09

YOLO技术应用30-YOLO终极展望:AI视觉的下一个10年

基金定投助手:为什么你的基金定投总在追涨杀跌?价值平均法定投引擎 综合估值模型动态再平衡仓位管理,一个单文件 HTML 的免费定投工具-CSDN博客 https://download.csdn.net/download/weitingfu/93339607?spm1011.2124.3001.6210写在前面&am…

作者头像 李华
网站建设 2026/9/11 4:57:56

GitHub日榜盘点:AI学习、数据归档与权限框架的实用项目精选

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 4:57:55

改进粒子群算法在分时电价下电动汽车充放电优化调度中的应用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 4:57:46

掌握文件流,彻底搞懂Excel导入导出的底层原理与性能优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华