nginx配置

nginx从入门到精通


目录



nginx配置文件结构

nginx文件结构

...              #全局块

events {         #events块
   ...
}

http      #http块
{
    ...   #http全局块
    server        #server块
    { 
        ...       #server全局块
        location [PATTERN]   #location块
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局块
}

说明:

  1. 全局块: 配置影响nginx全局的指令. 一般有运行nginx服务器的用户组, nginx进程pid存放路径, 日志存放路径, 配置文件引入, 允许生成worker process数等.
  2. events块: 配置影响nginx服务器或与用户的网络连接. 有每个进程的最大连接数, 选取哪种事件驱动模型处理连接请求, 是否允许同时接受多个网路连接, 开启多个网络连接序列化等
  3. http块: 可以嵌套多个server, 配置代理, 缓存, 日志定义等绝大多数功能和第三方模块的配置. 如文件引入, mime-type定义, 日志自定义, 是否使用sendfile传输文件, 连接超时时间, 单连接请求数等.
  4. server块: 配置虚拟主机的相关参数, 一个http中可以有多个server.
  5. location块: 配置请求的路由, 以及各种页面的处理情况.

配置文件详解

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

#worker_processes 2;  #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
error_log log/error.log debug;  #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg


#user administrator administrators;  #配置用户或者组,默认为nobody nobody。
#worker_processes auto;
#worker_processes 2;  #允许生成的进程数,默认为1
error_log log/error.log debug;  #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址


# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大连接数,默认为512
}

#rtmp server
#rtmp {
#    server{
#        listen 1935;       #服务端口
#        chunk_size 4000;   #传输块的大小
#
#        #流应用
#        application live
#        {
#            live on;
#            record off;  #关闭录制
#            allow play all; #允许任何人发起请求
#        }
#    }
#}

http {
    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  /var/log/nginx/access.log  main;   # 日志的格式, 指定为上面自定义的main
    sendfile            on;        #开启高效文件传输模式, sendfile指令指定nginx是否调用sendfile函数
                                #来输出文件, 对于普通应用设为on, 如果用来进行下载等应用磁盘IO重负
                                #载应用, 可设置为off, 以平衡磁盘与网络I/O处理速度, 降低系统的负载,
                                #注意: 如果图片显示不正常, 把这个改为off
    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。

    #tcp_nopush          on;    #防止网络阻塞 
    #tcp_nodelay         on;    #防止网络阻塞
    keepalive_timeout   65;        #长连接超时时间, 单位秒
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;    #默认文件类型 默认为text/plain

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #热备
    }
    server {
       listen       443 ssl http2 default_server;
       listen       [::]:443 ssl http2 default_server;

       ssl_certificate "/etc/nginx/cert/cert.pem";
       ssl_certificate_key "/etc/nginx/cert/cert.key";
       ssl_session_cache shared:SSL:1m;
       ssl_session_timeout  5m;
       ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
       ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
       ssl_prefer_server_ciphers on;

        #listen       80 default_server;
        #listen       [::]:80 default_server;
        listen       80;
        listen       [::]:80;
        root         /usr/share/nginx/html;

        keepalive_requests 120; #单连接请求上限次数。

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            root    /usr/share/nginx/html; # 根目录
            index   index.html index.htm;   # 默认页
            # proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #允许的ip    
        }

        error_page 404 /404.html;
            location = /40x.html {
            root    /usr/share/nginx/html;
            index    40x.html;
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
            root    /usr/share/nginx/html;
        }
    }

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2 default_server;
#        listen       [::]:443 ssl http2 default_server;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers HIGH:!aNULL:!MD5;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        location / {
#        }
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

}

上面是nginx的基本配置,需要注意的有以下几点:

    • $remote_addr 与 $http_x_forwarded_for 用以记录客户端的ip地址
    • $remote_user 用来记录客户端用户名称
    • $time_local 用来记录访问时间与时区
    • $request 用来记录请求的url与http协议
    • $status 用来记录请求状态. 成功是200
    • $body_bytes_s ent 记录发送给客户端文件主体内容大小
    • $http_referer 用来记录从那个页面链接访问过来的
    • $http_user_agent 记录客户端浏览器的相关信息
  1. 惊群现象: 一个网路连接到来, 多个睡眠的进程被同事叫醒, 但只有一个进程能获得链接, 这样会影响系统性能
  2. 每个指令必须有分号结束

负载均衡配置

upstream

upstream这个配置是写一组被代理的服务器地址, 然后配置负载均衡的算法. 这里的被代理服务器地址有2中写法

upstream mysvr { 
      server 192.168.10.121:3333;
      server 192.168.10.122:3333;
    }
 server {
        ....
        location  ~*^.+$ {         
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表         
        } 

upstream mysvr { 
      server  http://192.168.10.121:3333;
      server  http://192.168.10.122:3333;
    }
 server {
        ....
        location  ~*^.+$ {         
           proxy_pass  mysvr;  #请求转向mysvr 定义的服务器列表         
        } 

upstream配置算法

热备

如果你有2台服务器, 当一台服务器发生事故时, 才启用第二台服务器给提供服务. 服务器处理请求的顺序: AAAAAA突然A挂啦, BBBBBBBBBBBBBB…..

upstream mysvr { 
      server 127.0.0.1:7878; 
      server 192.168.10.121:3333 backup;  #热备     
    }

轮询

nginx默认就是轮询其权重都默认为1, 服务器处理请求的顺序: ABABABABAB….

upstream mysvr { 
      server 127.0.0.1:7878;
      server 192.168.10.121:3333;       
    }

加权轮询

跟据配置的权重的大小而分发给不同服务器不同数量的请求. 如果不设置, 则默认为1. 下面服务器的请求顺序为: ABBABBABBABBABB….

 upstream mysvr { 
      server 127.0.0.1:7878 weight=1;
      server 192.168.10.121:3333 weight=2;
}
4、ip_hash:nginx会让相同的客户端ip请求相同的服务器。
upstream mysvr { 
      server 127.0.0.1:7878; 
      server 192.168.10.121:3333;
      ip_hash;
    }

关于nginx负载均衡配置的几个状态参数讲解

down            // 表示当前的server暂时不参与负载均衡。
backup          // 预留的备份机器. 当其他所有的非backup机器出现故障或者忙的时候, 才会请求backup机器, 因此这台机器的压力最轻
max_fails       // 允许请求失败的次数, 默认为1. 当超过最大次数时, 返回proxy_next_upstream 模块定义的错误
fail_timeout    // 在经历了max_fails次失败后, 暂停服务的时间. max_fails可以和fail_timeout一起使用

// 示例
upstream mysvr { 
      server 127.0.0.1:7878 weight=2 max_fails=2 fail_timeout=2;
      server 192.168.10.121:3333 weight=1 max_fails=2 fail_timeout=1;    
    }

nginx配置规则初步了解

location / {
root    html;                    //网页发布目录(nginx的主目录的相对路径, 也可以使用绝对路径)
index index.html index.htm;        //网页发布的默认文件
}

nginx 工作原理:
nginx由nginx内核和模块组成, 其中内核的设计非常微小和简洁, 完成的工作也非常简单, 仅仅通过查找配置文件将客户端的请求映射到一个location block, 而location是nginx配置中的一个指令, 用于访问url匹配, 而这个location中所配置的每个指令将会启动不同的模块去完成相应的工作.
统一资源定位器(url): http://60.191.222.70, url可以用来标识一个资源, 而且访问或者获取改资源.

默认nginx.conf配置文件中至少存在一个location / 即表示客户端浏览器请求的url为: 域名 + /

nginx location规则演示案例

location = / {
        [ configuration L1 ]
location = / = https://60.191.222.70/
}

正则匹配例子

location ~* \.(html|txt|gif|jpg|jpeg)$ {
.......
.......
}

等号精确匹配, 优先级更高

location = / {
echo 'dingfang1';
}
location /  {
echo 'dingfang2';
}

正则匹配优先级低

location ~* \.(....|...|...|..|..)$ {
echo  '....';
}

location 匹配的URL方式如下

=                    // 字面精确匹配
^~                    // 最大前缀匹配
/                    // 不带任何前缀匹配根
~                    // 大小写相关的正则匹配
~*                    // 大小写无关的正则匹配
!~                    // 区分大小写的非正则匹配
!~*                    // 不区分大小写的非正则匹配

nginx进程管理

nginx常用命令

cmd

nginx -s stop           // 快速关闭
kill -TERM 主进程号     // 快速关闭
kill -INT 主进程号      // 快速关闭

nginx -s reload         // 重新加载配置文件
kill -HUP 主进程号      // 重新加载配置文件

nginx -t                // 测试配置文件, 检查配置文件语法是否正确, 然后试图打开文件涉及的配置

nginx -v                // 查看nginx版本信息
nginx -V                // 查看nginx版本信息, 编译版本, 和配置参数


nginx -s reopen         // 重启日志文件,备份日志文件时常用
kill -USR1 主进程号     // 重启日志文件,备份日志文件时常用

nginx的平滑升级

nginx平滑升级

如果你需要升级或者添加, 删除服务器模块时, 可以通过nginx的平滑升级, 在不停止服务的情况下升级nginx

  1. 用新的nginx可执行程序替换旧的可执行程序, 即下载新的nginx, 重新编译到旧版本的安装路径中(重新编译之前可以备份旧的可执行文件)
  2. 给nginx主进程号发送USR2信号
kill -USR2 旧主进程号

给nginx发送USR2信号后, nginx会将logs/nginx.pid文件重命名为nginx.pid.oldbin, 然后用新的可执行文件启动一个新的nginx主进程和对应的工作进程, 并新建一个新的nginx.pid保存新的主进程号
这时, nginx的新的实例和旧的实例同时工作, 共同处理请求连接. 接下来要关闭旧的实例进程.

  1. 给旧的主进程发送WINCH信号
kill -WINCH 旧主进程号  

旧的主进程号收到WINCH信号后, 将旧进程号管理的旧的工作进程优雅的关闭. 即一段时间后旧的工作进程全部关闭, 只有新的工作进程在处理请求连接. 这时, 依然可以恢复到旧的进程服务, 因为旧的进程的监听socket还未停止.
4. 给旧的主进程发送QUIT信号, 使其关闭

kill -QUIT 旧主进程号

给旧的主进程发送QUIT信号后, 旧的主进程退出, 并移除logs/nginx.pid.oldbin文件, nginx的升级完成

中途停止升级, 回滚到旧的nginx

在上面的步骤(3)时, 如果想回到旧的nginx不再升级 可执行如下操作

  1. 给旧的主进程号发送HUP命令

    此时nginx不重新读取配置文件的情况下重新启动旧主进程的工作进程.

kill -HUP 旧主进程号  
  1. 优雅的关闭新的主进程
kill -QUIT 新主进程号  

注: 如果由于某种原因, 无法关闭新主进程的工作进程, 直接给进程号发送KILL信号

// nginx的进程分为主进程和工作进程,关于nginx的信号,主进程支持以下信号  
TERM, INT       // 快速关闭
QUIT            // 优雅的关闭
KILL            // 关闭一个顽固进程
HUP             // 改变配置, 使用新配置开启新的工作进程, 优雅的关闭旧的进程
USR1            // 重新开启日志文件
USR2            // 平滑升级nginx
WINCH           // 优雅的关闭工作进程

// 单个工作进程也可以通过信号控制, 但它不是必须的. 单个工作进程支持的信号有
TERM, INT       // 快速关闭
QUIT            // 优雅的关闭
USR1            // 重新开启日志文件
WINCH           // 异常终止调试(需要启动debug_points)

反向代理

通用配置

# location /xxx {
location / {
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    client_max_body_size 20m;
    proxy_pass http://localhost:4000;
}

下面介绍的几种情况配置, 实际使用时需要添加上通用配置项中未包含的内容

直接以根目录代理

location / {
    proxy_pass http://localhost:4000;
}

效果

请求nginx uri: http://uri:post/test_api/xxx/xx
nginx替换后uri: http://uri:post/test_api/xxx/xx

二级路径代理

带有子路径代理有三种情况

情况一

配置

location /test_api {
    proxy_pass http://localhost:4000;
}

# 或

location /test_api/ {
    proxy_pass http://localhost:4000;
}

效果
请求nginx uri: http://uri:post/test_api/xxx/xx
nginx替换后uri: http://uri:post/test_api/xxx/xx

情况二

配置

location /test_api {
    proxy_pass http://localhost:4000/;
}

效果

请求nginx uri: http://uri:post/test_api/xxx/xx
nginx替换后uri: http://uri:post//xxx/xx

注意这里nginx替换后, 如果请求带有多级路径的话, 端口后会包含两个斜杠(/)

情况三

配置

location /test_api/ {
    proxy_pass http://localhost:4000/;
}

效果

请求nginx uri: http://uri:post/test_api/xxx/xx
nginx替换后uri: http://uri:post/xxx/xx

与情况二的区别就是不会包含两个斜杠(/)

配置示例

default

ssl.conf

#################################################
#ssl#
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;

    # ssl_certificate "/etc/nginx/cert/4733544_www.changdingfang.com.pem";
    # ssl_certificate_key "/etc/nginx/cert/4733544_www.changdingfang.com.key";
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
##
#################################################

rtmp

#rtmp server
#rtmp {
#    server{
#        listen 1935;       #服务端口
#        chunk_size 4000;   #传输块的大小
#
#        #流应用
#        application live
#        {
#            live on;
#            record off;  #关闭录制
#            allow play all; #允许任何人发起请求
#        }
#    }
#}

error

error_page 404 /404.html;
location = /40x.html {
    root    /usr/share/nginx/html;
    index    40x.html;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
    root    /usr/share/nginx/html;
}

conf.d

nginx.conf

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

#user nginx;
#worker_processes auto;
#worker_processes 2;
worker_processes 1;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;


# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
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  /var/log/nginx/access.log  main;

sendfile            on;        #开启高效文件传输模式, sendfile指令指定nginx是否调用sendfile函数
#来输出文件, 对于普通应用设为on, 如果用来进行下载等应用磁盘IO重负
#载应用, 可设置为off, 以平衡磁盘与网络I/O处理速度, 降低系统的负载,
#注意: 如果图片显示不正常, 把这个改为off
#tcp_nopush          on;    #防止网络阻塞 
#tcp_nodelay         on;    #防止网络阻塞
keepalive_timeout   65;        #长连接超时时间, 单位秒
types_hash_max_size 2048;

include             /etc/nginx/mime.types;
default_type        application/octet-stream;    #默认文件类型 

include /etc/nginx/conf.d/*.conf;

}

default

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;

    index index.html index.htm index.nginx-debian.html;

    server_name _;

    # location / {
    #     try_files $uri $uri/ =404;
    # }
    location / {
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        client_max_body_size 20m;
        proxy_pass http://localhost:4000;
    }

}

custom

server {
#################################################
#ssl#
    ssl_certificate "/etc/nginx/cert/changdingfang.com.pem";
    ssl_certificate_key "/etc/nginx/cert/changdingfang.com.key";
##
#################################################

    listen       80;
    listen       [::]:80;
    server_name  changdingfang.com www.changdingfang.com;
    root         /usr/share/nginx/html;

    include /etc/nginx/default.d/*.conf;

    location / {
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        client_max_body_size 20m;
        proxy_pass http://localhost:4000;
    }

    location /grafana/ {
        proxy_pass http://changdingfang.com:3000/;
    }

    location /dfsrr/ {
        proxy_pass http://localhost:4388/;
    }

######################################################################
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 245292011@qq.com

文章标题:nginx配置

字数:3.9k

本文作者:常丁方

发布时间:2020-07-12, 10:26:42

最后更新:2021-08-26, 08:42:28

原始链接:http://changdingfang.com/2020/07/12/notes/nginx/nginx/
×

喜欢就点赞,疼爱就打赏

资源