Nginx 配置学习
官方文档
一、概述
Nginx的配置放在配置文件nginx.conf/etc/nginx/nginx.conf
中,大概的结构如下:
main # 全局配置events { # nginx工作模式配置}http { # http设置....server { # 服务器主机配置....location { # 路由配置....}location path {....}location otherpath {....}}server {....location {....}}upstream name { # 负载均衡配置....}
}
主要有
- main,全局配置
- event nginx工作模式
- http http服务器的配置
- server 服务器访问的配置
- location 路由配置
- upstream 负载均衡配置
二、main模块
全局配置并不需要包含在大括号中。
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
worker_rlimit_nofile 1024;
- nginx 用哪个用户来启动
- worker_processes 启动的进程数,一般是CPU数量的两倍
- error_log 错误日志,空格后面是日志的等级,有warn error notice等
- pid nginx pid的存放地址
- worker_rlimit_nofile 每个进程打开的文件描述符的数量
三、event 模块
event {worker_connections 1024;multi_accept on;use epoll;
}
- worker_connections 最大可接收的连接数
- muti_accept 配置指定nginx在收到一个新连接通知后尽可能多的接受更多的连接
- use 配置线程轮询方式
四、http模块
http {access_log /var/log/nginx/access.log;error_log /var/log/nginx/error.log;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';include /etc/nginx/conf.d/*.conf;
常用配置
- access_log access日志
- error_log 错误日志
- log_format 日志格式
- include 引入其他文件作为配置
其他配置
五、server模块
server模块放在http模块里面,一个server相当于一个虚拟的服务器。
server {listen 80;server_name localhost 192.168.1.100;root /nginx/www;index index.php index.html index.html;charset utf-8;access_log logs/access.log;error_log logs/error.log;......
}
- listen 监听的端口
- server_name 域名或者IP 空格分隔
- root 表示虚拟主机的根目录
- index 表示全局首页
- charset 网页中默认的编码方式
- access_log 访问记录日志
- error_log 错误日志
六、location模块
location模块放在server模块里面,表示一个路由规则。
location的语法规则
location [ 空格 | = | ~ | ~* |^~|!~ | !~* ] /uri/ {}
第一部分是location关键字
第二部分是修饰语(modifier)
第三部分是匹配的内容
第四部分是匹配成功后处理的方法
1.修饰语
请求目录是指客户端发过了的请求的uri,例如客户端访问http://www.aa.com/dir1/dir2,其中/dir1/dir2
就是请求目录
- = 精确匹配,也就是请求目录和匹配的内容完全一致,才会匹配上,不支持正则
- ^~开头字符串匹配,如果请求目录的开头和匹配内容一样,就会匹配上,不支持正则
- ~ 开头区分大小写正则匹配,如果请求目录的开头符合匹配内容(正则表达式),就会匹配上
- ~* 和
~
类似,区别是这个不区分大小写 - !~ 和
~
类似,区别是不符合正则,就会匹配上 - !~* 和
~*
类似,区别是不符合正则,就会匹配上 - 空格,跟
^~
类似,区别是优先级最低
上面的修饰符,除了精确匹配=
和正则的匹配之外,其他都是前缀匹配,也就是请求目录的前面匹配上,就算匹配上了,不管后面的。
为了安全起见,建议正在匹配尽量加上^
和$
2. 匹配优先级
当多个location都可以匹配请求目录,那么nginx会使用哪个location呢?
如果修饰语不同,那么修饰语的优先级是
=
大于^~
大于~
大于~*
大于空格
location = /dir1 {
return 601;
}
location ^~ /dir1 {
return 602;
}
location ~ /dir\d {
return 603;
}
location ~* /dir\d {
return 604;
}
location /dir1 {
return 605;
}
使用上面的配置,访问http://test.kevinlu.com:10000/dir1
,第一个location优先级最高,然后逐渐下降(可以通过注释location来测试)。
如果修饰语一样,会找最长匹配字符串
location / {
return 601;
}location /d {
return 602;
}
如果访问http://test.kevinlu.com:10000/d
,两个location都会匹配上,但是第二个location会匹配到请求目录的/d
,长度是2,而第一个只会匹配到/,长度是1
,前面的长度更长,所以使用第二个location。
注意这里的长度是请求目录的长度,不是匹配内容的长度。所以~ /\d
和~ /3
,长度是一样的,都是长度为1。
如果匹配字符串的长度一样,使用第一个location
location ~ /\d {return 601; } location ~ /3 {return 602; }
例如上面的配置,访问http://test.kevinlu.com:10000/3
,会返回601。
所以总结一下Nginx寻找location的逻辑
- 根据修饰符的优先级,从高到低,寻找匹配的location数量N
- 如果N==0,寻找下一个优先级的修饰符
- 如果N==1,使用该location
- 如果N>1,计算每个location匹配uri的最长的匹配字符串长度L,能达到L的location的数量N1,
- 如果N1==1,返回该location
- 如果N1>1,返回第一个location
- 如果所有location都不满足,返回404
伪代码:
MODIFIER_LIST = ['=', '^~', '.......'] #修饰符的优先级排序def get_location(uri):"""寻找最优的location"""for modifier in MODIFIER_LIST:locations = get_match_location(uri, modifier) #获取修饰符是modifier,匹配上uri的所有locationsnum = len(locations)if num == 0:continueelif num == 1:return locations[0]else:max_length = 0use_location = Nonefor location in locations:length = get_match_uri_length(location, uri) #计算该location匹配上uri的最长匹配字符串的长度if length > max_length: #这里是大于,不是大于等于,所以如果有多个location的length相同,会采用第一个use_location = locationreturn use_locationreturn 404
#alias /data/demo/demo2018/nginx_test/1;
#root html;
#index test.html;
3.常用的匹配配置
#精确匹配首页
location = / {proxy_pass http://tomcat:8080/index
}
#静态资源
location ~* \.(gif|jpg|jpeg|png|css|js|ico|html)$ {root /webroot/res/;
}
#返回某个目录下面的所有文件
location ^~ /static/ {root /webroot/static/;
}
4. 处理请求的指令
当Nginx找到最优的location来处理当前请求后,就会根据location的第四部分(大括号里面)的指令来处理请求,并返回response。
4.1 返回静态文件
root和alias指令都是用来返回系统本地的问题。两个指令的值都是本地文件目录,注意目录后面要加/,例如/data/www/
- root,会吧root的值和请求uri拼合在一起来寻找本地文件
- alias,会把alias的值和未匹配上的uri子串拼合在一起来寻找本地文件
例如配置:
location /static1/{root /data/nginx_test/;
}
location /static2/{alias /data/nginx_test/;
}
location ~ ^/static3/(.+\.html)${alias /data/nginx_test/$1;#return 601;
}
当访问http://test.kevinlu.com/static1/test.html
,会返回文件/data/nginx_test/static1/test.html
当访问http://test.kevinlu.com/static2/test.html
,会返回文件/data/nginx_test/test.html
当访问http://test.kevinlu.com/static3/test.html
,会返回文件/data/nginx_test/test.html
注意第二个是没有static2的。
使用alias的话,如果是正则的匹配方法,就需要使用正则的捕获功能,把括号里面的字符串赋值到变量$1中。
如果配置后,找不到文件,可以看看error_log,会报错105415 open() "/data/demo/demo2018/nginx_test/static1/2/test.html" failed (2: No such file or directory)
,就可以看nginx
4.2反向代理
普通代理
Nignx会把HTTP请求通过socket连接,转发给其他进程来处理location /static1/{
proxy_pass http://localhost:8080/;
proxy_set_header Host $host;
}
使用proxy_pass指令。
- proxy_pass 指定转发到的socket地址
- proxy_set_header 在http请求的基础上,增加header 第一个参数是头的key,第二个是头的value
- 其他proxy相关指令
.
FastCGI代理
location / {
fastcgi_pass localhost:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
}
- fastcgi_pass 和proxy_pass类似
- 其他fastcgi指令
4.3返回状态码
return指令用户之间返回response
第一个参数是http状态码,
第二个参数是body
可以直接重定向,也可以返回内容给前端。
location /test/{#return 301 http://www.baidu.com;return 200 <h1>aaa</h1>;}
4.4 重定向rewrite
语法:
rewrite regex replacement [flag];
该指令会把看是否uri匹配regex
,如果匹配,把replacement
替换regex
。
flag可以:
- last 向下匹配其他location
- break 终止匹配,不会再匹配下面的location
- redirect 返回302重定向,这个是临时重定向
- permanent 返回301重定向,这个是永久重定向,
官网介绍
301和302的区别
博客
七、upstream
nginx配置
upstream gunicorn_pool
{#server 地址:端口号 weight表示权值,权值越大,被分配的几率越大;max_fails表示在fail_timeout中失败的最大次数,如果达到该次数,就不再导流量到该serverserver 192.168.137.130:9098 weight=4 max_fails=2 fail_timeout=30s;server 192.168.137.133:9098 weight=4 max_fails=2 fail_timeout=30s;
}server {listen 80;server_name 127.0.0.1 www.test.com;access_log /data/logs/nginx_access.log;error_log /data/logs/nginx_error.log;location @gunicorn_proxy {proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Host $http_host;proxy_redirect off;proxy_pass http://gunicorn_pool;}
}
配置一个upstream,gunicorn_pool。里面有两个服务层(130和137)
如果两个服务层都正常,Nginx会把流量根据weight值,导流到两个服务器。
同一个请求中,如果nginx导流到server1,发现返回的是错误响应(例如502),nginx会把请求再发送server2,相当于重试。这时会记录server1的fail次数+1
如果再fail_timeout时间内,server1的fail次数超过max_fails,在fail_timeout时间内,nginx就不会再把其他请求导流到server1了。
未经允许,请不要转载
转载于:https://www.cnblogs.com/Xjng/p/11530906.html
Nginx 配置学习相关推荐
- 入门学习Nginx代理服务器?就看这篇Nginx进阶学习最佳配置实践指南
前置基础知识学习 1.Nginx基础安装与配置详细 https://blog.weiyigeek.top/2019/9-1-121.html 2.Nginx进阶学习之最佳配置实践指南 https:// ...
- Nginx基础学习笔记(正向/反向代理,Nginx均衡负载和配置)
目录 1. 正向代理和反向代理 1.1 正向代理 (1)什么是正向代理? (2)正向代理的特点 (3)正向代理的用途 1.2 反向代理 (1)什么是反向代理? (2)反向代理的特点 (3)反向代理的用 ...
- Nginx学习总结(14)——Nginx配置参数详细说明与整理
一.整体结构 nginx.conf配置文件整体上分为三部分:全局块.events块.http块. 二.具体参数说明 #user administrator administrators; #配置用户或 ...
- Nginx配置、原理学习
目录 Nginx基本概念 定义 反向代理 正向代理 定义 反向代理 定义 使用反向代理的优点 负载均衡 负载均衡算法怎么实现的 负载均衡策略 轮询 权重 ip_hash(IP绑定) fair(第三方插 ...
- nginx配置参数详解
PS:Nginx使用有两三年了,现在经常碰到有新用户问一些很基本的问题,我也没时间一一回答,今天下午花了点时间,结合自己的使用经验,把Nginx的主要配置参数说明分享一下,也参考了一些网络的内容,这篇 ...
- Nginx配置——搭建 Nginx 高可用集群(双机热备)
Nginx配置--搭建 Nginx 高可用集群(双机热备) https://blog.csdn.net/zxd1435513775/article/details/102508573?utm_medi ...
- Nginx配置中一个不起眼字符/的巨大作用,失之毫厘谬以千里
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://zhuanlan.zhihu. ...
- 关于Spring Boot WebSocket整合以及nginx配置详解
这篇文章主要给大家介绍了关于Spring Boot WebSocket整合以及nginx配置的相关资料,文中通过示例代码给大家介绍的非常详细,相信对大家的学习或者工作具有一定的参考学习价值,需要的朋友 ...
- Nginx 配置从零开始
作为一个 nginx 的初学者记录一下从零起步的点滴. 基本概念 Nginx 最常的用途是提供反向代理服务,那么什么反向代理呢?正向代理相信很多大陆同胞都在这片神奇的土地上用过了,原理大致如下图: 代 ...
最新文章
- ubuntu 14.04 LTS 右键菜单解压压缩包时出错
- Ubuntu nfs配置
- 如何在后台运行 Linux 命令
- 1044 拦截导弹——http://codevs.cn/problem/1044/
- SpringBoot 模版渲染
- C# + .net下使用serialPort做串口开发 1
- OCF 试图为物联网建立标准,但它面临着不小的挑战
- 韦氏评级:担心比特币近期价格走势的人都过于关注短期
- 这两个VHDL的问题终于解决了!
- 关于iframe的一点发现与思考
- 设计模式17_命令模式
- 永久更改打开matlab时工作目录
- 2ask信号调制与解调 matlab,2ASK2ASK调制与解调系统的MATLAB实现及性能分析
- Pure Pursuit轨迹跟踪matlab程序
- Qt5-将手机上B站下载的视频提取到到电脑上并批量移动到指定文件夹和重命名
- 网页制作中PS图像处理的应用
- Xunity.autotranslator机翻unity引擎的游戏
- 十年老程序员开始新事业
- 百万数据使用子查询进行SQL优化
- CloudFlare的Worker免费部署服务
热门文章
- 神威计算机主板型号,十代酷睿高端型Z490主板曝光 总线规格依旧是PCIe 3.0且USB接口并不支持USB 3.2...
- java web简单工厂模式_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
- gdb coredump oracle,GDB + CoreDump 调试记录
- 华为3500光端机基本介绍_华为OSN3500光端机License授权管理介绍
- matlab避免使用for_MATLAB新手学习技巧第二波来袭
- 气温常年在25度的地方_25度是什么气候
- 从零开始刷Leetcode——数组(31.33)
- 抽取CNN网络任意层的特征,VGG模型fine-tuning实践
- 现在做网络推广,哪种方式最好?
- 服务器传文件的工具,向服务器传文件的工具