关注△mikechen的架构笔记△,十余年BAT架构经验倾囊相授
大家好,我是mikechen。
Nginx是非常重要的负载均衡,也是大型架构必备技能,下面我就全面来详解Nginx配置文件@mikechen
最新mikechen原创超30万字《阿里架构师进阶专题合集》和《最全大厂面试题及答案总结》,请关注本公众号【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 服务器、强大的反向代理、灵活的负载均衡........等机制与功能。
以上
最后送大家一个福利:
送我原创超30万字阿里架构师进阶专题合集。
以及给大家整理最全大厂Java面试题及答案详解,包含:Java、多线程、JVM、Spring、MySQL、Redis、中间件...等必考题答案详解。
需要以上架构专题&面试答案的同学,加我微信即可领取!
添加时备注:资料