当前位置: 首页 > news >正文

Nginx 配置详解:从基础到进阶

Nginx 配置详解:从基础到进阶

Nginx(发音为“engine-x”)是一款高性能的HTTP服务器、反向代理服务器负载均衡器,其配置文件是实现所有功能的核心。Nginx的配置采用模块化结构,语法简洁但功能强大,掌握配置规则是灵活运用Nginx的关键。本文将从配置文件结构、核心模块配置、常见场景示例三个维度,全面解析Nginx配置。

一、Nginx 配置文件基础

1. 配置文件路径

默认情况下,Nginx的主配置文件路径由编译安装时的--prefix参数指定(如之前你配置的/usr/local/nginx/conf/nginx.conf),不同安装方式路径可能不同:

  • 编译安装(自定义):/usr/local/nginx/conf/nginx.conf(你的环境路径)
  • YUM/DNF安装(CentOS/RHEL):/etc/nginx/nginx.conf
  • APT安装(Ubuntu/Debian):/etc/nginx/nginx.conf

主配置文件可通过include指令引入其他子配置(如虚拟主机配置、模块配置),常见的子配置路径:

  • 虚拟主机:/usr/local/nginx/conf/conf.d/*.conf(或/etc/nginx/conf.d/
  • 模块特定配置:/usr/local/nginx/conf/modules/*.conf

2. 配置文件结构

Nginx配置文件采用层级结构,所有指令都包含在不同的“块”(Block)中,核心结构分为3层:

# 1. 全局块:配置影响Nginx全局的参数
user  nginx;                # 运行Nginx的用户和组
worker_processes  auto;     # 工作进程数(建议设为CPU核心数或auto)
error_log  logs/error.log;  # 错误日志路径和级别(debug/info/notice/warn/error/crit)
pid        logs/nginx.pid;  # 进程PID文件路径# 2. 事件块:配置Nginx与用户的网络连接
events {worker_connections  1024;  # 每个工作进程的最大并发连接数use epoll;                 # 网络I/O模型(Linux推荐epoll,Windows用io_uring)multi_accept on;           # 允许工作进程一次性接受多个连接
}# 3. HTTP块:配置HTTP服务器的核心参数(包含所有与HTTP相关的配置)
http {include       mime.types;          # 引入MIME类型映射文件(定义文件扩展名与类型的对应)default_type  application/octet-stream;  # 默认MIME类型(未知文件时使用)# 日志格式定义(可自定义,通过log_format指令命名)log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  logs/access.log  main;  # 访问日志路径,使用main格式# 核心性能优化参数sendfile        on;  # 启用零拷贝(直接从内核缓冲区发送文件,减少IO开销)tcp_nopush      on;  # 配合sendfile使用,减少TCP数据包数量tcp_nodelay     on;  # 禁用Nagle算法,减少延迟(适合实时场景)keepalive_timeout  65;  # 长连接超时时间(客户端与服务器保持连接的时间)# 引入虚拟主机配置(推荐将不同站点的配置拆分到子文件)include /usr/local/nginx/conf/conf.d/*.conf;# 4. 虚拟主机块(Server块):一个Server对应一个站点/域名server {listen       80;  # 监听端口(默认80,HTTPS用443)server_name  www.example.com example.com;  # 绑定的域名(多个域名用空格分隔)root         /usr/local/nginx/html/example;  # 站点根目录(文件存放路径)index        index.html index.htm;  # 默认首页文件(优先级从左到右)# 5. 路由块(Location块):匹配请求路径,配置特定路径的规则location / {# 路径匹配时的处理(如转发、缓存、权限控制等)try_files $uri $uri/ /index.html;  # 尝试访问文件→目录→跳转index.html(适合SPA应用)}# 匹配静态资源路径(如图片、CSS、JS)location ~* \.(jpg|jpeg|png|gif|css|js)$ {expires 30d;  # 静态资源缓存30天(减少重复请求)add_header Cache-Control "public, max-age=2592000";  # 缓存控制头}}
}

3. 配置语法规则

  1. 指令格式指令名 参数;(指令名与参数用空格分隔,末尾必须加;,否则报错)
  2. 块指令:指令名后带{},内部可嵌套其他指令(如events {}http {}server {}
  3. 注释# 注释内容(单行注释,无多行注释)
  4. 变量:以$开头,如$remote_addr(客户端IP)、$request(请求行)、$status(响应状态码)
  5. 匹配优先级(Location块):
    匹配符号 含义 优先级 示例
    = 精确匹配路径 最高 location = /login {}
    ^~ 前缀匹配(不正则) 次高 location ^~ /admin {}
    ~/~* 正则匹配(区分大小写,*不区分) location ~* \.html {}
    无符号 普通前缀匹配 最低 location /api {}

二、核心模块配置详解

Nginx的功能通过“模块”实现,核心模块的配置直接影响服务性能和功能,以下是常用模块的关键配置。

1. 全局与事件模块(性能基础)

全局块核心指令

指令 作用 推荐配置
user 指定运行Nginx的用户和组(避免用root,降低安全风险) user nginx nginx;
worker_processes 工作进程数(与CPU核心数一致,或设为auto自动匹配) worker_processes auto;
worker_cpu_affinity 绑定工作进程到指定CPU核心(减少进程切换开销) worker_cpu_affinity 0001 0010 0100 1000;(4核心)
error_log 错误日志路径和级别(生产环境建议用warnerror,避免日志过大) error_log logs/error.log warn;

事件块核心指令

指令 作用 推荐配置
worker_connections 每个工作进程的最大并发连接数(需结合系统ulimit限制) worker_connections 10240;(高并发场景可设更高)
use 指定网络I/O模型(Linux推荐epoll,FreeBSD用kqueue use epoll;
multi_accept 允许工作进程一次性接受所有待处理连接(提升并发效率) multi_accept on;

2. HTTP模块(Web服务核心)

1)MIME类型配置

mime.types文件定义了文件扩展名与HTTP响应头Content-Type的对应关系(如.html对应text/html),确保浏览器正确解析文件:

include mime.types;  # 必须引入,否则无法正确识别静态文件类型
default_type application/octet-stream;  # 未知文件类型默认用二进制流(避免解析错误)

2)日志配置

通过log_format自定义日志格式,access_log指定日志输出路径,常用变量说明:

  • $remote_addr:客户端IP地址
  • $remote_user:客户端认证用户名(无则为-
  • $time_local:服务器本地时间(格式:dd/Mon/YYYY:HH:MM:SS +0800
  • $request:请求行(如GET /index.html HTTP/1.1
  • $status:HTTP响应状态码(如200、404、502)
  • $http_referer:Referer头(请求来源页面)
  • $http_user_agent:User-Agent头(客户端浏览器/设备信息)
  • $http_x_forwarded_for:代理后的真实客户端IP(反向代理场景需配置)

示例:定义JSON格式日志(便于日志分析工具解析)

log_format json_log '{"remote_addr":"$remote_addr","time_local":"$time_local","request":"$request","status":$status,"body_bytes_sent":$body_bytes_sent,"http_referer":"$http_referer","http_user_agent":"$http_user_agent"}';
access_log logs/access_json.log json_log;

3)性能优化配置

指令 作用 推荐配置
sendfile 启用零拷贝(内核直接将文件数据发送到网卡,跳过用户态→内核态拷贝) sendfile on;
tcp_nopush 合并TCP数据包(减少网络传输次数,适合大文件传输) tcp_nopush on;
tcp_nodelay 禁用Nagle算法(减少小数据包延迟,适合实时通信如WebSocket) tcp_nodelay on;
keepalive_timeout 长连接超时时间(客户端与服务器保持连接,避免重复握手) keepalive_timeout 65;
client_max_body_size 限制客户端请求体最大尺寸(防止大文件上传攻击,默认1m) client_max_body_size 10m;(根据业务调整)

3. 虚拟主机(Server块)配置

一个server块对应一个独立的站点,可通过listenserver_name区分不同站点,支持基于“端口”和“域名”的虚拟主机。

示例1:基于域名的虚拟主机(同一端口,不同域名)

# 站点1:www.example.com
server {listen 80;server_name www.example.com;  # 绑定域名root /usr/local/nginx/html/example1;  # 站点1根目录index index.html;# 访问日志(单独记录该站点日志)access_log logs/example1_access.log main;
}# 站点2:www.test.com
server {listen 80;server_name www.test.com;  # 绑定另一个域名root /usr/local/nginx/html/example2;  # 站点2根目录index index.html;access_log logs/example2_access.log main;
}

示例2:基于端口的虚拟主机(同一域名,不同端口)

# 端口80:HTTP服务
server {listen 80;server_name www.example.com;root /usr/local/nginx/html/http;index index.html;
}# 端口8080:另一个服务(如管理后台)
server {listen 8080;server_name www.example.com;root /usr/local/nginx/html/admin;index login.html;# 限制访问IP(仅允许192.168.1.0/24网段访问管理后台)allow 192.168.1.0/24;deny all;
}

4. 路由(Location块)配置

location块用于匹配请求路径,实现路径级别的精准控制,常见场景包括静态资源处理、反向代理、权限控制等。

示例1:静态资源缓存(图片、CSS、JS)

# 匹配所有后缀为jpg/jpeg/png/gif/css/js的请求(不区分大小写)
location ~* \.(jpg|jpeg|png|gif|css|js)$ {root /usr/local/nginx/html/static;  # 静态资源根目录expires 7d;  # 浏览器缓存7天add_header Cache-Control "public, max-age=604800";  # 缓存控制(7天=604800秒)add_header Access-Control-Allow-Origin *;  # 允许跨域访问(静态资源常用)
}

示例2:反向代理(将请求转发到后端服务)

反向代理是Nginx的核心功能之一,可将客户端请求转发到后端Tomcat、Node.js、Python等服务,实现“前端Nginx+后端服务”的架构。

server {listen 80;server_name api.example.com;  # 接口域名# 匹配所有请求,转发到后端Node.js服务(127.0.0.1:3000)location / {proxy_pass http://127.0.0.1:3000;  # 后端服务地址(必须加http://)proxy_set_header Host $host;  # 传递Host头(后端需根据Host判断站点)proxy_set_header X-Real-IP $remote_addr;  # 传递真实客户端IPproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 传递代理链IPproxy_set_header X-Forwarded-Proto $scheme;  # 传递协议(http/https)}
}

示例3:URL重写(Rewrite)

通过rewrite指令修改请求URL,实现跳转、路径替换等功能,语法:rewrite 匹配规则 目标路径 标记;
常见标记:

  • last:执行完当前rewrite后,重新匹配location
  • break:执行完当前rewrite后,停止后续rewrite
  • redirect:临时重定向(302状态码)
  • permanent:永久重定向(301状态码)

示例:HTTP跳转HTTPS(强制HTTPS访问)

server {listen 80;server_name www.example.com;# 所有HTTP请求重定向到HTTPS(301永久重定向)rewrite ^(.*)$ https://$server_name$1 permanent;
}

5. HTTPS配置(SSL/TLS)

HTTPS需配置SSL证书(可从Let's Encrypt免费申请),监听443端口,核心指令包括ssl_certificate(证书路径)、ssl_certificate_key(私钥路径)。

示例:HTTPS站点配置

server {listen 443 ssl;  # 监听443端口,启用SSLserver_name www.example.com;# SSL证书配置(替换为你的证书路径)ssl_certificate /usr/local/nginx/conf/ssl/www.example.com.crt;  # 公钥证书ssl_certificate_key /usr/local/nginx/conf/ssl/www.example.com.key;  # 私钥# SSL优化配置(提升安全性和性能)ssl_protocols TLSv1.2 TLSv1.3;  # 仅启用安全的TLS协议(禁用SSLv3、TLSv1.0/1.1)ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;  # 安全的加密套件ssl_prefer_server_ciphers on;  # 优先使用服务器端的加密套件ssl_session_cache shared:SSL:10m;  # SSL会话缓存(减少重复握手)ssl_session_timeout 10m;  # SSL会话超时时间# 站点根目录和首页root /usr/local/nginx/html/https;index index.html;
}

三、常见场景配置示例

1. 负载均衡(反向代理多后端服务)

通过upstream指令定义后端服务集群,Nginx自动将请求分发到不同后端,实现负载均衡和高可用。

# 1. 定义后端服务集群(upstream块需放在http块内)
upstream backend_servers {server 192.168.1.100:8080 weight=5;  # 权重5(接收50%请求)server 192.168.1.101:8080 weight=3;  # 权重3(接收30%请求)server 192.168.1.102:8080 backup;    # 备用节点(主节点故障时启用)# server 192.168.1.103:8080 down;    # 下线节点(不接收请求)
}# 2. 虚拟主机配置(转发请求到upstream)
server {listen 80;server_name www.example.com;location / {proxy_pass http://backend_servers;  # 转发到后端集群proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;# 健康检查(可选,需启用ngx_http_upstream_module)proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;}
}

负载均衡策略(默认是轮询,可通过upstream指令指定):

  • 轮询:默认,按顺序分发请求(权重可调整)
  • ip_hash:按客户端IP哈希分配(同一IP始终访问同一后端,适合会话保持)
  • least_conn:优先分发到连接数最少的后端(适合后端性能不均场景)

2. 静态网站部署(SPA应用如Vue/React)

SPA(单页应用)只有一个index.html,所有路由由前端控制,需配置try_files确保刷新页面不404。

server {listen 80;server_name spa.example.com;root /usr/local/nginx/html/spa;  # SPA打包后的dist目录index index.html;location / {# 尝试访问请求的文件→请求的目录→跳转index.html(前端路由接管)try_files $uri $uri/ /index.html;}# 静态资源缓存location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {expires 30d;add_header Cache-Control "public, max-age=2592000";}
}

3. 防盗链配置(防止静态资源被其他网站盗用)

通过valid_referers指令限制请求的Referer(来源页面),仅允许指定域名引用资源。

location ~* \.(jpg|jpeg|png|gif|mp4)$ {root /usr/local/nginx/html/static;# 允许的Referer(none:直接访问,blocked:Referer为空,*.example.com:example.com的子域名)valid_referers none blocked *.example.com example.com;# 如果Referer不在允许列表,返回403禁止访问(或返回自定义图片)if ($invalid_referer) {return 403;# rewrite ^/ /static/403.png last;  # 可选:返回防盗链图片}
}

四、配置验证与重载

修改Nginx配置后,必须验证配置语法并重载服务,避免配置错误导致服务中断。

1. 验证配置语法

# 进入Nginx sbin目录(你的路径是/usr/local/nginx/sbin)
cd /usr/local/nginx/sbin# 验证配置文件语法(无报错则表示语法正确)
./nginx -t

成功输出示例:

nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

2. 重载配置(不中断服务)

# 重载配置(服务不会重启,新请求将使用新配置)
./nginx -s reload

3. 其他常用命令

./nginx          # 启动Nginx
./nginx -s stop  # 强制停止Nginx(立即终止进程)
./nginx -s quit  # 优雅停止Nginx(处理完当前请求后终止)
./nginx -v       # 查看Nginx版本(如nginx version: nginx/1.28.0)
./nginx -V       # 查看Nginx版本及编译参数(如--prefix、--with-http_ssl_module)

五、常见配置问题排查

  1. 403 Forbidden

    • 站点根目录权限不足(Nginx用户无读权限,需执行chown -R nginx:nginx /usr/local/nginx/html
    • index指令指定的首页文件不存在
    • 防盗链配置中的$invalid_referer触发
  2. 404 Not Found

    • root指令路径错误(文件实际路径与配置不符)
    • SPA应用未配置try_files $uri $uri/ /index.html(刷新页面时404)
  3. 502 Bad Gateway

    • 反向代理的后端服务未启动(如proxy_pass指向的127.0.0.1:3000未运行)
    • 后端服务端口被防火墙拦截(需开放端口,如firewall-cmd --add-port=3000/tcp --permanent
  4. HTTPS证书错误

    • 证书或私钥路径错误
    • 证书与域名不匹配(如用www.example.com的证书绑定test.example.com)
    • 未启用SSL模块(编译时需加--with-http_ssl_module,可通过./nginx -V查看)

通过以上内容,可掌握Nginx配置的核心逻辑和常见场景用法。实际应用中,需根据业务需求(如高并发、HTTPS、负载均衡)灵活调整配置,同时结合日志分析和性能监控(如nginx-status模块)优化服务。

http://www.hskmm.com/?act=detail&tid=276

相关文章:

  • Nginx 基础
  • 零成本搭建企业系统:五款免费低代码平台推荐
  • 软件工程第一次作业-自我介绍
  • 通过pip的配置文件,来永久设置国内源‌
  • 软工第一次作业
  • .NET 单文件程序详解:从原理到实践 - C#混淆加密大师解包打包单文件程序
  • 用夏普比例和卡玛比率评估基金的性价比
  • 漏洞解析--CSRF
  • 0828-今日热点列表 - jobleap4u.com
  • 第一篇随笔
  • Rust/C/C++ 混合构建 - Buck2构建工具一探究竟
  • CF1404D Game of Pairs
  • Office支持终止:如何防止宏灾难
  • Linux运维-字符处理(1、文件查看)
  • UG NX保姆级下载图文安装教程+激活教程(UG NX 2506安装教程及激活教程)
  • Rust 环境搭建
  • 软件第一次作业
  • Node-RED 究竟是否适合工业场景?
  • 向量化与嵌入模型:RAG系统背后的隐形英雄
  • 微软日语输入法卡死 没有反应 的解决方法
  • 软工随笔
  • 反爬虫体系中设备ID的技术应用
  • 模拟信号采集的硬件基石:高性能ADC设计的核心法则
  • 你的测试又慢又不可靠-因为你测错了东西
  • WPS设置多级标题,一级标题为“一”、“二”、“三”,二级标题为“1.1”、“2.2”、“3.3”,三级标题为“1.1.1”、“2.2.2”、“3.3.3”
  • 你的部署流程已然落伍-热重启的失传艺术
  • 你的项目一团糟-不是你的错-是框架的锅
  • 超越-env-一份成熟的应用程序配置指南
  • 第一次作业
  • 第一周个人作业