Nginx 配置:从基础入门到高级实战的全面指南
前言
在 Web 服务架构中,Nginx 以其卓越的高性能、高并发处理能力和灵活的配置特性,成为众多开发者和企业的首选 Web 服务器与反向代理工具。无论是静态资源服务、反向代理转发,还是负载均衡、安全防护,Nginx 都能通过合理的配置轻松实现。然而,Nginx 的配置语法相对复杂,不同模块与指令的组合使用方式多样,这也让不少初学者望而却步。本文我将从 Nginx 配置的基本结构出发,逐步深入到高级配置实践,并结合实际案例,帮你全面掌握 Nginx 配置的核心要点与技巧。
一、Nginx 配置基本结构
1.1 Nginx 配置文件结构
Nginx 的配置主要集中在配置文件中,默认情况下,主配置文件路径为/etc/nginx/nginx.conf
。整个配置文件采用模块化、层级化的结构,主要包含以下几个核心部分:
-
全局块:位于配置文件最外层,主要设置 Nginx 运行的全局参数,如工作进程数、PID 文件路径、错误日志路径等。这些参数对 Nginx 的整体运行环境进行基础配置。
-
events 块:用于配置 Nginx 的网络连接相关参数,例如最大连接数、事件驱动模型等,影响 Nginx 处理客户端请求的性能。
-
http 块:Nginx 的核心配置区域,几乎所有与 HTTP 协议相关的配置都在这里完成。它包含了大量的子配置块和指令,用于定义服务器、虚拟主机、请求处理规则等。http 块中还可以嵌套
server
块,每个server
块对应一个虚拟主机的配置。 -
server 块:用于配置虚拟主机,每个
server
块定义了一个独立的虚拟主机服务,包括监听端口、域名、请求处理规则、资源路径等。一个 http 块中可以包含多个server
块,实现多个虚拟主机的部署。 -
location 块:嵌套在
server
块内,用于定义针对不同 URL 路径的请求处理规则。可以根据请求的 URL 路径,设置不同的响应方式,如返回静态文件、代理到后端服务器等 。
1.2 配置指令语法规则
Nginx 的配置指令遵循特定的语法规则:
-
指令格式:大多数指令由指令名称和参数组成,以分号
;
结尾。例如,worker_processes 4;
,其中worker_processes
是指令名称,4
是参数,表示设置 Nginx 的工作进程数为 4 个。 -
层级关系:指令可以在不同的配置块中使用,且部分指令只能在特定的块中生效。例如,
listen
指令通常用于server
块中,用于设置虚拟主机监听的端口;而worker_processes
指令只能在全局块中使用。 -
注释:使用
#
符号进行单行注释,被注释的内容在 Nginx 解析配置文件时会被忽略 。
二、Nginx 基础配置详解
2.1 全局块配置
2.1.1 工作进程数配置
worker_processes
指令用于设置 Nginx 工作进程的数量。通常建议将其设置为服务器 CPU 核心数,以充分利用服务器资源,提高并发处理能力。
worker\_processes auto;
上述配置中,auto
关键字会让 Nginx 自动检测服务器的 CPU 核心数并进行设置。
2.1.2 错误日志与 PID 文件配置
error_log
指令用于指定错误日志的路径和日志级别,方便排查 Nginx 运行过程中的错误;pid
指令用于指定 Nginx 进程 ID 文件的路径,便于管理 Nginx 进程。
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
这里将错误日志路径设置为/var/log/nginx/error.log
,日志级别设置为warn
,表示记录警告及以上级别的错误信息;PID 文件路径设置为/var/run/nginx.pid
。
2.2 events 块配置
2.2.1 最大连接数配置
worker_connections
指令用于设置每个工作进程的最大连接数。它决定了 Nginx 能够同时处理的客户端连接数量。
events {
worker_connections 1024;
}
上述配置表示每个工作进程最多可以同时处理 1024 个客户端连接。
2.2.2 事件驱动模型选择
Nginx 支持多种事件驱动模型,如select
、poll
、epoll
(Linux 系统)等。在 Linux 系统下,通常推荐使用epoll
模型,它具有更高的性能和效率。可以通过use
指令进行设置:
events {
use epoll;
worker_connections 1024;
}
2.3 http 块基础配置
2.3.1 日志格式定义
通过log_format
指令可以自定义 Nginx 的访问日志格式,方便对请求进行分析和统计。
http {
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 /var/log/nginx/access.log main;
}
上述配置定义了名为main
的日志格式,包含了客户端 IP 地址、请求时间、请求方法、响应状态码等信息,并将访问日志记录到/var/log/nginx/access.log
文件中。
2.3.2 MIME 类型配置
include
指令用于引入外部配置文件,在 http 块中,常通过引入mime.types
文件来配置 Nginx 支持的 MIME 类型,以便正确处理不同类型的文件。
http {
include mime.types;
default_type application/octet-stream;
}
default_type
指令设置默认的 MIME 类型为application/octet-stream
,当 Nginx 无法识别文件的 MIME 类型时,将使用该默认值。
三、Nginx 虚拟主机与 location 配置
3.1 server 块配置(虚拟主机)
3.1.1 监听端口与域名配置
listen
指令用于设置虚拟主机监听的端口,server_name
指令用于指定虚拟主机对应的域名。
server {
listen 80;
server_name example.com www.example.com;
# 其他配置...
}
上述配置表示该虚拟主机监听 80 端口,同时响应example.com
和www.example.com
两个域名的请求。
3.1.2 根目录与索引文件配置
root
指令用于指定虚拟主机的根目录,index
指令用于设置默认的索引文件。
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.html index.htm;
# 其他配置...
}
当客户端访问该虚拟主机时,Nginx 会优先在/var/www/html
目录下查找index.html
或index.htm
文件作为默认响应内容。
3.2 location 块配置
3.2.1 基于 URL 路径的请求处理
location 块可以根据请求的 URL 路径进行匹配,并设置不同的处理规则。例如,将所有以/static
开头的请求映射到指定的静态资源目录:
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.html index.htm;
location /static/ {
alias /var/www/static/;
}
}
上述配置中,alias
指令将以/static
开头的 URL 请求映射到/var/www/static/
目录,Nginx 会从该目录中读取静态资源并返回给客户端。
3.2.2 正则表达式匹配
location 块还支持使用正则表达式进行 URL 匹配,通过在location
后添加~
符号表示使用正则匹配。例如,将所有以.jpg
、.png
结尾的图片请求映射到图片资源目录:
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.html index.htm;
location ~* \.(jpg|png)$ {
root /var/www/images;
}
}
~*
表示不区分大小写的正则匹配,当客户端请求的 URL 以.jpg
或.png
结尾时,Nginx 会从/var/www/images
目录中查找对应的图片文件。
四、Nginx 反向代理与负载均衡配置
4.1 反向代理配置
反向代理是 Nginx 的核心功能之一,通过将客户端请求转发到后端服务器,实现隐藏后端服务器、提高安全性和负载均衡等目的。
server {
listen 80;
server_name proxy.example.com;
location / {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
upstream backend_servers {
server 192.168.1.100:8080;
server 192.168.1.101:8080;
}
上述配置中,upstream
块定义了一个名为backend_servers
的服务器组,包含了两个后端服务器的地址和端口。server
块中的location
配置将所有请求通过proxy_pass
指令转发到backend_servers
服务器组,并通过proxy_set_header
指令设置请求头信息,以便后端服务器获取客户端的真实 IP 地址等信息。
4.2 负载均衡配置
Nginx 支持多种负载均衡策略,常见的有轮询(默认)、加权轮询、IP 哈希等。
4.2.1 轮询策略
轮询是 Nginx 默认的负载均衡策略,它将请求依次分配到后端服务器组中的每台服务器。
upstream backend_servers {
server 192.168.1.100:8080;
server 192.168.1.101:8080;
}
4.2.2 加权轮询策略
加权轮询可以根据服务器的性能等因素,为每台服务器设置不同的权重,权重越高的服务器接收的请求越多。
upstream backend_servers {
server 192.168.1.100:8080 weight=2;
server 192.168.1.101:8080 weight=1;
}
上述配置中,192.168.1.100:8080
服务器的权重为 2,192.168.1.101:8080
服务器的权重为 1,前者将接收约两倍于后者的请求数量。
4.2.3 IP 哈希策略
IP 哈希策略根据客户端的 IP 地址进行哈希计算,将同一个 IP 地址的请求始终分配到同一台后端服务器,保证了会话的一致性。
upstream backend_servers {
ip_hash;
server 192.168.1.100:8080;
server 192.168.1.101:8080;
}
五、Nginx 安全与优化配置
5.1 防止恶意请求配置
5.1.1 限制 IP 访问频率
通过limit_req
模块可以限制客户端 IP 的请求频率,防止恶意攻击和流量滥用。
http {
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
server {
listen 80;
server_name example.com;
location / {
limit_req zone=mylimit;
# 其他配置...
}
}
}
上述配置中,limit_req_zone
指令定义了一个名为mylimit
的请求限制区域,使用客户端 IP 地址作为键值,限制每个 IP 地址的请求速率为每秒 10 次。limit_req
指令在location
块中启用该限制。
5.1.2 防止 SQL 注入与 XSS 攻击
通过ngx_http_xss_filter_module
和ngx_http_sql_injection_filter_module
模块,可以对请求数据进行过滤,防止 SQL 注入和跨站脚本攻击(XSS)。需要在编译 Nginx 时添加相应模块支持,并进行配置:
http {
xss_filter on;
xss_filter_level HIGH;
sql_injection_filter on;
sql_injection_sensitive_word_file conf/sql_injection_sensitive_words.conf;
# 其他配置...
}
5.2 性能优化配置
5.2.1 Gzip 压缩配置
启用 Gzip 压缩可以减小响应数据的大小,加快页面加载速度。
http {
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}
上述配置启用了 Gzip 压缩,设置了压缩级别、缓冲区大小、支持压缩的文件类型等参数。
5.2.2 连接优化配置
调整 Nginx 的连接相关参数,如keepalive_timeout
(保持连接超时时间)、sendfile
(启用零拷贝机制)等,可以提高 Nginx 的性能。
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# 其他配置...
}
六、Nginx 配置实践案例
6.1 静态资源服务器配置
假设需要搭建一个静态资源服务器,用于提供 HTML、CSS、JavaScript、图片等静态文件。配置如下:
server {
listen 80;
server_name static.example.com;
root /var/www/static;
index index.html index.htm;
location / {
autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
}
location ~* \.(jpg|png|gif|css|js)$ {
expires 30d;
}
}
上述配置中,root
指令指定静态资源的根目录为/var/www/static
;location /
块启用目录索引功能,方便查看目录下的文件;location ~* \.(jpg|png|gif|css|js)$
块为图片、CSS、JS 等文件设置缓存过期时间为 30 天,减少客户端重复请求。
6.2 动态网站反向代理与负载均衡配置
以一个 Java Web 应用为例,后端有两台 Tomcat 服务器提供服务,通过 Nginx 实现反向代理和负载均衡。
upstream tomcat_servers {
server 192.168.1.100:8080 weight=2;
server 192.168.1.101:8080 weight=1;
}
server {
listen 80;
server_name dynamic.example.com;
location / {
proxy_pass http://tomcat_servers;
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_connect_timeout 600;
proxy_read_timeout 600;
proxy_send_timeout 600;
}
}
上述配置中,upstream
块定义了后端 Tomcat 服务器组,并设置了加权轮询策略;server
块将所有请求反向代理到后端服务器组,并设置了代理连接和读写超时时间,保证请求处理的稳定性。
总结
Nginx 的配置是一项复杂而又灵活的工作,从基础的文件结构、指令语法,到虚拟主机、反向代理、负载均衡,再到安全优化和实践案例,每个环节都需要深入理解和熟练掌握。通过合理配置 Nginx,可以搭建出高性能、高可靠、安全稳定的 Web 服务架构,满足不同业务场景的需求。在实际应用中,我们需要根据具体的业务需求和服务器环境,不断调整和优化 Nginx 配置,以达到最佳的运行效果。
若这篇内容帮到你,动动手指支持下!关注不迷路,干货持续输出!
ヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノ