Code Monkey home page Code Monkey logo

notes-nginx's People

Contributors

dengchengchao avatar

Watchers

 avatar  avatar

notes-nginx's Issues

Nginx 配置详解

Nginx的配置

前面说过Nginx的主要配置文件为conf/nginx.conf

默认配置如下:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
  
 
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
    
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }   
    }
}

上述配置意思后面再详细解读。

首先我们分析Nginx的配置文件的结构:

Nginx配置文件的通用结构为

xxx{           //
       ...     //全局配置
      xxx{     //xxx子模块配置

       }
}

其中,全局配置能够影响子模块配置

由此,我们可以从大模块->包含模块的顺序开始分析。

首先是最外层的配置,Nginx最外层分别又:

  • 全局块: 全局块配置在所有的大括号外,主要用于设置Nginx整体的一些运行配置命令

  • events块: events块主要涉及的到Nginx服务器与用户的网络连接,比如是否允许同时开启多个网络连接,每个worker process可以支持多少个连接数等等

    这一块主要影响Nginx服务器的性能

  • http块: http块主要配置http请求的各种配置,比如代理,缓存,日志等

    这三个块是Nginx配置的主要模块。而每个块中又可以包含子模块。这里主要介绍http块的子模块:

    • server块: server块的配置主要和"虚拟主机"的配置有关。一个server块,对应一个"虚拟主机"

      对于每个虚拟主机,也可以包含自己单独的配置,下面介绍其子模块

      • location块: location块的主要作用Nginx接收到请求后,对虚拟主机的请求再一次细分,有点类似ServletMapping的作用。。

        配置到location块之后,基本就没有其他的什么配置了。

整体来说,Nginx的主要配置的块划分如下所示:

xxx
xxx
http{
    server{
        location{
            
        }
    } 
}

详细配置

需要注意的是,Nginx每条配置都需要以;结尾

全局配置

  • 配置Nginx服务器用户组,只有被设置的用户(用户组)成员才可以启动Nginx

    user [user] [group]

    user nobody nobody; //默认为nobody

  • 配置允许生成的worker process数量

    worker_processes [number] | [auto]

    默认唯一

  • 配置PID文件路径

    pid [filePath]

    注意,filePath同时需要包含文件名

  • 配置错误日志路径以及级别

    error_log [filePath] | [stderr| info | notice | warn | error | crit | alert | emerg]

    此命令可以在http ,server ,location块中单独配置

  • 引入其他配置文件

    include [filePath]

    此配置可以放在任意块中

events

  • 设置网络连接序列化,避免”惊群“效应,使得每个work prcess按顺序接收请求

    accept_mutex [on | off]

    默认为on

  • 设置是否允许worker prcess同时接收多个网络连接

    multi_accept [on | off]

    默认为off

  • 设置事件驱动模型

    use [method]

    method可以选择为:select | poll | kqueue | epoll | rtsig | /dev/poll | eventport

  • 配置最大连接数

    worker_connections [number]

    默认为512

    注意最大连接数包括了所有可能的连接数,不仅仅是前端用户连接的数量

http , server ,location

以下命令可以选择在http, server, location中进行配置,主要都是http的一些参数

  • 配置MIME-Type

    一般默认情况下,Nginx默认定义了一个IME-Type文件,里面配置了默认的IME类型,我们只用将其包含进来即可:

    include mime.types

    此文件中定义了一个默认文件对应的MIME-Type,比如html文件对应text/html

    此外,还可以定义一个默认类型:

    default_type mime-type

    表示当一个都没有在types文件中匹配到的时候,则使用此MIME类型

  • 定义服务器日志

    access_log [filePath] [format]

    access_log记录的是前端访问Nginx的日志。filePath为日志保存的路径,需要精确到名称。format为日志格式,一般使用默认的即可。

    此配置可以定义http块,server块,或者location块中

    可以使用access_log off;指令关闭访问日志

  • 配置sendfile

    sendfile on | off

    sendfile_max_chunk [size]

    sendfile()有点类似0拷贝的文件传输,默认为off

    sendfile_max_chunk用于设置每个worker process每次调用sendfile()传输的数据最大的值,0表示无限制

  • 超时时间

    keepalive_timeout [time] [header_timeout]

    keepalive_timeout表前端用户连接后,保持连接的时间

    time :时间,默认为75s

    header_timeout : 可选项,在应答报文头部的Keep—Alive域设置超时间:keep-Alive:timeout=[timeout]

    示例:keepalive_timeout 120s 100s;

server

  • 配置单链接请求数上限

    keepalive_requests [numbers]

    表示用户成功建立会话之后,用户通过此连接发送请求的数量限制,默认为100,

    此配置还可以配置到location

  • 配置网络监听

    网络监听配置有3中方式

    • 使用IP地址: listen [address] [:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sendbuf=size] [deffered] [bind] [ssl]
    • 使用端口配置:listen [port] [default_server] [setfib=number] [rcvbuf=size] [sendbuf=size] [accept_filter=filter] [deffered] [bind] [ipv6only=on | off ] [ssl]

    下面对上面的参数进行一一解释:

    • address : ip地址,如果是IPv6地址,则需要使用[]括起来。
    • port : 端口号,如果只定义了IP地址,没有定义端口号,则使用80端口
    • path: socket 文件路径
    • default_server : 标识符,将此虚拟主机设置为address:port的默认主机
    • ssl : 设置连接使用SSL模式进行
    • backlog=num : 设置监听函数listen()最多允许num个网络连接处于挂起状态

    一般情况下,其他的标识符不怎么常用。下面列举一些listen的常用方法:

    listen *:80 | *:8000;             #监听所有80端口和8000端口
    listen 192.168.1.10:8000;        #监听指定ip和端口
    listen 192.16.1.10;               #监听指定ip下80端口的链接
    listen 8000;                      #监听8000端口下的所有连接
    listen 192.168.0.1 default_server #监听80端口,并设置为默认虚拟主机处理
  • 配置虚拟主机名

    server_name [name];

    name可以定义多个,以空格隔开,可以使用通配符,但是通配符只能在名称的首段或者尾段。

    如: server_name *.myserver.com www.myserver.*;

    同时,name还可以使用正则表达式,需要以~开头,表明需要使用正则表达式解析

    如:server_name ~^www\d+\.myserver\.com$;

    同时在使用正则表达式的时候,支持使用$1 $2获取捕获变量

    且,对于server_name匹配顺序如下:

    • 准确匹配server_name
    • 通配符在开头匹配server_name成功
    • 通配符在结尾匹配server_name成功
    • 正则表达式匹配server_name成功

    其次,再按照先后顺序进行匹配。

    server_name:也可以通过虚拟IP进行区分,这里不详细描述

  • 配置location

    location [ = | ~ | ~* | ^~ ] uri

    简单介绍下每个前缀的意思:

    例如:location /user/~[\d*]test

    其中,/user/这部分为不包含 正则表达的uri,后面的匹配字符为包含正则的uri

    Nginx会首先找到所有符合不包含正则表达式uri/user/,然后再通过正则进行匹配~[\d*]

    • = :用于标准uri前。要求请求字符串与uri严格匹配,如果匹配成功,则停止继续向下搜索
    • ~ : 用来表示uri包含正则表达式,并且区分大小写
    • ~* : 用于表示uri包含正则表达式,并且不区分大小写
    • ^~: 当uri查找标准uri的时候,成功匹配到该uri时,直接使用该location处理请求

​ 详见: 一文弄懂Nginx的location匹配

  • 配置请求的根目录

    root [path]

    值得注意的是,root是会拼接上url中的path的,例如

    location /data/
    {
        root /location;
    }

    则当请求是/data/index.html的时候,会在/location/data/目录下查找index.html

  • 配置修改location中的uri

    alias [path]

    alias功能和root差不多,不过root是拼接url,但是alias是替换掉路径。

    比如:

    location /data/
    {
        alias /location/test/;
    }

    则当请求是/data/index.html的时候,Nginx会到/location/test/目录下查找index.html文件,注意alias应该以/结尾,而root则没有关系。

  • 设置默认页面

    index [filePath]

  • 设置错误页面

    error_page code [=[response] uri

    • code 错误码
    • response : 替换的错误代码
    • uri : 返回的错误页面

    比如:

    error_page 404 /404.html

    error_page 410 =301 /empty.gif //将错误码修改为301

  • 设置用户白名单

    allow [address] | [CIDR] | all;

    address : 用户的ip地址

    CIDR :客户端的CIDR地址

    all : 表示允许所有用户访问

  • 设置黑名单

    deny [addiress] | [CIDR] | all;

    address : 用户的ip地址

    CIDR :客户端的CIDR地址

    all : 表示禁止所有用户访问


    当白名单和黑名单同时匹配的时候,Nginx会在检索到第一个匹配的名单后,立即停止检索。

    也就是以先配置的为准。

  • 配置Nginx访问密码()

    auth_basic [string | off ]

    string : 开启认证功能,配置验证时的提示信息

    off : 关闭认证功能


    auth_basic_user_file [filePath]

    filePath : 指定密码,比如:

    name1:password1
    name2:password2

到这里Nginx

Nginx代理服务

正向代理

  1. 指定DNS

    resolver [address] [valid=time]

    • address : DNS服务器地址,默认端口53

    • time :数据包有效时间

      在访问站点的时候,如果数据包不能再规定时间内到达目的地,则再time时间内,数据会被丢弃

    resolver 8.8.8.8

  2. DNS超时时间

    resolver_timeout [time]

    设置域名解析超时时间

  3. 设置代理服务器的协议和地址

    proxy_pass [URL]

例如:

server{
    resolver 8.8.8.8;
    listen 82;
    location /
        {
        proxy_pass http://$http_host$request_uri;
    }
}

反向代理

  1. 设置代理地址

    proxy_pass [URL]

    • url: 被代理服务器的协议以及地址,注意需要包含协议:比如http | https,同时可以指向服务器组

    更加值得注意的是,Nginx在处理URL中,是否包含路径的处理方式是完全不同的

    对于URL参数中包含路径的时候,Nginx会丢弃掉location中的路径而使用URL中的路径。

    对于URL参数中不包含路径的时候,Nginx才会保留location中的路径

    比如:

    location pages {
        proxy_pass 127.0.0.1/test
    }

    当用户请求xxx/pages/num1 的时候,会被代理为127.0.0.1/test/num1

    location pages{
        proxy_pass 127.0.0.1
    }

    当用户请求xxx/pages/num1 的时候,会被代理为127.0.0.1/pages/num1

    这就是为什么添加斜杠和不添加斜杠会有区别的原因。

  2. 设置隐藏头

    proxy_hide_header [field]

    用于设置在响应Http的时候,需要隐藏的头的内容

  3. 设置需要显示的头信息

    proxy_pass_header [field]

  4. 配置是否将客户端的请求体发送给代理服务器

    proxy_pass_request_body [ on | off ]

  5. 配置是否将客户端请求的头发送给代理服务器

    proxy_pass_request_headers [ on | off ]

  6. 更改请求头

    proxy_set_header [field] [value]

    默认为:

    proxy_set_header Host $proxy_host;

    proxy_set_header Connection close;

    此指令比较常用的为:

    proxy_set_header Host $http_host     #将host头设置为客户端地址
    proxy_set_header Host $host          #将当前location的server_name设置host
    proxy_set_header Host $host:$proxy_port #将server_name和listener指定设置为host
  7. 更改请求体

    proxy_set_body [value]

  8. 设置Nginx与代理服务器连接超时时间

    proxy_connect_timeout [time]

  9. 设置Nginx发送read请求后,等待的超时时间

    proxy_read_timeout [time]

  10. 设置Nginx发送write请求后,等待的超时时间

    proxy_write_timeout [time]

  11. 设置用于Nginx服务器提供代理服务器的Http版本

    proxy_http_version [ 1.0 | 1.1 ]

    默认1.0

  12. 设置Nginx请求代理服务器的时候的请求方法,当设置了此指令的时候,客户端请求的方法将被忽略

    proxy_method [method]

  13. 设置当客户端中断网络请求的时候,Nginx是否中断被代理服务器的请求

    proxy_ignore_client_abort [ on | off ]

    默认为off

  14. 设置接收到代理服务器返回的数据后,不处理的头

    proxy_ignore_headers [field]

  15. 设置重定向中的LocationRefresh

    proxy_redirect [redirect] [replacement];
    proxy_redirect default;
    proxy_redirect off;
    • redirect : 匹配Location头域的字符串,支持正则表达式
    • replacement :用于替换redirect返回的内容

    例如:

    proxy_redirect http://localhost:8081/proxy/  http://myweb/frontend/;
    • default : 使用location块的uri作为replacement,并使用proxy_pass作为redirect

    例如,default的效果等同于:

    location /server/
    {
        proxy_pass http://proxyserver/source/;
        proxy_redirect http://proxyserver/source/   /server/;
    }
    • off :关闭所有配置
  16. 配置使用Nginx的错误页面

    proxy_intercept_errors [on | off]

    当被代理服务器返回的HTTP状态码大于等于400的时候,是否使用Nginx自带的错误页。

  17. 配置存放HTTP报文头哈希表的容量

    proxy_headers_hash_max_size [size]

    Nginx使用Hash表存储HTTP头信息,用于快速检索HTTP头内容,默认512个字符

  18. 配置ssl加密

    proxy_ssl_session_reuse on | off

    配置后,Nginx将使用SSL安全协议连接被代理的服务器

反向代理缓冲区

就像BufferedReader一样,Nginx也可以配置一个缓存区,用来等待接收了所有数据后,再转发给前端。

相关指令如下:

以下指定都是每次Http请求的配置,没有总的Buffer和配置

  1. 设置proxy_buffering是否开启

    proxy_buffering on | off

​ 默认为开启状态

  1. 设置缓冲区大小

    proxy_buffers [number] [size]

    例如:

    proxy_buffers 8 4k默认为4k或8k

  2. 设置第一次获取响应数据大小

    proxy_buffer_size [size]

    一般第一次获取的数据为Http

    默认为4KB或者8KB

  3. 限制同时出去BUSY状态的proxy buffer总大小

    proxy_busy_buffers_size [size]

    默认为8KB或16KB

  4. 设置临时路径

    Buffer不够存放响应数据的时候,Nginx会将接下来的数据放在此路径中

    proxy_temp_path path [level1 [level2]]

    [level1] 表示存放的路径,比如 temp/1/2/3表示 temp 1 2 3 level3

  5. 设置临时文件总大小

    proxy_max_temp_file_size [size]

    默认为1024MB

  6. 配置同时写入(IO)临时文件的数据量总大小

    proxy_temp_file_write_size [size]

    用于防止IO负载过重,默认8KB或16KB

反向代理缓存

Nginx可以配置缓存,用来提高效率

Nginx缓存会检查被代理服务器响应的HTTP头中的Cache-Control,Expires,控制此条数据是否缓存

  1. 设置存放缓存索引的内存区域名称

    proxy_cache [zone] | [off]

    • zone : 区域名称。
  2. 缓存过滤

    proxy_cache_bypass [string]

    设置不进行缓存的条件

    • string条件变量,只有当所有条件变量都为空的时候,响应才从缓存中获取

    例如:

    proxy_cahche_bypass $cookie_nocache $arg_nocache $arg_comment $http_paragma

  3. 设置缓存Key

    proxy_cache_key [string]

    • string : key,默认为$scheme$proxy_host$url$is_asrs$args
  4. 是否开启缓存锁

    proxy_cache_lock on | off

    默认为关闭状态

  5. 设置锁超时时间

    proxy_cache_lock_timeout [time]

  6. 设置缓存条件次数

    proxy_cache_min_uses [numbers]

    当有当用户相同的请求到达某些次数后,才进行缓存

  7. 设置当被代理服务器状态异常的时候,直接返回缓存

    proxy_cache_use_stale | timeout | invalid_header |updating | http_500 | http_502 | http_404 | off

    当被代理服务器异常的时候,使用此指令可以让Nginx直接返回被缓存的数据。默认off

    updating表示被请求的数据在Nginx中正好处理更新状态

  8. 通过状态码设置缓存时间

    proxy_cache_valid [code ... ] [time]

    • code : 默认为200,301,302 可以使用any表示任何

    比如:

    proxy_cache_valid 200 302 10m;
    proxy_cache_valid 301 1h;
  9. 设置不使用缓存的条件

    proxy_no_cache [string]

    string条件变量,只有当所有条件变量都为空的时候,才使用缓存功能

  10. 设置磁盘缓存

    proxy_store on | off | string

    • string : 自定义存放路径

    此指令用来配置是否在本地磁盘缓存来自代理服务器的数据,它不占用内存空间,也不提供缓存过期更新功能,对于静态数据效果较好

  11. 设置用户或用户组对缓存的访问权限

    proxy_store_access users:permissions

    当开启了缓存到本地磁盘后,用户是否此此数据有访问权限。

    比如:

    {
        proxy_store on;
        proxy_store_access user:rw group:rw all:r;
    }

Nginx命令

Nginx的目录

Linux版本的Nginx中。

主要包含以下4个目录:

  • conf : nginx的配置文件,其中nginx.confnginx服务器的主要配置文件、
  • html : 存在Nginx服务器在运行过程中调用的一些html网页文件。比如500 error,以及默认首页等
  • logs: nginx的日志目录
  • sbinnginx服务器的主程序

Nginx的信号

nginx的运行机制为一个主进程以及多个worker process,我们可以通过像主进程发送信息来管控整个服务。

比如在一个启动了Nginx的服务器运行ps -ef | grep nginx,可以看到如下结果:

root     27141     1  0 16:00 ?        00:00:00 nginx: master process ./nginx
nobody   27142 27141  0 16:00 ?        00:00:00 nginx: worker process
root     27222 17292  0 16:07 pts/0    00:00:00 grep --color=auto nginx

可以看到27141为主进程,27142为worker process

我们可以通过向主进程发送信号以控制Nginx

比如:

kill QUIT 27141 //停止nginx

nginx主进程的PID还可以通过nginx启动的时候写入到logs/nginx.pid文件中的进程号获取

除了可以通过kill命令发送信号,还可以通过nginx客户端发送信号


Nginx可以接受的信号如下:

信号 作用
TERM 或 INT 快速停止Nginx服务
QUIT 平缓停止Nginx服务
HUP 使用新的配置文件启动进程,之后平缓停止原有进程(“平滑重启”)
USR1 重新打开日志文件
USR2 使用新版Nginx启动服务,之后平缓停止原有进程(“平滑升级”)
WINCH 平缓停止worker process ,用于Nginx平滑升级

Nginx也会有内置命令自己读取/log/nginx.pid文件,并发送信号,对应如下:

  • reload : HUP
  • reopen : USR1
  • stop : TERM
  • quit : QUIT

建议使用上面的方式,原理都是一样的,不过更加简单


Nginx 命令

输入nginx -h,可以看到官方说明如下:

  • -v : 查看版本
  • -V :查看版本以及配置
  • -t : 测试配置是否有效
  • -q : 测试配置时只提示错误信息
  • -s : 给主进程发送信息,stop quit reopen reload
  • -p : 指定nginx 服务器路径前缀
  • -c : 指定配置文件路径
  • -g : 指定nginx附加配置文件路径

停止

Nginx停止有两种方式,分别是平滑停止和立即停止。

  • 平滑停止指的是首先处理完当前正在处理器请求,并且停止接收请求,然后再停止服务器。

    对应nginx -s quit

  • 立即停止指的是立即丢弃当前所有连接,停止工作。

    对应nginx -s stop

重启

对用Nginx的重启,也包含两种方式,第一种是关闭Nginx,然后再打开,这样整个程序都会重启加载,第二种是平滑重启。

  • 暴力重启

    nginx -s stop

    nginx -s start

  • 平滑重启

    Nginx的平滑重启原理如下,首先Nginx接收到信号后,会读取新的Nginx服务,然后平缓(QUIT)的关闭旧的服务进程,如果新的配置有问题,则仍然使用旧的Nginx服务

升级

Nginx升级也有暴力升级和平滑升级两种方式,第一种方式和重启差不多,下面详细说第二种方式。

Nginx没有内置的升级命令,所有只能使用kill或则nginx二进制文件发送信号。

升级过程如下:

  • 首先,Nginx接收到USER2信号后,会将旧的nginx.pid文件添加后缀.oldbin
  • 然后,Nginx会执行新版本的Nginx服务器的二进制文件启动服务,如果新的服务启动成功,则系统中会存在两个Nginx服务,
  • 然后,需要向旧的Nginx服务进程发送WINCH信号,使得就得nginx服务平滑停止

过程如下:

首先将升级的二进制文件替换掉旧的二进制文件,然后执行以下命令

  • ./nginx -g USR2 //发送平滑升级信号,此信号会使得Nginx自动启动新的进程,并修改pid文件

    此命令执行完毕后,系统中会有两个Nginx进程同时服务

  • ./nginx -g WINCH //发送平滑停止旧服务器信号,

    此命令用于停止旧的Nginx进程的worker process,但是master process还存在

  • ./nginx -g QUIT //使得旧的服务退出

    执行到这里后,整个旧的Nginx便退出服务

Nginx 参数调优

Nginx / Linux 下性能调优

修改Linux系统参数

vi /etc/sysctl.conf

  1. net.core.netdev_max_backlog

    表示网络结果接收包的速率比内核处理速率快的时候,允许发送到队列数据包的最大数目,一般默认为128.

    net.core.netdev_max_backlog=262144

  2. net.core.somaxconn

    用于调节系统同时发起的TCP连接数,一般默认128,值过小可能引起连接超时或则重传问题

    net.core.somaxconn=262144

  3. net.ipv4.tcp_max_orphans

    用于防止Dos的参数,系统内存充足的时候,可以增大这个参数

    net.ipv4.tcp_max_orphans=262144

  4. net.ipv4.tcp_max_syn_backlog

    记录尚未收到客户端确认信息的链接请求的最大值。

    net.ipv4.tcp_max_syn_backlog=262144

  5. net.ipv4.tcp_timestamps

    时间戳可以避免序列号的卷绕。一个1Gbps 的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。

    net.ipv4.tcp_timestamps=0

  6. net.ipv4.tcp_synack_retries

    为了打开对端的连接,内核需要发送一个SYN 并附带一个回应前面一个SYN 的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK 包的数量

    net.ipv4.tcp_synack_retries=1

  7. net.ipv4.tcp_syn_retries

    同上

    net.ipv4.tcp_syn_retries = 1

Nginx配置

  1. worker_processes

    设置Nginx服务进程数,一般为CPU的整数倍。

    worker_prcesses 4;

  2. worker_cpu_affinity

    为每个进程分配CPU,建议将每个进程分配到不同的CPU

    worker_cpu_affinity 0001 0010 0100 1000

  3. keepalive_timeout

    设置Nginx服务器与客户端保持连接的超时时间

    keepalive_timeout 60 50;

  4. send_timeout

    设置Nginx等待客户端响应超时时间,当成功连接后,如果超过这个时间客户端没有再次发送请求,则断开连接

    send_timeout 10s

  5. client_header_buffer_size

    客户端请求头缓冲区大小,默认1KB,超过此大小可能会莫名其妙报400错误,

    client_header_buffer_size 4k;

  6. multi_accept

    配置Nginx服务器是否尽可能多的接收客户端的网络连接请求,默认为off

    multi_accept on

  7. use

    配置使用的事件驱动模型

    use epoll

  8. worker_connections

    设置Nginx每个工作进程允许同时连接客户端最大数量

    worker_connections 65535

Nginx Rewrite

Nginx 服务器组

  1. 配置服务器组

    upstream [name]{
        server address [paramters];
        server address [paramters];
        server address [paramters];
    }
    • name :服务器的名字

    • address : 服务器的地址,可以是ip或则是域名

    • paramters : 服务器的其他配置,主要包含以下

      • weight = number 设置权重,权重越高的服务器会被有限调用
      • max_fails = number 失败次数,当在fail_timeout时间内请求失败超过这个次数时,任务服务器down,默认为1
      • fail_timeout = time : 指定失败清理时间以及此事件内,不再检查此服务是否恢复。默认10s
      • backup : 备用服务器,只有当正常服务器无效的时候,才会启动此服务器
      • down :永久无效服务器,通常与ip_hash配合使用

      例如:

      upstream test{
          server test.example.com weight=5;
          server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
          server 192.168.0.1 backup
      }
  2. 保持会话

    默认情况下,Nginx会把请求轮流发送给服务器组中的服务进行处理,但是某些时候需要有会话机制。此时可以通过ip_hash设置。

    ip_hash;

    ip_hash不能与server指令中的weight一起使用。配置如下

    upstream test{
        ip_hash;
        server test.com;
        server test2.com;
    }
  3. 连接池

    Nginx作为反向代理的时候,大多数情况都是Nginx和后端服务器连接,此时当3次握手后,可以暂时保持连接,而不断开,这样可以更大的提升性能。

    keepalive [connections]

    connectionsNginx服务器每个工作进程允许该服务器保持的空闲网络连接的上限。当超过该连接,则使用LRU算法关闭连接

  4. 最少连接配置

    least_conn

    可以配置Nginx使用least_conn算法分配连接,当连接到来的时候,Nginx将选择目前连接最少的服务器,当同时又多个连接最少的服务器时,再使用加权轮加,选择权重最高的服务器。

Nginx Rewrite

rewrite有点像Servlet的重定向,但是不是301那种让浏览器重定向,而是让服务器自己重定向。

if指令

if ( condition ){ ... }

例如:

if($request_method = POST){
    return 405;
}

注意这里的字符串不用加引号

同时,condition可以使用正则表达式进行匹配。

  • ~ 表示对大小写敏感
  • ~* 表示对大小写不敏感
  • !~ / ~* : 取反
  • () :捕获变量,使用$1 , $2获取值

例如:

if($http_user_agent ~ MSIE){
    # $http_user_agent 的值是否含有MSIE字符串
}

一般正则表达式不用添加引号,但是如果表达式里面包含右花括号或则分号的时候,需要添加引号

if(-f $request_filename){
    #如果文件存在,则。。
}
  • -f :判断文件是否存在
  • -d :判断文档是否存在
  • -e :判断请求的文档或目录
  • -x :判断请求的文件是否可执行

break 指令

直接返回,不再执行后面的指令

return 指令

完成对请求的处理。

return { text }
return [code] [URL];
return [URL];

rewrite指令

通过正则表达式来修改URL

rewrite [regex] [replacement] [flag];

注意rewrite接收不到HOST地址,只能修改路径

比如: dengchengchao.com/test/123 , rewrite只能接收到/test/123

同时rewrite也接收不到参数,

比如: dengchengchao.com/test?name=dcc. 获取不到name=dcc

  • replacement : 匹配成功后用于替换URI中被截取的字符号
  • flag : 用来设置rewriteURI处理的行为
    • last : 匹配成功后终止URI在本块的处理,交由给location重新匹配
    • break : 匹配成功后继续交给本块中的其他重写URI处理
    • redirect : 将重写后的URI返回给客户端,状态为302,指明为临时重定向
    • permanent : 将重写后的URI返回给客户端,状态为301,指明为永久重定向

rewrite_log

rewrite_log on | off 是否开启重定向日志输出

默认off

set

set variable value

设置新的变量名

Nginx Gzip 功能

Nginx Gzip 压缩

  1. 开启 gzip压缩

    gzip on | off;

  2. 设置gzip缓存空间大小

    gzip_buffers [number] [size]

    • number : 指定Nginx服务器需要向系统申请缓存空间的个数
    • size : 每个缓存空间的大小

    默认为number*size=128gzip_buffers 32 4k

  3. 设置gzip压缩程度

    gzip_comp_level [level]

    级别为1到9,1压缩程度最低,效率最高,9表示压缩程度最高,效率最低。默认为1

  4. 设置gzip过滤名单

    gzip_disable [regex]

    某些情况下,有些浏览器不支持gizp压缩,因此可以通过User-Agent正则表达式过滤

    例如: gzip_disable "MSIE [1-6]\." 表示IE6及以下不启动压缩

  5. 设置gzip最低支持的Http协议版本

    gzip_http_version 1.1

    表示Http1.1及以上版本的时候,才使用Gzip压缩,默认为1.1

  6. 设置gzip最小长度

    gzip_min_length [length]

    只有当长度超过此长度,才启用压缩,长度过小的话压缩效果不明显,默认为20

    gzip_min_length 1024

  7. 设置需要压缩的MIME类型

    gzip_types mime-type ...

    某些时候,对于图片,视频,以及超大文件,不建议gzip压缩。因为效果不大,并且消耗CPU

    gzip_types text/plain application/x-javascript text/css text/html application/xml

  8. 设置添加gzip

    gzip_vary on | off

    开启此指令的时候,会在响应数据添加一个头部:Vary:Accept-Encoding

  9. 启用静态压缩

    gzip_static [ on | off | always ]

    • on :开启模块功能
    • off : 关闭模块功能
    • always : 一直发送gzip文件,不检查客户端是否支持压缩

    静态压缩用于发送压缩文件,比如.gz文件。

    同时,静态压缩也支持:gzip_http_version , gzip_disable,gzip_vary

  10. 解压缩指令

    gunzip_static on | off

    此功能主要用于如果客户端不支持Gzip处理,那么Nginx服务器将返回解压后的数据,这样Nginx作为中间层的时候,Nginx和后端的传输可以使用压缩,然后Nginx再进行解压

    同时,gunzip也支持:gunzip_http_version , gunzip_disable,gunzip_vary


以上,基本是所有示例,接下来附带配置示例:

http{
    gzip on;                     #开启gzip
    gzip_min_length 1024;        #gzip最小长度
    gzip_buffers 4 16k;          #缓存区配置
    gzip_comp_level 2;           #压缩级别
    gzip_types text/plain application/x-javascript text/css application/xml;                 #压缩资源类型
    gzip_vary    on;             #启用压缩标志
    gunzip_static on;            #检查预压缩文件
    
}

Centos 7 Nginx 安装教程

依赖

首先明白Nginx的依赖:

  • PCRE pcre-devel :NginxHttp模块使用的pcre模式解析的正则表达式,所以需要在Linux上安装pcre库,pcre-devel是使用pcre二次封装的一个库,Nginx也依赖于它

    yum install -y pcre pcre-devel

  • zilb : Nginx使用zlibhttp包的内容进行gzip压缩。

    yum install -y zlib zlib-devel

  • OpenSSL : Nginx使用OpenSSL支持Https协议

    yum install -y openssl openssl-devel


下载二进制文件

安装好以上依赖之后,上官网下载最新的二进制包,虽然一般yum源也有Nginx,但是这个源可能很久没有更新了,因此最好直接去官方下载最新的二进制包,编译安装。

https://nginx.org/en/download.html

同时,也可以使用命令进行安装下载

wget -c https://nginx.org/download/nginx-1.10.1.tar.gz

解压

下载了二进制包之后,接下来就是解压:

tar -zxvf nginx-1.4.2.tar.gz

配置

接下来是配置Nginx,默认情况下我们使用默认配置即可

./configure

编译安装

一切准备就绪后,就可以进行编译安装了

make

make install

make 为编译 make install 为安装

安装完成后,一般默认安装位置为/usr/local/nginx


到这里Nginx基本安装完毕。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.