NGINX基础配置
文件路径
nginx的配置文默认件路径为/etc/nginx/nginx.conf(linux系统)或安装目录下的conf/nginx.conf
配置语法
- 指令:key value;
- 块:block { ... }
- main:全局配置(如 worker 进程数、日志格式)
- http:HTTP 服务相关配置(虚拟主机、反向代理等)
- server:虚拟主机配置(绑定域名、端口)
- location:URL 路径匹配规则(处理静态资源、转发请求)
- 区分大小写
- 注释使用#
配置解析
全局配置
# 设置nginx服务的系统使用的用户
user nginx;
# 工作进程数,一般与CPU相等
worker_processes auto;
# 关闭错误日志
# error_log off;
# 错误日志路径
error_log /var/log/nginx/error.log notice;
# 存放nginx服务master进程pid文件
pid /var/run/nginx.pid;
events {
# 每个worker进程支持最大连接数
worker_connections 1024;
}
http配置
http {
# 包含nginx可以解析的文件配置
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 关闭访问日志
# access_log off;
# 日志格式
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函数提高文件传输效率
sendfile on;
# 数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞
#tcp_nopush on;
# 小数据包是否立即发送出去
tcp_nodelay on;
keepalive_timeout 65;
# 是否启用压缩
#gzip on;
# 从其他文件加载虚拟配置
include /etc/nginx/conf.d/*.conf;
}
虚拟主机
一个虚拟主机,需配置域名和端口,也只处理对应主机域名的http请求,内可包含多个location块
-
listen字段 配置监听的端口(默认80),后可加ip(v4/v6)地址、端口或主机名
- listen 8080
- listen 127.0.0.1:8080
- listen *:8080
- listen [::]:8080
-
server_name字段 用于与http请求header头部的Host匹配,后可跟多个主机名,主机名也可使用通匹符
- example.com
- example1.com example2.com
- *.example.com
-
root字段 静态资源根目录
# http配置
server {
# 监听端口
listen 80;
# 绑定域名
server_name example1.com example2.com;
# 静态资源根目录
root /www/;
}
# https配置
server {
listen 443 ssl;
server_name secure.example.com;
# 证书文件
ssl_certificate /etc/nginx/cert/server.crt;
# 私钥文件
ssl_certificate_key /etc/nginx/cert/server.key;
# 优化 SSL 配置(可选)
# 一个用于控制 SSL/TLS 会话缓存有效期的指令
# 决定了客户端可以复用之前 SSL 握手建立的会话的时间长度,从而减少后续连接的握手开销,提升性能
# 单位可以是 s(秒)、m(分钟)、h(小时)、d(天)
ssl_session_timeout 5m;
# 加密套件
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
# 支持的协议版本
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 用于控制 SSL/TLS 握手过程中密码套件(Cipher Suites)优先级的指令
# 决定了服务器和客户端在协商加密算法时,是优先使用服务器支持的密码套件(服务器优先模式),还是客户端支持的密码套件(客户端优先模式)
ssl_prefer_server_ciphers on;
}
# 强制 HTTP 跳转 HTTPS
server {
listen 80;
server_name secure.example.com;
return 301 https://$host$request_uri;
}
location配置
配置对应具体的路径请求 - 匹配符号 - =:表示完全匹配,不存在正则表示,如 location = /uri {…} - ~:表示匹配时,大小写敏感,如 location ~ /uri {…} - ~:表示匹配时,大小写不敏感,即忽略大小写问题,如 location ~ /uri {…},这时 /uri,/Uri, /URI 都可以匹配上 - ^~:表示匹配时,只需开头部分匹配上即可,如 location ^~ /uri/ {…} ,这时只要以 /uri/ 开头的地址都会匹配上 - @:表示nginx内部的重定向,不直接处理用户的请求,如 location @error {…} , 这时可以到另一个location内部,重定向到 @error 路径,如 location ~ /test {error_page 404 @error}
- 匹配顺序
匹配成功时候,停止匹配,按当前匹配规则处理请求
- 精确匹配 = ,如果匹配成功,则停止其他匹配
- 前缀匹配 ^~ 顺序是从长到短
- 按文件中顺序的正则匹配
- 匹配不带任何修饰的前缀匹配
- 匹配 / 通用匹配
# http静态文件服务配置
location / {
root /www/;
index index.html;
}
location ^~ /static/ {
# 使用alias时 路径必须以/结尾 表明这是一个文件夹
alias /wwww/;
index index.html;
}
# 代理websocket
location /ws/ {
# 后端服务器地址
proxy_pass http://backend;
# 启用 WebSocket 支持
# 启用 HTTP/1.1 协议,支持 Upgrade 机制
proxy_http_version 1.1;
# 传递客户端的 Upgrade 请求头(通常为 websocket)
proxy_set_header Upgrade $http_upgrade;
# 指示服务器升级连接类型
proxy_set_header Connection "Upgrade";
# 配置超时参数
# 后端服务器响应超时时间(秒),避免长连接因长时间无数据被关闭
proxy_read_timeout 86400;
# 客户端发送数据超时时间(秒)
proxy_send_timeout 86400;
# 传递客户端真实 IP
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配置
定义一组后端服务器(上游服务器),实现负载均衡和高可用性
-
负载均衡算法
- 轮询(默认),每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,则自动剔除故障机器,使用户访问不受影响
- 权重轮询,weight值越大,分配到的几率就越高,主要用于后端每台服务器性能不均衡的情况
- ip_hash,每个请求按访问IP的哈希结果分配,这样每个访客固定访问一个后端服务器,可以有效的解决动态网页存在的session共享问题
- fair(第三方),更智能的一个负载均衡算法,此算法可以根据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。如果想要使用此调度算法,需要Nginx的upstream_fair模块
- url_hash(第三方),按访问URL的哈希结果来分配请求,使每个URL定向到同一台后端服务器,可以进一步提高后端缓存服务器的效率。如果想要使用此调度算法,需要Nginx的hash软件包
-
负载均衡调度状态
- down,表示当前server暂时不参与负载均衡
- backup,预留的备份机,当其他所有非backup机器出现故障或者繁忙的时候,才会请求backup机器,这台机器的访问压力最轻
- max_fails,允许请求的失败次数,默认为1,配合fail_timeout一起使用
- fail_timeout,经历max_fails次失败后,暂停服务的时间,默认为10s(某个server连接失败了max_fails次,则nginx会认为该server不工作了。同时,在接下来的 fail_timeout时间内,nginx不再将请求分发给失效的server)
upstream backend {
ip_hash;
server 192.168.0.1;
server 192.168.0.2:8080;
server 192.168.0.3 max_fails=5 fail_timeout=30s;
server 192.168.0.4 down;
}
完整配置
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
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;
upstream backend {
ip_hash;
server 192.168.0.1;
server 192.168.0.2:8080;
server 192.168.0.3 max_fails=5 fail_timeout=30s;
server 192.168.0.4 down;
}
server {
listen 443 ssl;
server_name secure.example.com;
ssl_certificate /etc/nginx/cert/server.crt;
ssl_certificate_key /etc/nginx/cert/server.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
alias /www/;
index index.html index.htm;
}
location /backend/ {
proxy_pass https://backend/;
}
}
server {
listen 80;
server_name secure.example.com;
return 301 https://$host$request_uri;
}
}