最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

NGINX配置详解

来源:博客园
目录
  • NGINX配置详解
    • 什么是NGX
    • NGX的常用功能
      • 1、正向代理及反向代理
      • 2、负载均衡
      • 3、web缓存
    • Nginx配置文件结构
      • nginx.conf
      • nginx.conf的配置举例
        • 全局块
        • events块
          • event与全局块中的两参数结合使用
        • 最重要的http块
          • 5 server块的配置,即虚拟主机的配置
          • 6 include /etc/nginx/conf.d/*.conf;
    • nginx http模块配置实例及日常使用命令
      • 反向代理
      • 负载均衡
      • 善用Log排错
      • 不重启的情况下加载配置

NGINX配置详解

关于ngx虽然一直在用,但是对其配置及详细作用有些一知半解,本周趁有时间刚好一起梳理下。本篇文章将包括常用的ngx功能,如代理及负载均衡等,争取内容尽量全面丰富一些。

什么是NGX

Nginx 是开源的轻量级 Web 服务器、反向代理服务器,以及负载均衡器和 HTTP 缓存器。其特点是高并发,高性能和低内存。

Nginx 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,最大能支持 50000 个并发连接数。 Nginx 还支持热部署,它的使用特别容易,几乎可以做到 7x24 小时不间断运行。 Nginx 的网站用户有:百度、淘宝、京东、腾讯、新浪、网易等。


(资料图片)

NGX的常用功能

1、正向代理及反向代理

其主要有以下几点区别:1、代理对象不同。正向代理代理的是客户端,反向代理代理的是服务器。正向代理帮助客户访问其无法访问的服务器资源,反向代理帮助服务器做负载均衡,另外,由于客户端跟真实服务器不直接接触,能起到一定安全防护的作用。2、架设主体不同。正向代理一般是客户端架设的,比如在自己的机器上装一个代理软件,反向代理一般是服务器架设的,通常是在机器集群中部署个反向代理服务器。3、保护对象不同。正向代理保护对象是客户端,反向代理保护对象是原始资源服务器。4、作用目的不同。正向代理主要目的是解决访问限制问题,而反向代理一方面是作为负载均衡,再就是起到安全防护的作用。

2、负载均衡

Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash。扩展策略,就天马行空,只有你想不到的没有他做不到的啦。我们日常中最常见的三种nginx的负载均衡策略应当为(轮询、权重、ip绑定),这其中的区别体现在upstream代码块中,以下是upstream代码块示例(轮询)。

3、web缓存

Nginx可以对不同的文件做不同的缓存处理,配置灵活,并且支持FastCGI_Cache,主要用于对FastCGI的动态程序进行缓存。配合着第三方的ngx_cache_purge,对制定的URL缓存内容可以的进行增删管理。

Nginx配置文件结构

安装nginx的时候默认配置文件位置为/etc/nginx 下,默认的配置文件为nginx.conf ,nginx配置文件在/etc/nginx/nginx.conf

nginx.conf

Nginx服务器的基础配置,默认的配置也存放在nginx.conf中,主要包含以下几个部分:

  • 第一部分 全局块

主要设置一些影响 nginx 服务器整体运行的配置指令。

比如: worker_processes 1; , worker_processes 值越大,可以支持的并发处理量就越多。

  • 第二部分 events块

events 块涉及的指令主要影响Nginx服务器与用户的网络连接。

比如: worker_connections 1024; ,支持的最大连接数。

  • 第三部分 http块

http 块又包括 http 全局块和 server 块,是服务器配置中最频繁的部分,包括配置代理、缓存、日志定义等绝大多数功能。

server块:配置虚拟主机的相关参数。

location块(URL匹配特定位置的设置):配置请求路由,以及各种页面的处理情况。

upstream(负载均衡服务器设置):指令主要用于负载均衡,设置一系列的后端服务器,upstream后的名称和后面的 proxy_pass要对应起来。

它的配置文件都是以block的形式组织的,每个block一般都是以括号“{}”来表示的。主要包括全局,event,http,server等设置,event主要定义nginx的工作模式,http提供web功能,server用来设置虚拟主机,server可以存在多个

nginx默认配置如下
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;error_log /var/log/nginx/error.log;pid /run/nginx.pid;# Load dynamic modules. See /usr/share/doc/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;    tcp_nopush          on;    tcp_nodelay         on;    keepalive_timeout   65;    types_hash_max_size 4096;    include             /etc/nginx/mime.types;    default_type        application/octet-stream;    # 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;    server {        listen       80;        listen       [::]:80;        server_name  _;        root         /usr/share/nginx/html;        # Load configuration files for the default server block.        include /etc/nginx/default.d/*.conf;        error_page 404 /404.html;        location = /404.html {        }        error_page 500 502 503 504 /50x.html;        location = /50x.html {        }    }# Settings for a TLS enabled server.##    server {#        listen       443 ssl http2;#        listen       [::]:443 ssl http2;#        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;##        error_page 404 /404.html;#            location = /40x.html {#        }##        error_page 500 502 503 504 /50x.html;#            location = /50x.html {#        }#    }}
配置举例

nginx.conf的配置举例

########### 每个指令必须有分号结束。##################user administrator administrators;  #配置用户或者组,默认为nobody nobody。#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|emergevents {    accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on    multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport    worker_connections  1024;    #最大连接数,默认为512}http {    include       mime.types;   #文件扩展名与文件类型映射表    default_type  application/octet-stream; #默认文件类型,默认为text/plain    #access_log off; #取消服务日志        log_format myFormat "$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for"; #自定义格式    access_log log/access.log myFormat;  #combined为日志格式的默认值    sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。    upstream mysvr {         server 127.0.0.1:7878;      server 192.168.10.121:3333 backup;  #热备    }    error_page 404 https://www.baidu.com; #错误页    server {        keepalive_requests 120; #单连接请求上限次数。        listen       4545;   #监听端口        server_name  127.0.0.1;   #监听地址               location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。           #root path;  #根目录           #index vv.txt;  #设置默认页           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表           deny 127.0.0.1;  #拒绝的ip           allow 172.18.5.54; #允许的ip                   }     }}

全局块

从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。通常包括下面几个部分:

  • 1 配置运行Nginx服务器用户(组)如:user nobody nobody; user是个主模块指令,指定Nginx Worker进程运行以及用户组。指令格式:user user [group];user:指定可以运行Nginx服务器的用户;group:可选项,可以运行Nginx服务器的用户组。如果user指令不配置或者配置为user nobody nobody,默认由nobody账户运行。

  • 2 worker process数Nginx服务器实现并发处理服务的关键。woker_processes是主模块指令,制定了Nginx要开启的进程数。每个Nginx进程平均耗费10M~12M内存。建议指定和CPU的数量一致即可。worker_processes: CPU核心数,(双核4线程,可以设置为4),默认:worker_processes: 1网上推荐:据实践表明,nginx的这个参数在一般情况下开4个或8个就可以了,再往上开的话优化不太大。(https://www.cnblogs.com/aaron-agu/p/8003831.html)指令格式:worker_processes number | auto;number : Nginx 进程最多可以产生的worker process 数。auto : Nginx 进程将自动检测。在按照上面的配置格式配置了之后,假如上面的数目是2,那么启动Nginx服务器后,在后台主机上查看Nginx的进程情况,可以看到应该是有2个Nginx进程。

  • 3.错误日志的存放路径error_log 是个主模块指令,用来定义全局错误日志文件。日志输出级别有debug,info,notice,warn,error,erit可供选择,其中,debug输出日志最为详细,而crit输出日志最少。指定格式:error_log file | stderr;file : 日志输出到某个文件filestderr : 日志输出到标准错误输出 (日志输出级别)。如:error_log logs/error.log info;

  • 4.Nginx进程PID存放路径Nginx进程是作为系统守护进程在进行,需要在某个文件中保存当前运行程序的主进程号,Nginx支持该保存文件路径的定义。指令格式:pid file;file:指定存放路径和文件名称。如果不指定,则默认置于路径 logs/nginx.pid如:pid logs/nginx.pid; pid是个主模块指令,用来指定进程pid的存储文件位置。

  • 5.worker_rlimit_nofile指定进程可以打开的最多文件描述数目,理论值应该是最多打开文件数(ulimit -n )与nginx进程数相除,但是Nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。现在在Linux2.6 内核下开启文件打开数为65535,worker_rlimit_nofile 就相应应该填写65535.这是因为Nginx调度时请求到进程并不是那么均衡,所以假如填写10240,总并发量达到3-4万时就有进程超过10240了,这就会返回502。如:worker_rlimit_nofile 65535; 用来绑定worker进程和CPU,Linux内核2.4 以上可用

events块

  • 1.use如:use epoll;use是事件模块指令,用来指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll 。其中select 和poll 都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中。对于Linux系统,epoll工作模式是首选。

  • 2.worker_connections如:worker_connections 65536;work_connections也是个事件模块指令,用于定义Nginx每个进程的最大连接数,默认是1024。注意一下几点:connections不是随便设置的,而是与两个指标有重要关联,一是内存,二是操作系统级别的“进程最大可打开文件数”。内存:每个连接数分别对应一个read_event、一个write_event事件,一个连接数大概占用232字节,2个事件总占用96字节,那么一个连接总共占用328字节,通过数学公式可以算出100000个连接数大概会占用 31M = 100000 * 328 / 1024 / 1024,当然这只是nginx启动时,connections连接数所占用的nginx。进程最大可打开文件数:进程最大可打开文件数受限于操作系统,可通过 ulimit -n 命令查询,以前是1024,现在是65535,nginx提供了worker_rlimit_nofile指令,这是除了ulimit的一种设置可用的描述符的方式。 该指令与使用ulimit对用户的设置是同样的效果。此指令的值将覆盖ulimit的值,如:worker_rlimit_nofile 20960;

event与全局块中的两参数结合使用

以上两个worker_processes与worker_connections 设置好合适大小,可以提示nginx处理性能,非常重要。原作者的话:

As a general rule you need the only worker with large number of worker_connections, say 10,000 or 20,000.However, if nginx does CPU-intensive work as SSL or gzipping and you have 2 or more CPU, then you may set worker_processes to be equal to CPU number.Besides, if you serve many static files and the total size of the files is bigger than memory, then you may increase worker_processes to utilize a full disk bandwidth.

翻译:

一般一个进程足够了,你可以把连接数设得很大。(worker_processes: 1,worker_connections: 10,000)

如果有SSL、gzip这些比较消耗CPU的工作,而且是多核CPU的话,可以设为和CPU的数量一样(worker_processes: CPU核心数)或者要处理很多很多的小文件,而且文件总大小比内存大很多的时候,也可以把进程数增加,以充分利用IO带宽(主要似乎是IO操作有block)

最重要的http块

需要注意这里有个 access.log 日志

  • 1 定义MIMI-Type如:include mime.types;

指令格式:include file;

该指令主要用于将其他的Nginx配置或第三方模块的配置引用到当前的主配文件中,减少主配置文件的复杂度。default_type application/octet-stream;

default_type:属于HTTP核心模块指令,这里设定默认类型为二进制流。也就是当文件类型未定义时使用这种方式,

  • 2 自定义服务日志log_format 是Nginx的HttpLog模块指令,用于指定Nginx日志的输出日志。当然其中还有更为详细的配置,但是这里只做大略的研究学习,不过分深入细节。

  • 3 允许sendfile方式传输文件指令格式:sendfile on;

这个指令中的参数on是表示开启高效文件传输模式,默认是关闭状态(off),将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞;

  • 4 连接超时时间指令格式:keepalive_timeout number;

长连接超时时间,单位是秒:设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接;

如:keepalive_timeout 65;

5 server块的配置,即虚拟主机的配置
server #网站配置区域{   listen 80;     #默认监听80端口    server_name www.lulu.com;    #提供服务的域名主机名    location / {             root html;               #站点根目录(这里html是相对路径,默认网站根目录为:/usr/local/nginx/html)            index index.thml index.htm;  #默认首页文件,多个用空格分开    }    error_page 500 502 503 504  /50x.html;    #出现对应http状态码时,使用50x.html回应客户    location = /50x.thml {    root    html;     #指定对应目录    }} 
6 include /etc/nginx/conf.d/*.conf;

设置http端配置包含/etc/nginx/conf.d目录中所有以".conf"文件结尾的配置文件,一般将server段配置文件放在该目录下。

nginx http模块配置实例及日常使用命令

反向代理

server {        listen       80;           server_name  192.168.4.32;   #监听地址           location  / {                  root html;  #/html目录           proxy_pass http://127.0.0.1:8080;  #请求转向           index  index.html index.htm;      #设置默认页               }     }

负载均衡

在浏览器地址栏输入 http://192.168.4.32:80,平均到 5000 和 8080 端口中,实现负载均衡效果。具体可以参考https://www.jb51.net/article/165065.htm , 负载均衡的方式有多个,包括轮训 、 权重分配等等

upstream myserver {         server 192.167.4.32:5000;      server 192.168.4.32:8080;    }    server {        listen       80;   #监听端口        server_name  192.168.4.32;   #监听地址           location  / {                  root html;  #html目录           index index.html index.htm;  #设置默认页           proxy_pass  http://myserver;  #请求转向 myserver 定义的服务器列表              }     }

善用Log排错

在conf中有两个log地址, 一个定义在全局块 ,一个定义在http的access.log中。/var/log/nginx/error.log/var/log/nginx/access.log

不重启的情况下加载配置

测试是否写对了:nginx -t

不重启服务的情况下,加载新的内容:nginx -s reload

关键词: