Nginx是非常重要的负载均衡,也是大型架构必备技能,下面我就全面来详解Nginx配置文件@mikechen
Nginx
Nginx 是一款高性能的 HTTP 服务器和反向代理服务器,Nginx 以其轻量级、可扩展性、和高并发处理能力而闻名。
Nginx广泛应用于各种 Web 服务环境中,比如:作为一个静态和动态内容的 Web 服务器。
Nginx 可以直接处理 HTTP 请求,提供静态文件(如: HTML、CSS、JS、图片…等)。
Nginx 支持对传输内容进行压缩,如 Gzip 压缩,这不仅可以节省带宽,还能加快内容传输速度。
Nginx 作为反向代理服务器,接收客户端请求并将其转发给后端服务器,同时返回来自后端服务器的响应。
Nginx广泛用于负载均衡、请求缓存和加速、SSL 终端…….等。
Nginx配置文件
Nginx 的配置文件主要由以下几部分组成:全局块、events
块、http
块,以及 server
块。。。等。
如下图所示:
全局块:配置影响整个 “Nginx” 服务的指令;
events 块:配置 Nginx 如何处理连接相关的指令;
http 块:主要配置: HTTP 服务器相关的指令,包括:处理 HTTP 请求。。。等行为。
下面,我分别重点详解Nginx核心的配置文件@mikechen
Nginx全局配置
全局配置部分通常位于文件的最开头,这些指令适用于 Nginx 的整个生命周期。
# 全局配置 user www-data; # 定义Nginx的运行用户 worker_processes 4; # 设置工作进程数,通常设置为CPU核心数 error_log /var/log/nginx/error.log warn; # 定义错误日志路径和日志级别 pid /var/run/nginx.pid; # 存放Nginx进程ID的文件位置
user
:指定 Nginx 进程的用户/和组;worker_processes
:指定工作进程的数量,auto
表示自动检测 CPU 核数并设置合适的进程数。error_log
:定义错误日志的路径及日志级别,比如:日志级别包括debug
、info
、notice
、warn
、error
、crit
、alert
和emerg。
pid
:指定存放 Nginx 主进程 ID 的文件路径。
events 块
events 块主要用于:配置、与网络连接和工作线程相关的参数。
events
块配置,影响 Nginx 与操作系统之间的网络通信方式。
配置如下:
events { worker_connections 1024; # 每个工作进程允许的最大连接数 }
worker_connections
:每个工作进程允许的最大连接数;- worker_connections 1024:每个工作进程可以同时打开的最大连接数,该数值影响Nginx的并发能力;
http 块
http
块是 Nginx 的核心,用于处理 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"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; keepalive_timeout 65; gzip on; include /etc/nginx/conf.d/*.conf; }
include
:包含其他配置文件或片段,通常用来导入 MIME 类型等。default_type
:设置默认的 MIME 类型,例如application/octet-stream
用于未识别文件类型。log_format
:定义日志的格式,这里定义了一个名为main
的日志格式。access_log
:指定访问日志的路径和格式。sendfile
:开启sendfile
,用于高效地传输文件。tcp_nopush
:在使用sendfile
时,可以提高性能。keepalive_timeout
:定义客户端保持连接的超时时间。gzip
:开启 gzip 压缩,以减少传输数据量。
server 块
server 块定义了一个虚拟主机的配置,用于处理不同域名或 IP 地址的请求。
每个 server 块可以有多个 location 块,配置如下:
server { listen 80; # 监听端口 server_name example.com www.example.com; # 定义服务器域名 location / { root /usr/share/nginx/html; # 站点根目录 index index.html index.htm; # 默认首页文件 } location /images/ { root /usr/share/nginx/html; # 静态文件目录 autoindex on; # 自动列出目录内容 } error_page 404 /404.html; # 自定义404错误页面 location = /404.html { root /usr/share/nginx/html; } # 反向代理配置 location /api/ { proxy_pass http://backend_server; # 转发到后端服务器 proxy_set_header Host $host; # 保留原始请求的Host头 proxy_set_header X-Real-IP $remote_addr; # 保留客户端IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 保留代理链 proxy_set_header X-Forwarded-Proto $scheme; # 保留请求协议(HTTP/HTTPS) } }
listen
:指定 Nginx 监听的端口号,如 80
(HTTP)、或 443
(HTTPS);
server_name
:定义虚拟主机的域名,可以是一个或多个域名,支持通配符;
location
:匹配 URI 路径并定义如何处理请求,例如 /
代表根路径,而 /images/
代表所有以 /images/
开头的请求路径;
root
:指定资源的根目录;
index
:指定默认的索引文件,当请求指向一个目录时,Nginx 会查找该目录下的索引文件。
autoindex
:打开目录列表,如果目录中没有 index
文件,Nginx 会列出该目录中的文件。
error_page
:指定错误页面,例如 404 错误的页面。
location 块
location
块用于根据 URI 匹配规则处理请求,可以嵌套在 server
块中。
location
:匹配的 URI,可以是精确匹配 =
、前缀匹配 ^~
、正则匹配 ~
或 ~*
(不区分大小写)。
配置如下:
location /api/ { proxy_pass http://backend_server; # 转发到后端服务器 proxy_set_header Host $host; # 保留原始请求的Host头 proxy_set_header X-Real-IP $remote_addr; # 保留客户端IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 保留代理链 proxy_set_header X-Forwarded-Proto $scheme; # 保留请求协议(HTTP/HTTPS) }
proxy_pass http://backend_server;
反向代理,将请求转发到指定的后端服务器。
proxy_set_header Host $host;
传递请求的Host头到后端服务器。
proxy_set_header X-Real-IP $remote_addr;
传递客户端的真实IP地址。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
用于保留客户端的代理链。
proxy_set_header X-Forwarded-Proto $scheme;
用于传递请求协议,通常用于判断是否通过HTTPS访问。
Nginx反向配置
Nginx 常用于反向代理,将请求转发给后端服务器,如下所示:
http { upstream backend { server backend1.example.com; server backend2.example.com; server backend3.example.com; } server { listen 80; server_name example.com; location / { proxy_pass http://backend; 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 X-Forwarded-Proto $scheme; } } }
Nginx负载均衡配置
Nginx 可以通过 upstream
指令实现负载均衡,如下所示:
upstream backend { server backend1.example.com weight=3; server backend2.example.com; server backend3.example.com backup; } server { location / { proxy_pass http://backend; } }
upstream
:定义后端服务器池。weight
:指定权重。backup
:指定备用服务器。
Nginx SSL配置
Nginx 也可以用来处理 HTTPS 请求,如下所示:
server { listen 443 ssl; server_name example.com; ssl_certificate /etc/ssl/certs/nginx.crt; ssl_certificate_key /etc/ssl/private/nginx.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; }
ssl_certificate
:指定 SSL 证书文件路径。ssl_certificate_key
:指定 SSL 证书密钥文件路径。ssl_protocols
:定义支持的 SSL/TLS 协议版本。ssl_ciphers
:定义加密套件。
Nginx动静分离配置
可以将静态资源,比如:图片、CSS、JS 文件…直接由 Nginx 提供,动态请求则转发到后端服务器处理。
从而实现动静分离,配置如下:
server { listen 80; server_name example.com; # 静态资源直接由 Nginx 提供 location /static/ { root /var/www/html; } # 动态请求转发到后端服务器 location / { proxy_pass http://backend_server; 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 X-Forwarded-Proto $scheme; } }
总之,Nginx 是一款功能强大的服务器软件,适用于各种 Web 服务场景。
Nginx 核心功能包括高效的 HTTP 服务器、强大的反向代理、灵活的负载均衡……..等机制与功能。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》