配置文件主要有main、events、http、server、location几个部分组成。
# 指定用户
user nobody;
# 工作进程数(物理CPU内核数或者内核数两倍)
worker_processes 1;
work_rlimit_nofile; # 用于设置最多打开文件数量
# 错误日志第一个参数为日志存放路径,第二个参数指定日志记录等级:debug,info,notice,warn,error,crit
# 等级越低记录日志越详细,默认error(还可以在http,server,location模块中)
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
# 关闭错误日志
# error_log /dev/null
#pid logs/nginx.pid;
events {
# 每个worker进程可以创建多少个连接
worker_connections 1024;
#使用epoll模型
use epoll;
# 是否允许一个工作进程响应多个请求
multi_accept on;
}
http {
# 访问控制配置在http模块中,表示全局生效,server中或者location中也有权限控制,http的会失效
# a、内层优先级高于外层;b、先出现会覆盖后出现的
#(这里有歧义:例子:allow 192.168.109.132;deny all。这种情况只允许192.168.109.132访问,其他都被阻止)
deny/allow all/固定ip
# include引入子配置文件,mime.types定义文件格式对应渲染方式
include mime.types;
#如果文件类型不包含在mine.types中,使用默认类型(application/octet-stream: 任意的二进制数据)
default_type application/octet-stream;
# 日志配置,main表示访问日志格式名称(可以自定义),后面字符串表示访问日志格式样式,log_format只可以出现在http模块中
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
# 定义存储路径和缓存大小,相对于安装路径(/usr/local/nginx),
#access_log logs/access.log main(这个名称和log_format中自定义名称一致) buffer=2k flush=5s;
# buffer 设置内存缓冲区大小,flush设置内容保存在缓冲区最大时间(多久刷新到磁盘)
# 关闭日志
#access_log off;
# 数据零拷贝(如果关闭,会将文件先加载到应用程序内存,然后转发到网络接口,开启就不会加载到内存,直接通过网络接口读取,减少数据拷贝过程)。
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
#隐藏版本号
server_tokens on;
#优化服务器域名的散列表大小
server_names_hash_bucket_size 64;
server_names_hash_max_size 2048;
#开启高效文件传输模式
sendfile on;
#减少网络报文段数量
#tcp_nopush on;
#提高I/O性能
tcp_nodelay on;
#连接超时 时间定义 默认秒 默认65秒
keepalive_timeout 60;
#读取客户端请求头数据的超时时间 默认秒 默认60秒
client_header_timeout 15;
#读取客户端请求主体的超时时间 默认秒 默认60秒
client_body_timeout 15;
#响应客户端的超时时间 默认秒 默认60秒
send_timeout 25;
#上传文件的大小限制 默认1m
client_max_body_size 8m;
# 和server同级,可以配置多个ip,通过别名配置负载均衡(默认轮询,weight是权重)
# down 是指让当前机器不参与负载均衡, backup没有机器可以用,才使用这台机器
# max_fails:允许请求失败次数,默认为1;fail_timeout:经历max_fails次失败后,暂停服务的时间。
# 不常用负载均衡策略:
# ip_hash(相同的ip指向相同的服务器,适用于无状态请求,站点易变的不适合用)
# least_conn(最小连接数)
# url_hash(根据用户访问的url进行定向转发,默认不支持)
# fair(根据后端服务器响应时间,默认不支持,需要配置脚本才能实现)
upstream my_name{
server ip:port weight=5 max_fails=1 fail_timeout=2;
server ip:port weight=1 backup/down;
}
## 配置临时缓存(在http模块中)
# 临时缓存会先保存在proxy_temp_path路径下,然后保存到proxy_cache_path
proxy_temp_path /root/nginx/***/**;
# 自定义临时缓存路径,levels:根据url的hash值,从字符串末尾取,第一层目录字符个数:第二层目录字符个数;keys_zone:指定缓存区名称和大小;inactive:主动清空在指定时间未被访问的缓存。
proxy_cache_path /***/** levels=1:3 keys_zone=cache_one:50m inactive=1m max_size=500m
# 限制虚拟主机的并发数
limit_conn_zone $server_name zone=preserver:10m; # 开辟一个共享空间保存ip,并设置大小
limit_conn preserver 10; # 限制连接数量(可用于http,server,location)
# 限制响应传输速率(可用于http,server,location,location中的if中)
limit_rate 100k; # 限制响应传输速率
limit_rate_after 10m; # 传输指定大小文件后,才进行限速
server{
listen 80;
server_name localhost;
limit_conn preserver 10; #
}
# 一个server代表一个虚拟主机
server {
# 监听端口号
listen 80;
# 主机名/域名,可以配置多个,可以完整匹配/正则匹配/通配符匹配
server_name localhost localhost1;
# 可以限定访问控制
deny/allow all/固定ip;
#charset koi8-r;
#access_log logs/host.access.log main;
# 域名/主机名后面拼接的资源路径
location / {
#1、临时缓存配置
proxy_cache cache_one; # 与自定义缓存名称一致
proxy_cache_key $host$uri; # 指定缓存key
proxy_cache_valid 200 1m; # 指定200状态码缓存时间1分钟
# 2、永久缓存配置
root cache; # 永久缓存保存路径,需要手动创建
proxy_store on; # 开启永久缓存
proxy_store_access user:rw group:rw all:r; # 设置目录用户权限
proxy_temp_path cache_tmp; # 设置永久缓存临时文件路径
proxy_pass http://www.baidu.com;
# 配置完proxy_pass,下面的root和index都不会生效
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# 设置浏览器静态资源缓存过期时间
location ~ \.(jpg|gif|png) {
root html;
expires 30d; # 设置浏览器静态资源缓存时间30天
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
= # 表示精准匹配;
~ # 使用正则表达式匹配,区分大小写;
~* # 使用正则表达式匹配,不区分大小写;
^~ # 不使用正则表达式匹配,以指定模式开头的匹配(遵循最大匹配原则);
@ # 不能被外部客户端访问,只能被nginx内部的配置指令访问。
注意:
a、使用正则匹配,只有前面的正则匹配不成功才匹配后面的正则;
b、普通 location(即不带前缀的)遵循最长匹配原则,和正则一起使用,当正则匹配成功,最长匹配不会生效;
c、location / {} 和 location =/ {}:前者遵循最大匹配,其他都匹配不到默认会走这个 location,后者是精确匹配,只能匹配 / 路径。
只要优先的 location 匹配成功,后面的不会再进行匹配。
精确匹配(=)> 不使用正则表达式匹配(^~) > 正则匹配不区分大小写(~*) > 正则匹配(~) > 普通最大前缀匹配
静态资源配置使用的 root 和 alias 两种方式配置。
1、root:会拼接locating后面的路径,资源路径后面不加/;
# 例如:如果请求/img/test.png,会将请求映射为:/var/www/image/img/test.png
location /img/{
root /var/www/image;
}
2、alias:不会拼接location后面的路径,资源路径后面加/;
# 例如:如果请求/img/test.png,会将请求映射为:/var/www/image/test.png
location /img/{
alias:/var/www/image/;
}
1)、proxy_pass 端口后面没有 / ,则会将 location 及其后缀的内容完全拼接到 proxy_pass 所配置的地址后。
2)、proxy_pass 端口后面有 /,则仅会将 location 的后缀拼接到 proxy_pass 所配置的地址后。
示例:请求地址为:http://192.168.1.1:80/test/aa/bb
location 配置的前缀 | proxy_pass 配置 | 拼接后结果 | 备注 |
---|---|---|---|
/test/aa | proxy_pass 后加 / | http://192.168.1.1:81/test/aa//bb | 拼接的后缀为:/bb |
/test/aa | proxy_pass 后不加 / | http://192.168.1.1:81/test/aa/bb | 拼接的后缀为全部:/test/aa/bb |
/test/aa/ | proxy_pass 后加 / | http://192.168.1.1:81/bb | 拼接的后缀为:bb |
/test/aa/ | proxy_pass 后添不加 / | http://192.168.1.1:81/test/aa/bb | 拼接的后缀为全部:/test/aa/bb |
如果请求地址为:http://192.168.1.123/test/aabb,location 为: /test/aa/,后缀是:bb,proxy_pass 端口后面要加 /。
总结:本文详细介绍了 nginx 详细的配置内容,并且说明了 location 的配置规则,静态资源和代理配置加不加 / 的示例展示,掌握到此,可以基本实现 nginx 的开发使用要求。
本人是一个从小白自学计算机技术,对运维、后端、各种中间件技术、大数据等有一定的学习心得,想获取自学总结资料(pdf版本)或者希望共同学习,关注微信公众号:上了年纪的小男孩。后台回复相应技术名称/技术点即可获得。(本人学习宗旨:学会了就要免费分享)