配置
Nginx 的配置文件通常位于 /etc/nginx/nginx.conf,其基本结构如下:
全局块:设置全局范围的配置,如工作进程数、用户权限、日志路径等。
HTTP 块:配置 HTTP 服务器的相关设置,如缓存、压缩、负载均衡等。
Server 块:定义虚拟主机,处理不同域名的请求。
Location 块:用于匹配请求 URL,配置不同 URL 对应的处理方式。
nginx.conf
全局块
user nginx; // 配置worker进程的用户及用户组;
worker_processes auto; // 业务进程可接受连接数,默认数字1表示开启一个业务进程
error_log /var/log/nginx/error.log notice; // 错误日志存放路径
pid /var/run/nginx.pid; // pid(进程标识符):存放路径user指令
./configure --user=nginx --group=nginx
系统创建用户
useradd nginx
注释掉后,worker进程会显示nobody
目的控制权限访问(假如被入侵也只能访问nginx有权限访问的系统目录)work process指令
master_process on|off;
worker_processes num/auto; 建议将该值和服务器CPU的内核数保存一致
worker_rlimit_nofile 65535; // 设置最大可打开文件描述符的数量,默认0(操作系统自适应),设置后适用高并发daemon指令
daemon on|off; 是否以守护进程的方式启动,一般不会用pid指令
pid:用来配置Nginx当前master进程的进程号ID存储的文件路径。
默认为:/usr/local/nginx/logs/nginx.pid
ps -ef | grep nginxerror_log指令
error_log /var/log/nginx/error.log notice;
可用于 全局块、http、server、location
./configure --error-log-path=PATH来指定
日志级别的值有:debug|info|notice|warn|error|crit|alert|emerginclude指令
include /etc/nginx/conf.d/*.conf;
include file; 用来引入其他配置文件,使Nginx的配置更加灵活
可配置在任意处;events块
events {
accept_mutex on;
multi_accept on;
worker_connections 1024; // 每个 worker 进程的最大并发连接数。
use epoll;
}accept_mutex指令
accept_mutex on|off; 默认值on,设置Nginx网络连接序列化:
如果将上述值设置为on(开启状态),将会对多个Nginx进程接收连接进行序列号,一个个来唤醒接收,就防止了多个进程对连接的争抢。multi_accept指令
multi_accept on|off; 默认值off,设置是否允许同时接收多个网络连接:
nginx一个worker 进程只能同时接受一个新的连接。否则,一个worker 进程可以同时接受所有的新连接worker_connections指令
worker_connections number; 默认值512use指令
use epoll; 此处所选择事件处理模型是Nginx优化部分的一个重要内容,method的可选值有select/poll/epoll/kqueue等,
epoll: 多路复用http块
http {
set_real_ip_from 0.0.0.0/0; // 信任所有的 IP 地址,生产环境尽量制定ip范围设置,如:192.168.1.0/24(192.168.1.0 到 192.168.1.255)
real_ip_header X-Forwarded-For; // 从 X-Forwarded-For 头部字段里获取客户端的真实 IP 地址
real_ip_recursive on; // 处理客户端真实 IP 地址的指令
server_names_hash_bucket_size 128; //虚拟主机数量较多、server_name 较长时设置,默认32或64(按操作系统)。配置了大量的虚拟主机时,server_name 的数量会相应增加。如果桶的大小设置过小,可能会导致哈希冲突频繁发生,从而降低查找效率。此时,适当增大
proxy_hide_header X-Powered-By; // 隐藏 X-Powered-By 头信息,增强网站的安全性
proxy_hide_header Server; // 隐藏 Server 头信息
proxy_intercept_errors on; // 拦截后端的错误响应,然后根据 Nginx 自身的配置进行处理,例如返回自定义的错误页面
server_tokens off; // 隐藏nginx的版本号,例如 Server: Nginx/1.25.3,仅显示 Server: Nginx
include mime.types; // mime.types文件中定义了各种文件扩展名与 MIME 类型的映射关系,设置 Content-Type 响应头
default_type application/octet-stream; //默认的 MIME 类型
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; // 开启 sendfile 功能,零拷贝(Zero-Copy)技术
tcp_nopush on; //在开启 sendfile 的同时,通常还会配合 tcp_nopush 和 tcp_nodelay 指令来进一步优化 TCP 传输性能。
keepalive_timeout 65; // TCP 连接保持机制
gzip on; // 将文本内容(如 HTML、CSS、JavaScript文件等)进行压缩,减少数据的传输量。比如浏览器response的Content-Encoding:
}定义mime.types
include mime.types;
default_type application/octet-stream;
default_type可用于http、server、location定义日志
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
只能用于http块
access_log logs/access.log main; // 引用上面main定义的日志格式
可用于http、server、location块sendfile指令
sendfile on; 默认值off, 该属性可以大大提高Nginx处理静态资源的性能keepalive_timeout指令
keepalive_timeout 65s; 默认值75s,设置长连接的超时时间。可用于http、server、location块keepalive_requests指令
keepalive_requests 100; 默认值100, 设置一个keep-alive连接使用的次数。可用于http、server、location块gzip扩展
gzip on; // 将文本内容(如 HTML、CSS、JavaScript文件等)进行压缩,减少数据的传输量。
gzip_min_length 1000; // 只有当响应内容的长度大于或等于这个值时,才会压缩,通常是20字节
gzip_comp_level 4; // 压缩级别,范围是 1(最快,压缩率最低)到 9(最慢,压缩率最高),建议将 gzip_comp_level 设置为 4 到 6 之间。这样可以在压缩率和压缩速度之间取得一个较好的平衡。越高对cpu消耗越大
gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css; // 指定哪些 MIME 类型的内容可以进行 Gzip 压缩
gzip_types text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml text/javascript application/javascript application/x-javascript text/x-json application/json application/x-web-app-manifest+json text/css text/plain text/x-component font/opentype application/x-font-ttf application/vnd.ms-fontobject image/x-icon;
gzip_buffers 4 16k; // 设置 Gzip 压缩缓冲区的指令
gzip_vary on; // 设置 Vary 响应头的指令,on会Hearder出现: Vary: Accept-Encoding
gzip_proxied any // 一般不配置,表示作为反向代理时是否启用压缩。有多个条件设置,如off、any、expried、auth
可以f12看 www.jd.com、www.baidu.com、www.aliyun.com等等
Response Hearder的 Content-Encoding: gzip成功启用后:
Transfer-Encoding: chunked
Content-Encoding: gzip
没有则:
Content-Length: 20045gzip和sendfile冲突问题
新版本Nginx(≥1.6):已优化兼容性。当同时启用sendfile和gzip时:
若响应需要压缩,Nginx自动禁用sendfile,改用缓冲读写(read + write),确保压缩生效。
若响应无需压缩(如已压缩文件、图片等),继续使用sendfile提升性能。tcp扩展
tcp_nopush on; // 减少TCP包的数量,数据包里发送所有头文件,而不是一个接一个发送;tcp_nopush 通常与 sendfile 指令一起使用
tcp_nodelay off; // 提供响应速度,降低带宽利用率,(如实时聊天、在线游戏、交互式 Web 应用等),tcp_nodelay 通常与 sendfile 指令一起使用三方模块扩展
limit_speed_zone one $binary_remote_addr 10m; // 创建一个名为one的速度限制区域,该区域根据客户端的IP($binary_remote_addr)来识别访问者,并为他们设置最大的速率限制为10MB/s。其他扩展
server_tokens off; // 隐藏nginx版本号
client_header_timeout 600; // 客户端在 600 秒内没有发送完整的请求头,Nginx 会关闭连接。
client_body_timeout 600; // 客户端在 600 秒内没有发送完整的请求体,Nginx 会关闭连接
client_max_body_size 1024m; // 请求体的最大大小为 1024MB(1GB),其默认值为 1m
client_body_buffer_size 1024m; // 客户端请求体的缓冲区大小为 1024MB(1GB),默认值取决于操作系统的页面大小,一般为 8KB 或者 16KB
proxy_buffering on; // 开启代理缓冲功能。默认开启
proxy_buffer_size 512k; // 默认值为4k或8k
proxy_buffers 8 256k; // 表示设置8个256k大小的缓冲区,默认 8 4k
proxy_busy_buffers_size 512k;
// 整体调高了缓存池大小,需要nginx所在机器内存够高
// 自定义变量判断是否是机器人,根据以下条件
map $http_user_agent $is_bot {
default 0;
~[a-z]bot 1;
~[sS]pider 1;
~spi_der 1;
~crawler 1;
~ysearch 1;
~Yahoo\sPipes 1;
~BingPreview 1;
~YoudaoFeedFetcher 1;
~Firefox\/3.0 1;
~MSIE\s6.0 1;
'Yahoo!\sSlurp' 1;
'Mediapartners-Google' 1;
}include /etc/nginx/conf.d/*.conf; // 允许将多个配置文件合并到主配置文件中,使配置更加模块化和易于管理server
server {
listen 80; // 监听在 80 端口上的虚拟主机
server_name localhost; // 虚拟主机的名称,ip或域名可多个,空格隔开;支持正则*.baidu.com、baidu.*、~^[0-9]+\.baidu\.com$;
#access_log logs/host.access.log main; // 单独给虚拟主机配置日志
#charset utf-8; // 统一字符集,会为所有响应添加 Content-Type 响应头,并包含 charset=utf-8 参数。例如:Content-Type: text/html; charset=utf-8
}lisiten指令
listen 127.0.0.1:8000; // listen localhost:8000 监听指定的IP和端口
listen 127.0.0.1; 监听指定IP的所有端口
listen 8000; 监听指定端口上的连接
listen *:8000; 监听指定端口上的连接
listen 8080 default_server; // 默认主机指的是如果没有匹配到对应的address:port,则会默认执行
的。如果不指定默认使用的是第一个serverserver_name指令
server_name localhost; 精确匹配
server_name *.baidu.com; 通配符匹配
baidu.*、~^[0-9]+\.baidu\.com$; 正则表达式匹配正则表达式的执行顺序
server{
listen 80;
server_name ~^www\.\w+\.com$;
return 200 '1';
}
server{
listen 80;
server_name www.liuchenyun.*;
return 200 '2';
}
server{
listen 80;
server_name *.liuchenyun.com;
return 200 '3';
}
server{
listen 80;
server_name www.itheima.com;
return 200 '4';
}
server{
listen 80 default_server;
server_name _;
return 444 '5';
}
结果: 4 > 3 > 2 > 1 > 5proxy代理配置
proxy_set_header Host $host; // 确保后端服务器知道客户端请求的域名
proxy_connect_timeout 3s; // 与后端服务器建立连接的超时时间为 3 秒
proxy_read_timeout 600s; // 从后端服务器读取响应的超时时间
proxy_set_header X-Real-IP $remote_addr; // 确保后端服务器知道客户端的真实 IP 地址,而不是代理服务器的 IP 地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; // 设置 X-Forwarded-For 头信息,将客户端的 IP 地址添加到 X-Forwarded-For 列表中
proxy_set_header X-Forwarded-Proto $scheme; // 设置 X-Forwarded-Proto 头信息,将请求的协议(如 http 或 https)传递给后端服务器。
proxy_intercept_errors on; // 启用错误拦截功能,允许 Nginx 拦截后端服务器返回的错误响应,并返回自定义的错误页面location
location / { // 匹配路径
root html; // 文件根目录
index index.html index.htm; // 默认页名称
}
error_page 500 502 503 504 /50x.html; 报错编码对应页面
location = /50x.html {
root html;
}
location / {
proxy_pass http://192.168.31.157:32006; // 请求转发到指定的后端服务器
}
location ~*/(js|img|css) { // 支持正则表达式,后端服务一般不用,用于前端项目比较适合
proxy_pass http://192.168.31.157:32006; // 请求转发到指定的后端服务器
}UrlRewrite
rewrite <regex> <replacement> [flag];
关键字 正则 替代内容 flag标记
rewrite参数的标签段位置:
server,location,if
flag标记说明:
last #本条规则匹配完成后,继续向下匹配新的location URI规则
break #本条规则匹配完成即终止,不再匹配后面的任何规则
redirect #返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent #返回301永久重定向,浏览器地址栏会显示跳转后的URL地址 location ~ ^/web/mycontent/account$ {
rewrite "^/(.*)$" http://cdtest.liuchenyun.com/console/dashboard break;
}upstream
负载均衡,不能保持会话
upstream myServer{
server 192.168.1.1:8080 weight=2; // 根据权重配置负载均衡
server 192.168.1.2:8080 weight=2 down; // down:不参与负载
server 192.168.1.3:8080 weight=2 backup; // backup:备用机,当 192.168.1.1宕机才会启用
server 192.168.247.129:8080 max_fails=3 weight=2; // 失败3次,标记为不可用
server 192.168.247.129:8081 max_fails=3 weight=4;
}
location / {
proxy_pass http://myServer ;
}- ip_hash:根据客户端ip保持转发到同一台服务器以保持会话(但是基站切换会导致ip变化)
- least_conn:根据连接次数分配(但是服务器性能不一致,造成流量倾斜)
- url_hash:根据用户访问url定向转发请求
- fair:根据后端服务相应时间转发请求(但是服务器性能不一致,造成流量倾斜)
- 以上都没法动态上下线服务器
动静分离
前端项目放nginx的html下
防盗链
valid_referers none | blocked | server_names | strings ....;- none,允许缺失 referer 头部的请求访问
- blocked,检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。
- server_names ,设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。
valid_referers none www.supermapol.com;
if ($invalid_referer) {
return 403;
}https
listen 443 ssl;
ssl_certificate /etc/nginx/cert/7917704__supermapol.com.pem; // 指定 SSL 证书文件的路径
ssl_certificate_key /etc/nginx/cert/7917704__supermapol.com.key; // 指定 SSL 私钥文件的路径
ssl_session_cache shared:SSL:1m; // 加密访问缓存设置,可以大大提高访问速度
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m; // 5m 表示 SSL 会话超时时间为 5 分钟。超时时间过后,客户端需要重新建立 SSL 会话。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; // 这个指令指定了 Nginx 支持的加密套件列表。ECDHE-RSA-AES128-GCM-SHA256 是一个强加密套件,其他选项用于排除不安全的加密套件。这些设置可以提高 SSL/TLS 连接的安全性。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; // 设置支持的 SSL/TLS 协议版本
ssl_prefer_server_ciphers on; // 会优先使用服务器端配置的加密套件