nginx 配置

2021-02-18
-
-

nginx 基础手动配置,也可以通过 nginx在线可视化配置 生成

 

Nginx 配置文件结构

...              #全局块

events {         #events块
   ...
}

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

全局块

写在一开始的配置,影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。如

#user  nobody;                          # 默认运行用户 编译时未指定的话为nobody
worker_processes  4;                    # Nginx主进程要开启多少个工作进程 一般为当前CPU核心数
worker_cpu_affinity 0001 0010 0100 1000;   # 将每个进程绑定到CPU的每个核心上 可以略提高性能

#error_log  logs/error.log;             # 错误日志的位置 默认是安装目录下的logs/error.log
#error_log  logs/error.log  notice;     # 可以在日志后面添加纪录级别 
#error_log  logs/error.log  info;       # 可选项有: [debug|info|notice|warn|error|crit]

#pid        logs/nginx.pid;             # pid文件路径 nginx -s 控制服务就是从这里读取主进程的PID
worker_rlimit_nofile 65535;             # 指定文件描述符数量 增大可以让Nginx处理更多连接
                                    # 还需要增大系统允许进程打开文件描述符的上限 ulimit -n 65536

events块

配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。如

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

http块

可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。如

http {
    include       mime.types;         # 其他的block配置 可以通过include导入 这样可以很方便管理配置
    default_type  application/octet-stream; # 响应类型未定义content-type时 文件默认类型为二进制流 
                                            # mime.types中包含文件扩展名与文件类型映射表

    #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日志的格式 main为格式名称 

    access_log  logs/access.log  main;      # 默认access.log的位置 以及使用main中定义的格式

    client_max_body_size     20m;           # 设置允许客户上传大小
    client_header_buffer_size   32k;        # 客户端请求 header_buffer大小 默认1k
    large_client_header_buffers  4 32k;     # 指定客户请求header_buffer的缓存最大数量和大小

    sendfile        on;                     # 开启高效的文件传输模式
    tcp_nopush      on;                     # 开启tcp_nopush和tcp_nodelay用于防止网络阻塞
    tcp_nodelay     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;                  # 客户端连接后保持连接的超时时间
    client_header_timeout  10;              # 设置客户端请求头读取超时时间 
                                            # 超时将返回Request time out (408)
    client_body_timeout    10;              # 设置客户端请求主体读取超时时间  超时也将返回408
    send_timeout           10;              # 指定响应客户端的超时时间
                                            # 如果超过这个时间 客户端没有任何活的 Nginx将关闭连接

    gzip  on;                               # 开启还是关闭gzip模块 on表示开启 实时压缩输出数据流
    gzip_min_length  1k;                    # 允许压缩页面最小字节数 小于1k的文件可能越压越大
    gzip_buffers     4  16k;                # 申请4个单位16KB的内存做压缩结果流缓存 默认源文件大小
    gzip_http_version  1.1;                 # 用于识别HTTP协议版本 默认 1.1
    gzip_comp_level  2;                     # 压缩等级 1 表示最快压缩 但压缩比最小 9反之
    gzip_types  text/plain application/x-javascript text/css application/xml;   # 指定压缩类型
    gzip_vary  on;                          # 让前端的缓存服务器缓存经过gzip压缩的页面
    
    # http_proxy 设置
 # 故障转移策略,当后端服务器返回如下错误时,自动负载到后端其余机器
 proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header;
 
 # 设置后端服务器获取用户真实IP、代理者真实IP等
 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_body_buffer_size 128k;
 
 # 表示与后端服务器连接的超时时间,即发起握手等侯响应的超时时间
 proxy_connect_timeout 90;
 
 # 表示后端服务器的数据回传时间,即在规定时间之后端服务器必须传完所有的数据,否则 Nginx 将断开这个连接
 proxy_send_timeout 90;
 
 # 设置 Nginx 从代理的后端服务器获取信息的时间,表示连接建立成功后,Nginx 等待后端服务器的响应时间,其实是 Nginx 已经进入后端的排队中等候处理的时间
 proxy_read_timeout 90;
 
 # 设置缓冲区大小,默认该缓冲区大小等于指令 proxy_buffers 设置的大小
 proxy_buffer_size 4k;
 
 # 设置缓冲区的数量和大小。Nginx 从代理的后端服务器获取的响应信息,会放置到缓冲区
 proxy_buffers 4 32k;
 
 # 用于设置系统很忙时可以使用的 proxy_buffers 大小,官方推荐大小为 proxu_buffers 的两倍
 proxy_busy_buffers_size 64k;
 
 # 指定 proxy 缓存临时文件的大小
 proxy_temp_file_write_size 64k;
    ...
}

代理部分也可以配置在server中。

 

server 块

server是在http中的,用于配置虚拟主机的相关参数,一个http中可以有多个server。如

server {                                # server段就是虚拟主机的配置
    listen       80;                    # 监听所有IP的80端口 可以指定单个IP
    server_name  localhost  example.com;;             # 用来指定IP地址或域名 多个域名间用空格分开

    #charset utf-8;;                    # 用于设置网页默认编码

    #access_log  logs/host.access.log  main;    # 每一个虚拟主机也可以定义单独的access.log

    location / {                        # URL地址匹配设置
        root   /var/www/html;           # 网页根目录
        index  index.html index.htm;    # 默认首页地址 会先寻找index.html 然后往后
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$  {   # 匹配以这些格式结尾的请求
        root    /var/www/static;                    # 匹配到的请求从这个目录找文件
        expires 30d;                                # 客户端缓存静态文件过期时间30天
    }


    error_page  404              /404.html;         # 自定义404页面 /404.html为root指定的位置

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;        # 自定义50x页面 到/50x.html
    location = /50x.html {                          # 匹配50x页面的请求
        root   html;                                # 匹配到的请求从这个目录找文件
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    location ~ \.php$ {                             # 匹配php页面的请求
        index index.php                             # 默认索引index.php
        proxy_pass   http://127.0.0.1               # 匹配到的请求转发到本机80端口处理
    }

    location ~ \.jsp$ {                             # 匹配jsp页面的请求
        index index.jsp                             # 默认索引index.jsp
        proxy_pass   http://127.0.0.1:8080          # 匹配到的请求转发到本机8080端口处理
    }

    location /status {                              # 匹配status的请求
        stub_status on;                             # 开启Nginx工作状态统计
        access_log    logs/status.log;              # 状态统计页面访问日志
        auth_basic    "Nginx Status";               # 自定义提醒 认证界面会显示
        auth_basic_user_file    /var/www/htpasswd;  # 认证密码文件 htpasswd工具由httpd提供
        deny 127.0.0.1;  #拒绝的ip
        allow 172.18.5.54; #允许的ip 
        allow 192.168.10.100;
     allow 172.29.73.0/24;
     deny all;
    }                                               # 访问http://host/status 就可以看到状态统计了

 

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {                    # FastCGI模式
    #    root           /var/www/html;      # php页面根目录
    #    fastcgi_pass   127.0.0.1:9000;     # FastCGI监听地址 也可以使用unix套接字监听地址
    #    fastcgi_index  index.php;          # 索引文件
    #    fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;  # php脚本全路径
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {                     # 匹配ht开头的文件
    #    deny  all;                         # 规则是全部拒绝
    #}
    }

 

location 块

location是在server中的,一个server可以有多个location,用于配置请求的路由,以及各种页面的处理情况。如实现动静分离,请求转发。

请求中带 /api/ 的转发到 http://192.168.76.10:9000;

server {
        listen       80;
        server_name  localhost;  #服务器域名
        location / {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
           
            root   html/default; #网页根目录(/usr/local/nginx/html/default/)
            index  index.html index.htm; 

            # autoindex   on; # 开启索引
        }
        location /api/ {
            proxy_pass  http://192.168.76.10:9000; 
            proxy_set_header Host $host;
        }
}

单独定义 html页面、图片、js脚本等静态资源入口,可简化访问路径

server {
        listen       80;
        server_name  localhost;  
        location / {
            proxy_set_header Host $host; 
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;

            root   html/default; #网页根目录(/usr/local/nginx/html/default/)
            index  index.html index.htm; 
        }
        location /api/ {
            proxy_pass  http://192.168.76.10:9000; # 动态资源,后台接口
            proxy_set_header Host $host;
        }
        location /image/ {
            root  html/default/static;  # 静态资源 - 图片
            # autoindex   on;
        }
        location /page/ {
            root  html/default/static;  # 静态资源 - html页面
            # autoindex   on;
        }
}

如果请求这个 http://192.168.76.100/image/a.png

访问图片是 /usr/local/nginx/html/default/static/image/a.png

如果请求 http://192.168.76.100/static/image/a.png

访问图片 /usr/local/nginx/html/default/static/image/a.png

即  /usr/local/nginx/ + 配置的root目录 + URL中匹配的资源路径

root 后面的参数,如果是 / 开始,代表的是 linux 根目录下的目录,非 / 开始代表的是从 nginx 目录下开始

root 后面的参数,如果是 / 结尾,则 location 后面的参数,就不用以 / 开始,否则必须以 / 开始

 

upstream

location中有一个这个

location ~ \.jsp$ {                             # 匹配jsp页面的请求
    index index.jsp                             # 默认索引index.jsp
    proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
}

mysvr 就是配置的 upstream。和server平级,一般用于负载均衡。

 

热备

如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。

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

 

轮询

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

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

加权轮询

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

upstream mysvr { 
    server 127.0.0.1:7878 weight=1;
    server 192.168.10.121:3333 weight=2;
}

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;    
}

include

一个nginx可以管理很多服务器,随着需要配置的东西越来越多,配置文件也越来越长。

所以为了简化文件,可以使用include

如把server模块和对应的upstream写在一个文件里,通过引入的方式,可以是配置文件更加清晰。如

# Load configs
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

完整示例

user root root; #使用什么用户启动NGINX 在运行时使用哪个用户哪个组
worker_processes 4; #启动进程数,一般是1或8个,根据你的电脑CPU数,一般8个
worker_cpu_affinity 00000001 00000010 00000100 00001000; #CPU逻辑数——把每个进程分别绑在CPU上面,为每个进程分配一个CPU
#pid /usr/local/nginx/logs/nginx.pid
worker_rlimit_nofile 102400; #一个进程打开的最大文件数目,与NGINX并发连接有关系
 
#工作模式及连接数上限
events
{
  use epoll; #多路复用IO 基于LINUX2.6以上内核,可以大大提高NGINX的性能 uname -a查看内核版本号
  worker_connections 102400; #单个worker process最大连接数,其中NGINX最大连接数=连接数*进程数,一般1GB内存的机器上可以打开的最大数大约是10万左右
  multi_accept on;   #尽可能多的接受请求,默认是关闭状态
}
 
#处理http请求的一个应用配置段
http
{
  #引用mime.types,这个类型定义了很多,当web服务器收到静态的资源文件请求时,依据请求文件的后缀名在服务器的MIME配置文件中找到对应的MIME #Type,根据MIMETYPE设置并response响应类型(Content-type)
  include       mime.types;
  default_type  application/octet-stream; #定义的数据流,有的时候默认类型可以指定为text,这跟我们的网页发布还是资源下载是有关系的
  fastcgi_intercept_errors on; #表示接收fastcgi输出的http 1.0 response code
  charset utf-8;
  server_names_hash_bucket_size 128; #保存服务器名字的hash表
  #用来缓存请求头信息的,容量4K,如果header头信息请求超过了,nginx会直接返回400错误,先根据client_header_buffer_size配置的值分配一个buffer,如果##分配的buffer无法容纳request_line/request_header,那么就会##再次根据large_client_header_buffers配置的参数分配large_buffer,如果large_buffer还是无#法容纳,那么就会返回414(处理request_line)/400(处理request_header)错误。
  client_header_buffer_size 4k;
  large_client_header_buffers 4 32k;
  client_max_body_size 300m; #允许客户端请求的最大单文件字节数 上传文件时根据需求设置这个参数
  #指定NGINX是否调用这个函数来输出文件,对于普通的文件我们必须设置为ON,如果NGINX专门做为一个下载端的话可以关掉,好处是降低磁盘与网络的IO处理数及#系统的UPTIME
  sendfile on;
  #autoindex on;开启目录列表访问,适合下载服务器
  tcp_nopush on; #防止网络阻塞
  #非常重要,根据实际情况设置值,超时时间,客户端到服务端的连接持续有效时间,60秒内可避免重新建立连接,时间也不能设太长,太长的话,若请求数10000##,都占用连接会把服务托死
  keepalive_timeout 60;
  tcp_nodelay on; #提高数据的实时响应性
  client_body_buffer_size 512k; #缓冲区代理缓冲用户端请求的最大字节数(请求多)

  proxy_connect_timeout   5; #nginx跟后端服务器连接超时时间(代理连接超时)
  proxy_read_timeout      60; #连接成功后,后端服务器响应时间(代理接收超时)
  proxy_send_timeout      5; #后端服务器数据回传时间(代理发送超时)
  proxy_buffer_size       16k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
  proxy_buffers           4 64k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
  proxy_busy_buffers_size 128k; #高负荷下缓冲大小
  proxy_temp_file_write_size 128k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
 
  gzip on; #NGINX可以压缩静态资源,比如我的静态资源有10M,压缩后只有2M,那么浏览器下载的就少了
  gzip_min_length  1k;
  gzip_buffers     4 16k;
  gzip_http_version 1.1;
  gzip_comp_level 2; #压缩级别大小,最小1,最大9.值越小,压缩后比例越小,CPU处理更快,为1时,原10M压缩完后8M,但设为9时,压缩完可能只有2M了。一般设置为2
  gzip_types       text/plain application/x-javascript text/css application/xml; #压缩类型:text,js css xml 都会被压缩
  gzip_vary on; #作用是在http响应中增加一行目的是改变反向代理服务器的缓存策略
 
#日志格式
log_format  main '$remote_addr - $remote_user [$time_local] "$request" ' #ip 远程用户 当地时间  请求URL
                 '$status $body_bytes_sent "$http_referer" ' #状态  发送的大小  响应的头
         '"$http_user_agent" $request_time'; #客户端使用的浏览器  页面响应的时间
 
#动态转发
upstream web1 {
    #每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。配置了ip_hash就没有负载均衡的效果了,每次访问的都是同一个tomcat
    #ip_hash;
    #转发的后端的tomcat服务器,weight表示转发的权重,越大转发的次数越多,机器性能不一样配置的weight值不一样
     server   127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=30s;
     server   127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=30s;
}
upstream web2 {
     server   127.0.0.1:8090 weight=1 max_fails=2 fail_timeout=30s;
     server   127.0.0.1:8091 weight=1 max_fails=2 fail_timeout=30s;
}
 
server {
    listen       80; #监听80端口
    server_name  www.dbspread.com; #域名
    index  index.jsp index.html index.htm;
    root   /usr/local/nginx/html; #定义服务器的默认网站根目录位置
 
    #监听完成以后通过斜杆(/)拦截请求转发到后端的tomcat服务器
    location /
        {
            #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
            proxy_next_upstream http_502 http_504 error timeout invalid_header;
            proxy_set_header Host  $host; #获取客户端的主机名存到变量Host里面,从而让tomcat取到客户端机器的信息
            proxy_set_header X-Real-IP $remote_addr; #获取客户端的主机名存到变量X-Real-IP里面,从而让tomcat取到客户端机器的信息
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://web1; #跳转到对应的应用web1
        }
 
       # location ~ .*\.(php|jsp|cgi|shtml)?$ #动态分离 ~匹配 以.*结尾(以PHP JSP结尾走这段)
       #  {
       #     proxy_set_header Host  $host;
       #        proxy_set_header X-Real-IP $remote_addr;
       #        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       #        proxy_pass http://jvm_web2;
       # }
 
        #静态分离 ~匹配 以.*结尾(以PHP JSP结尾走这段),当然不是越久越好,如果有10000个用户在线,都保存几个月,系统托跨
        location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
        {
            root /var/local/static;
            expires    30d;
        }
 
        #日志级别有[debug|info|notice|warn|error|crit]  error_log 级别分为 debug, info, notice, warn, error, crit  默认为crit, 生产环境用error
        #crit 记录的日志最少,而debug记录的日志最多
        access_log  /usr/local/logs/web2/access.log main;
        error_log   /usr/local/logs/web2/error.log  crit;
 
    }

}

 

 

“您的支持是我持续分享的动力”

微信收款码
微信
支付宝收款码
支付宝

目录关闭