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的所有locations
        num = len(locations)
        if num == 0:
            continue
        elif num == 1:
            return locations[0]
        else:
            max_length = 0
            use_location = None
            for location in locations:
                length = get_match_uri_length(location, uri) #计算该location匹配上uri的最长匹配字符串的长度
                if length > max_length: #这里是大于,不是大于等于,所以如果有多个location的length相同,会采用第一个
                    use_location = location
            return use_location
    return 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重定向,这个是永久重定向,
 
七、upstream
nginx配置
upstream gunicorn_pool
{
    #server 地址:端口号 weight表示权值,权值越大,被分配的几率越大;max_fails表示在fail_timeout中失败的最大次数,如果达到该次数,就不再导流量到该server
    server 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了。
未经允许,请不要转载
Nginx 配置学习的更多相关文章
- nginx配置学习文章
		
partOne 自我释义部分 我的是阿里云的ubuntu *******实际上感觉这里是基本配置,很用不到*********#定义其用户或用户组user www-data;#nginx的进程数,应当为 ...
 - Laravel 5.5 官方推荐 Nginx 配置学习
		
Laravel 5.5 版本官方放出了 Nginx 服务器的配置,中文文档:服务器配置 Nginx server { listen 80; server_name example.com; root ...
 - nginx配置学习总结
		
1.nginx反向代理 在讲诉具体的配置之前,先说下正向代理与反向代理的区别. 正向代理:是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理 ...
 - nginx配置反向代理或跳转出现400问题处理记录
		
午休完上班后,同事说测试站点访问接口出现400 Bad Request Request Header Or Cookie Too Large提示,心想还好是测试服务器出现问题,影响不大,不过也赶紧上 ...
 - Windows下Nginx配置SSL实现Https访问(包含证书生成)
		
Vincent.李 Windows下Nginx配置SSL实现Https访问(包含证书生成) Windows下Nginx配置SSL实现Https访问(包含证书生成) 首先要说明为什么要实现https ...
 - Nginx配置详解
		
序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的.从2004年发布至今,凭借开源的力量,已经接近成熟与完善. Nginx功能丰富,可作为HTTP服务器,也 ...
 - Nginx 配置从零开始
		
作为一个 nginx 的初学者记录一下从零起步的点滴. 基本概念 Nginx 最常的用途是提供反向代理服务,那么什么反向代理呢?正向代理相信很多大陆同胞都在这片神奇的土地上用过了,原理大致如下图: 代 ...
 - 【nginx配置】nginx做非80端口转发
		
一个场景 最近在使用PHP重写一个使用JAVA写的项目,因为需要查看之前的项目,所以要在本地搭建一个Tomcat来跑JAVA的项目.搭建成功后,因为Tomcat监听的端口是8080,因此,访问的URL ...
 - Nginx 配置指令location 匹配符优先级和安全问题【转】
		
Nginx配置指令location匹配符优先级和安全问题 使用nginx 很久了,它的性能高,稳定性表现也很好,得到了很多人的认可.特别是它的配置,有点像写程序一样,每行命令结尾一个";&q ...
 
随机推荐
- Java动态代理-JDK自带实现
			
上篇文章讲解了什么是静态代理,但是静态代理有一个问题就是需要建立很多的代理类,这样我们需要修改代理的方法的时候,需要在每个类中都要修改,这对于我们来说:当代理类很多的时候工作量就会成倍的增加. 于是针 ...
 - python案例-判断素数
			
from math import sqrt def is_prime(num): for rea in range(2,int(sqrt(num)+1)): if num%rea==0: return ...
 - nuxt 中使用 koa-session
			
官方 github 网址:https://github.com/koajs/session 自己做的demo:https://github.com/cag2050/nuxt_session_demo ...
 - Spring Cloud 组件 —— gateway
			
Spring Cloud 网关主要有三大模块:route.predicates.filters 其中 filter 最为关键,是功能增强的核心组件. 列举出一些功能组件: 5.6 CircuitBre ...
 - scala简单的功能实现~weekone
			
以下是scala简单的入门题~ 1.⼀个数字如果为正数,则它的signum为1:如果是负数,怎么signum为-1:如果是0,则signum 为0.编写⼀个函数来计算这个值. object Test ...
 - iis7设置http跳转https实测可用
			
前面ytkah和大家聊了Apache设置http如何301到https,现在我们说说iis7设置http跳转https,因为还是有很多人在用iis服务器.首先要先安装url rewrite modul ...
 - 31 Game-Based Learning Resources for Educators
			
https://www.legendsoflearning.com/resource/31-game-based-learning-resources-for-educators/ Game base ...
 - hdu2068-RPG的错排-(dp递推式)
			
去年看错排公式,死都看不懂,基础扎实之后再来看就略懂了. 公式: dp[ n ] = ( n-1 ) * ( dp[n-1] + dp[n-2] ) 解析公式:比如有n个元素,各对应n个正确位置,dp ...
 - RabbitMQ简单介绍+Windows环境安装
			
文章目录 1.RabbitMQ简介2.RabbitMQ与其他MQ有什么不同3.RabbitMQ环境安装3.1 安装erlang3.2 安装rabbitmq-server4. RabbitMQ管理平台介 ...
 - Splay&LCT
			
Splay && LCT \(\text{Splay}\) 基本操作 1.\(Zig \& Zag\) 其思想是维护中序遍历不变 实现中我们不真的用\(Zig\)或\(Zag\ ...