分类
nginx的配置文件格式分为主模块,events块,http块,server块,location块。模块又大致分为核心模块,基础模块,邮件模块,其他模块。下面介绍一下常见的模块使用。
主模块
主模块一般为nginx的用户组,nginx的pid文件路径,worker的进程数,错误日志的存放路径及日志等级。
daemon
daemon off
这个表示nginx以前台模式运行。如果你的nginx不是在容器中运行的,请不要修改为off,默认为on。
因为在容器中nginx启动命令完成后,容器进程也就退出了,为了保持容器的状态,需要修改daemon为off。
nginx镜像中已经默认开启了off模式,CMD ["nginx", "-g", "daemon off;"]
。
也可以不用off,启动容器时使用docker run -d
;或者在启动命令后加上&& cat
,这样容器进程就会在前台卡住不会退出。
error_log
错误日志输出路径,有多种等级。
error_log /var/log/nginx/error.log [ debug | info | notice | warn | error | crit ]
如果nginx编译了--with-debug
模块,还可以添加debug日志等级。
error_log LOGFILE [ debug_core | debug_alloc | debug_mutex | debug_event
]: | debug_http | debug_imap ;
include
可以在任意地方使用include指令实现配置文件的包含。
include vhosts/*.conf;
pid
指定nginx进程文件路径。
pid /var/run/nginx.pid;
user
指定nginx worker进程运行用户,用户组,默认是nobody用户。
user nginx nginx;
worker_processes
指定worker进程数。
worker_proceses 8;
worker_cpu_affinity
指定worker进程绑定的CPU。
worker_proceses 4;
worker_cpu_affinity 0001 0010 0100 1000;
worker_rlimit_nofile
指定每个worker进程最多能打开的文件描述符。
worker_rlimit_nofile 1047552;
events块
use
指定nginx使用的事件驱动模型,有select,poll,epoll,resig,/dev/poll,kqueue,eventport,区别在这里
use epoll;
worker_connections
指定每个worker进程最大连接数
worker_connections 65535;
multi_accept
设置 worker进程是否可以同时接受多个网络连接,默认为off
multi_accept on;
accept_mutex
nginx 使用连接互斥锁进行顺序的accept()系统调用,防止惊群现象。默认为on。
accept_mutex on;
基本模块
http core模块
client_body_buffer_size
设置客户端请求体缓冲区大小。可以在http, server, location块中。如果请求体大于缓冲区,则将整个请求体或部分写入临时文件中。默认是8k或者16k,是页大小的2倍。
client_body_buffer_size 8k;
client_body_timeout
设置客户端的请求超时时间,只有在一个readstep中没有获取到body时才设置超时。如果在此时间之后客户端没有发送任何消息,nginx返回错误"Request time out"(408)。
client_body_timeout 60s;
client_header_buffer_size
设置客户端请求头的缓冲区大小。默认是1k。
client_header_buffer_size 1k;
client_header_timeout
读取header超时时间。
client_header_timeout 60s;
large_client_header_buffers
当header超出1k时,可以通过这个设置buffer大小。
请求行不能超过一个缓冲区的大小,如果客户端发送一个更大的头nginx返回错误" request URI too large"(414)。
请求的最长标题行也不能超过一个缓冲区的大小,否则客户端会得到错误“Bad request”(400)。
large_client_header_buffers 4 8k;
client_max_body_size
客户端请求体大小。如果超出会报错:Request Entity Too Large" (413)。在上传文件或更新时可能会遇到。默认是1m。
client_max_body_size 200m;
default_type
指定默认文件类型。
default_type text/html;
error_page
指定错误页面。
error_page 404 /404.html;
error_page 502 503 504 /50x.html;
keepalive_timeout
指定与客户端保持连接的超时时间。
keepalive_timeout 60s;
keepalive_requests
在长连接上可以发出的请求数。
keepalive_requests 10000;
listen
监听的地址和端口。
listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
listen localhost:8000;
listen [::]:8000;
listen [fe80::1];
location
根据URI进行不同的配置。可以使用正则。
location = / {
# matches the query / only.
[ configuration A ]
}
location / {
# matches any query, since all queries begin with /, but regular
# expressions and any longer conventional blocks will be matched first.
[ configuration B ]
}
location ^~ /images/ {
# matches any query beginning with /images/ and halts searching, so regular expressions will not be checked.
[ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
# matches any request ending in gif, jpg, or jpeg.
[ configuration D ]
}
root
指定请求的根路径。
sendfile
允许sendfile方式传输文件,默认为off。
sendfile on;
server
声明虚拟主机的配置。
listen 8080; #监听端口
server_name 127.0.0.1; #监听地址
server_name example.com www.example.com;
location / {
xxx
}
log_format
日志格式。
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
访问日志。
access_log /var/log/nginx/access.log main;
upstream
配置负载均衡。
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
}
server {
location / {
proxy_pass http://backend;
}
}
access
ngx_http_access_module 模块可以对特定IP客户端进行控制。
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
deny all;
}
auth_basic
使用用户名和密码基于 HTTP 进行认证。
location / {
auth_basic "Restricted";
auth_basic_user_file conf/htpasswd;
}
htpasswd文件格式如下:密码必须使用函数 crypt(3) 加密。可以使用Apache的htpasswd工具来创建密码文件。
用户名:密码
用户名2:密码2:注释
用户名3:密码3
fastcgi
许Nginx 与FastCGI 进程交互,并通过传递参数来控制FastCGI 进程工作。
location / {
fastcgi_pass localhost:9000;
fastcgi_index index.php;
# 该指令指定的参数,将被传递给FastCGI-server。
fastcgi_param SCRIPT_FILENAME /home/www/scripts/php$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
# 参数SCRIPT_FILENAME 是PHP 用来确定执行脚本的名字,而参数QUERY_STRING 是它的一个子参数。
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
# 处理POST请求
}
gzip
支持在线实时压缩输出数据流.
# 开启gzip
gzip on;
# 设置允许压缩的页面最小字节数
gzip_min_length 1000;
# 设置gzip的缓冲区大小。按照原始数据大小以8k为单位的4倍申请内存。默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果。
gzip_buffers 4 8k;
# Nginx作为反向代理的时候启用,根据header信息来确定是否开启压缩。
gzip_proxied expired no-cache no-store private auth;
# 匹配MIME类型进行压缩,(无论是否指定)"text/html"类型总是会被压缩的。
gzip_types text/plain application/xml;
headers
设置HTTP报文的header。
# 设置过期时间。
expires 24h;
expires 0;
expires -1;
expires epoch;
# 当HTTP应答状态码为 200、204、301、302 或 304 的时候,增加指定的header。
add_header Cache-Control private;
index
指定用来做默认文档的文件名,可以在文件名处使用变量。 如果您指定了多个文件,那么将按照您指定的顺序逐个查找。 可以在列表末尾加上一个绝对路径名的文件。
index index.$geo.html index.0.html /index.html;
referer
当request header中的“Referer”的值不正确时,可以阻止对站点的访问。
location /photos/ {
valid_referers none blocked www.mydomain.com mydomain.com;
if ($invalid_referer) {
return 403;
}
}
proxy
它的作用就是将请求转发到相应的服务器。在实际的反向代理工作中,会通过 location 功能匹配指定的URI,然后把接收到的符合匹配URI的请求通过proxy_pass抛给定义好的upstream节点池。
location /some/path/ {
proxy_pass http://127.0.0.1;
}
# 与 rewrite 同时存在时,proxy_pass 中的 path 不会替换,相当于不起作用
location /name/ {
# /$1的意思是, 先将 /tmp/img 删除, 只保留其后面的路径
rewrite /name/([^/]+) /users?name=$1 break;
# 改写完之后, 再进行代理;
proxy_pass http://127.0.0.1;
}
上面的只是对响应体的处理方式,其他比如对请求体的处理等详情参考这里:
https://blog.csdn.net/error311/article/details/106973476/
rewrite
用于实现URL的重写,301、302的跳转,http跳转到https等。
rewrite可以配置在 server、location、if。
如果在同一级配置块中存在多个rewrite规则,那么会自下而下逐个检查。
rewrite flag
redirect;
#临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求;
#使用相对路径,或者http://或https://开头,状态码:302
permanent;
#重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求,状态码:301
break;
#重写完成后,停止对当前URL在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环,建议在location中使用
#适用于一个URL一次重写
last;
#重写完成后,停止对当前URI在当前location中后续的其它重写操作,而后对新的URL启动新一轮重写检查,不建议在location中使用
#适用于一个URL多次重写,要注意避免出现超过十次以及URL重写后返回500错误给用户
跳转型指由客户端浏览器重新对新地址进行请求,客户端的浏览器地址信息会发生变化,如:301,302。
代理型是在WEB服务器内部实现跳转,客户端的浏览器地址信息不会发生变化,如: last,break。
例子参考这里:
https://blog.csdn.net/wzj_110/article/details/125231908