核心配置文件结构
Nginx 的核心配置文件通常位于/etc/nginx/nginx.conf。这个文件包含了全局配置和多个服务器块(server block)。全局配置部分设置了 Nginx 运行的基本参数,如工作进程数、错误日志路径等。而服务器块则针对不同的虚拟主机或服务进行单独配置,一个配置文件中可以存在多个服务器块,每个服务器块负责处理特定域名或 IP 地址的请求。
http {
# 全局配置
user nginx; # nginx用户启动
worker_processes auto; # 工作进程数,自动根据CPU核心数调整Worker进程数量
error_log /var/log/nginx/error.log; # 错误日志路径
pid /var/run/nginx.pid; # 进程ID地址
# 开启压缩机制
gzip on;
# 指定会被压缩的文件类型(也可自己配置其他类型)
gzip_types text/plain application/javascript text/css application/xml text/javascript image/jpeg image/gif image/png;
# 设置压缩级别,越高资源消耗越大,但压缩效果越好
gzip_comp_level 5;
# 在头部中添加Vary: Accept-Encoding(建议开启)
gzip_vary on;
# 处理压缩请求的缓冲区数量和大小
gzip_buffers 16 8k;
# 对于不支持压缩功能的客户端请求不开启压缩机制
gzip_disable "MSIE [1-6]\."; # 低版本的IE浏览器不支持压缩
# 设置压缩响应所支持的HTTP最低版本
gzip_http_version 1.1;
# 设置触发压缩的最小阈值
gzip_min_length 2k;
# 关闭对后端服务器的响应结果进行压缩
gzip_proxied off;
sendfile on; # 开启零拷贝机制
# 负载均衡
upstream api_server{
ip_hash; # 同个IP或客户端每次请求都匹配两个服务端
# 30s内检查心跳发送两次包,未回复就代表该机器宕机,请求分发权重比为1:2
server 192.168.1.100:8080 weight=100 max_fails=2 fail_timeout=30s;
server 192.168.1.101:8080 weight=200 max_fails=2 fail_timeout=30s;
}
# 服务器块示例,一般单独文件出来,好维护
server {
listen 80; # 监听的端口
server_name chenxianlin.com; # 解析的域名,如果是其它域名则不会匹配下面规则,可以设置多个,使用逗号隔开,如 chenxianlin.com,www.chenxianlin.com
# 将请求改写为HTTPS,即直接走https配置的规则
# rewrite ^(.*)$ https://chenxianlin.com;
# 匹配根路径, 即 chenxianlin.com
location / {
root /usr/share/nginx/html; # 匹配后访问的目录
index index.html index.htm; # 匹配后访问对应目录下的文件
}
}
server {
# 监听HTTPS默认的443端口
listen 443;
# 配置自己项目的域名
server_name chenxianlin.com;
# 打开SSL加密传输
ssl on;
# 输入域名后,首页文件所在的目录
root html;
# 配置首页的文件名
index index.html index.htm index.jsp index.ftl;
# 配置自己下载的数字证书
ssl_certificate certificate/cxl.pem;
# 配置自己下载的服务器私钥
ssl_certificate_key certificate/cxl.key;
# 停止通信时,加密会话的有效期,在该时间段内不需要重新交换密钥
ssl_session_timeout 5m;
# TLS握手时,服务器采用的密码套件
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
# 服务器支持的TLS版本
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 开启由服务器决定采用的密码套件
ssl_prefer_server_ciphers on;
# 匹配根路径, 即 chenxianlin.com
location / {
root /usr/share/nginx/html; # 匹配后访问的目录
index index.html index.htm; # 匹配后访问对应目录下的文件
}
}
# 屏蔽该文件中的所有IP,全局设置
# include /usr/local/nginx/IP/BlocksIP.conf;
# 引入目录下的配置
include conf.d/*.conf;
}
server里的各种配置
location /api/ {
# 反向代理
proxy_pass http://127.0.0.1:8080; # 将api开头的url请求转发到 127.0.0.1:8080 这个地址
# 使用负载均衡
# proxy_pass http://api_server;
proxy_set_header Host $host; # 设置请求头 host,以便在转发后下游能正常获取到该值
proxy_set_header X-Real-IP $remote_addr; # 设置请求头 X-Real-IP,客户端的真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 设置请求头 X-Forwarded-For,包含客户端的 IP 地址以及所有经过的代理服务器的 IP 地址
proxy_set_header X-Forwarded-Proto $scheme; # 这是一个自定义的 HTTP 头字段,用于标识客户端到 Nginx 服务器之间的通信协议(如 http 或 https)
# client_max_body_size 100m; # 设置请求体允许的最大体积,即客户端上传的文件或数据
# client_header_timeout 60s; # 等待客户端发送一个请求头的超时时间
# client_body_timeout 30s; # 设置读取请求体的超时时间
# proxy_read_timeout 30s; # 设置请求被后端服务器读取时,Nginx等待的最长时间
# proxy_send_timeout 30s; # 设置后端向Nginx返回响应时的超时时间
# 设置对 websocket 的支持
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 允许跨域的请求,可以自定义变量$http_origin,*表示所有
add_header 'Access-Control-Allow-Origin' *;
# 允许携带cookie请求
add_header 'Access-Control-Allow-Credentials' 'true';
# 允许跨域请求的方法:GET,POST,OPTIONS,PUT
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT';
# 允许请求时携带的头部信息,*表示所有
add_header 'Access-Control-Allow-Headers' *;
# 允许发送按段获取资源的请求
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
# 一定要有!!!否则Post请求无法进行跨域!
# 在发送Post跨域请求前,会以Options方式发送预检请求,服务器接受时才会正式请求
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
# 对于Options方式的请求返回204,表示接受跨域请求
return 204;
}
# 黑白名单
allow xxx.xxx.xxx.xxx; # 允许指定的IP访问,可以用于实现白名单。
deny xxx.xxx.xxx.xxx; # 禁止指定的IP访问,可以用于实现黑名单。
deny xxx.xxx.xxx.xxx; # 禁止指定的IP访问,可以用于实现黑名单。
# include conf/whitelist.conf # 使用文件形式控制黑白名单, conf里的内容跟这里的一样,都是 allow xxx.xxx.xxx.xxx; 这种格式
}
# 在动静分离的location中开启防盗链机制,Nginx的防盗链机制实现,跟一个头部字段:Referer有关,该字段主要描述了当前请求是从哪儿发出的,那么在Nginx中就可获取该值,然后判断是否为本站的资源引用请求,如果不是则不允许访问。
# Nginx中通过配置项为valid_referers来实现,语法如下:
# - valid_referers none | blocked | server_names | string ...;
# - none:表示接受没有Referer字段的HTTP请求访问。
# - blocked:表示允许 http://或 https//以外的请求访问。
# - server_names:资源的白名单,这里可以指定允许访问的域名。
# - string:可自定义字符串,支配通配符、正则表达式写法。
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css){
# 最后面的值在上线前可配置为允许的域名地址
valid_referers blocked 192.168.1.129;
if ($invalid_referer) {
# 可以配置成返回一张禁止盗取的图片
# rewrite ^/ http://xx.xx.com/NO.jpg;
# 也可直接返回403
return 403;
}
root /soft/nginx/static_resources;
expires 7d;
}