• nginx 配置文件详解


    nginx 配置文件详解

    1:nginx配置文件的结构:

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

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

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

    4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。

    5、location块:配置请求的路由,以及各种页面的处理情况。

    2、原配置文件(nginx.conf) 说明:

    #user  nobody;
    
    #开启进程数 <=CPU数 
    worker_processes  1;
    
    
    #错误日志保存位置
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #进程号保存文件
    #pid        logs/nginx.pid;
    
    #每个进程最大连接数(最大连接=连接数x进程数)每个worker允许同时产生多少个链接,默认1024
    events {
        worker_connections  1024;
    }
    
    
    http {
    #文件扩展名与文件类型映射表
        include       mime.types;
        #默认文件类型
        default_type  application/octet-stream;
    
          #日志文件输出格式 这个位置相于全局设置
        #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  logs/access.log  main;
        
        #打开发送文件
        sendfile        on;
        #tcp_nopush     on;
    
        #keepalive_timeout  0;
         #连接超时时间
        keepalive_timeout  65;
    
        #打开gzip压缩
        #gzip  on;
    
         #client_header_buffer_size 4k; 设定请求缓冲,
         客户端请求头部的缓冲区大小。
         这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,
         不过由于一般系统分页都要大于1k,所以这里设置为分页大小。
         分页大小可以用命令getconf PAGESIZE 取得。
         [root@web001 ~]# getconf PAGESIZE
            4096
         但也有client_header_buffer_size超过4k的情况,但是client_header_buffer_size该值必须设置为“系统分页大小”的整倍数。
        #client_header_buffer_size 4k;
        #large_client_header_buffers 4 4k;
        
          #设定负载均衡的服务器列表
        #upstream myproject {
            #weigth参数表示权值,权值越高被分配到的几率越大
            #max_fails 当有#max_fails个请求失败,就表示后端的服务器不可用,默认为1,将其设置为0可以关闭检查
            #fail_timeout 在以后的#fail_timeout时间内nginx不会再把请求发往已检查出标记为不可用的服务器
        #}
        
          #webapp
        #upstream myapp {   
        # server 192.168.122.133:8080 weight=1 max_fails=2 fail_timeout=30s;   
        # server 192.168.122.134:8080 weight=1 max_fails=2 fail_timeout=30s;   
        #} 
        
        
        #配置虚拟主机,基于域名、ip和端口
        server {
          #监听端口
            listen      9000;
            #监听域名
            server_name  localhost;
    
            #charset koi8-r;
    
             #nginx访问日志放在logs/host.access.log下,并且使用main格式(还可以自定义格式)
            #access_log  logs/host.access.log  main;
    
              #返回的相应文件地址
            location / {
            
                #负载均衡反向代理
                #proxy_pass http://myapp;
                
                #返回根路径地址(相对路径:相对于/usr/local/nginx/)
                root   html;
                  #默认访问文件
                index  index.html index.htm;
            }
    
            #error_page  404              /404.html;
    
            # redirect server error pages to the static page /50x.html
            
            #错误页面及其返回地址
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
            # proxy the PHP scripts to Apache listening on 127.0.0.1:80
            #
            #location ~ .php$ {
            #    proxy_pass   http://127.0.0.1;
            #}
    
            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            #
            #location ~ .php$ {
            #    root           html;
            #    fastcgi_pass   127.0.0.1:9000;
            #    fastcgi_index  index.php;
            #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            #    include        fastcgi_params;
            #}
    
            # deny access to .htaccess files, if Apache's document root
            # concurs with nginx's one
            #
            #location ~ /.ht {
            #    deny  all;
            #}
        }
    
    
        # another virtual host using mix of IP-, name-, and port-based configuration
        #
        #server {
        #    listen       8000;
        #    listen       somename:8080;
        #    server_name  somename  alias  another.alias;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    
    
        # HTTPS server
        #
        #server {
        #    listen       443 ssl;
        #    server_name  localhost;
    
        #    ssl_certificate      cert.pem;
        #    ssl_certificate_key  cert.key;
    
        #    ssl_session_cache    shared:SSL:1m;
        #    ssl_session_timeout  5m;
    
        #    ssl_ciphers  HIGH:!aNULL:!MD5;
        #    ssl_prefer_server_ciphers  on;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    
    }

    3: 配置文件详细参数说明:

    1 main全局配置:

    woker_processes 2

    在配置文件的顶级main部分,worker角色的工作进程的个数,master进程是接收并分配请求给worker处理。这个数值简单一点可以设置为cpu的核数:

    可以使用:grep ^processor /proc/cpuinfo | wc -l 查看cpu核数

    也是 auto 值,如果开启了ssl和gzip更应该设置成与逻辑CPU数量一样甚至为2倍,可以减少I/O操作。如果nginx服务器还有其它服务,可以考虑适当减少。

    #全局错误日志及PID文件
    error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    # pid用来指定进程id的存储文件位置
    #pid        logs/nginx.pid;

    日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少

    2、nginx.conf 配置解析之 events配置

    worker_connections 1024;
    定义每个 work_process 同时开启的最大连接数,即允许最多只能有这么多连接。
    accept_mutex on;
    当某一个时刻只有一个网络连接请求服务器时,服务器上有多个睡眠的进程会被同时叫醒,这样会损耗一定的服务器性能。
    Nginx中的accept_mutex设置为on,将会对多个Nginx进程(worker processer)接收连接时进行序列化,防止多个进程争抢资源。
    默认就是on。
    multi_accept on;
    nginx worker processer可以做到同时接收多个新到达的网络连接,前提是把该参数设置为on。
    默认为off,即每个worker process一次只能接收一个新到达的网络连接。
    use epoll;
    Nginx服务器提供了多个事件驱动器模型来处理网络消息。
    其支持的类型有:select、poll、kqueue、epoll、rtsing、/dev/poll以及eventport。
     select:只能在Windows下使用,这个事件模型不建议在高负载的系统使用
     poll: Nginx默认首选,但不是在所有系统下都可用
     kqueue:这种方式在FreeBSD 4.1+, OpenBSD2.9+, NetBSD 2.0, 和 MacOS X系统中是最高效的
     epoll: 这种方式是在Linux 2.6+内核中最高效的方式
     rtsig: 实时信号,可用在Linux 2.2.19的内核中,但不适用在高流量的系统中
     /dev/poll: Solaris 7 11/99+,HP/UX 11.22+, IRIX 6.5.15+, and Tru64 UNIX 5.1A+操作系统最高效的方式
     eventport: Solaris 10最高效的方式
    keepalive_timeout 60

    keepalive超时时间。 这里指的是http层面的keep-alive 并非tcp的keepalive 。

    client_header_buffer_size 4k
    
    

    客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为系统分页大小。查看系统分页可以使用   getconf PAGESIZE    命令


    3、http服务器相关属性的配置:

    1、 include: 是个主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度。类似于Apache中的include方法。
    2、 default_type: 属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置PHP环境时,Nginx是不予解析的,此时,用浏览器访问PHP文件就会出现下载窗口。
    3、 log_format:是Nginx的HttpLog模块指令,用于指定Nginx日志的输出格式。main为此日志输出格式的名称,可以在下面的access_log
    4、 client_max_body_size: 用来设置允许客户端请求上传的最大的单个文件字节数; 默认 1M,表示 客户端请求服务器最大允许大小,在“Content-Length”请求头中指定。如果请求的正文数据大于client_max_body_size,HTTP协议会报错 413 Request Entity Too Large。就是说如果请求的正文大于client_max_body_size,一定是失败的。如果需要上传大文件,一定要修改该值。
    用nginx来做webserver的时,上传大文件时需要特别注意client_max_body_size这个参数,client_max_body_size 500m; 500m表示最大上传500M,需要多大设置多大。

    5、 client_body_buffer_size: Nginx分配给请求数据的Buffer大小,如果请求的数据小于client_body_buffer_size直接将数据先在内存中存储。如果请求的值大于client_body_buffer_size小于client_max_body_size,就会将数据先存储到临时文件中,在哪个临时文件中呢?
    client_body_temp 指定的路径中,默认该路径值是/tmp/.
    所以配置的client_body_temp地址,一定让执行的Nginx的用户组有读写权限。否则,当传输的数据大于client_body_buffer_size,写进临时文件失败会报错。
    6、 client_header_buffer_size 32k: 用于指定来自客户端请求头的headerbuffer大小。对于大多数请求,1K的缓冲区大小已经足够,如果自定义了消息头或有更大的Cookie,可以增加缓冲区大小。这里设置为32K。
    7、 large_client_header_buffers 4 128k;: 用来指定客户端请求中较大的消息头的缓存最大数量和大小, “4”为个数,“128K”为大小,最大缓存量为4个128K。
    8、 sendfile on : 参数用于开启高效文件传输模式。将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞。
    tcp_nopush     on;
    tcp_nodelay    on;
    9、 keepalive_timeout:设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接。
    10、 client_header_timeout:设置客户端请求头读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误。
    11、 client_body_timeout:设置客户端请求主体读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误,默认值是60。

    nginx优化缓冲缓存

    1. proxy_buffering

    语法:proxy_buffering on|off
    默认值:proxy_buffering on
    上下文:http,server,location

    作用:该指令开启从后端被代理服务器的响应body缓冲。
        如果proxy_buffering开启,nginx假定被代理的后端服务器会以最快速度响应,并把内容保存在由指令 proxy_buffer_size 和 proxy_buffers 指定的缓冲区里边.
        如果响应body无法放在内存里边,那么部分内容会被写到磁盘上。
        如果proxy_buffering被关闭了,那么响应body会按照获取body的多少立刻同步传送到客户端。nginx不尝试计算被代理服务器整个响应body的大小,nginx能从服务器接受的最大数据,是由指令 proxy_buffer_size指定的。
        对于基于长轮询(long-polling)的Comet 应用来说,关闭 proxy_buffering 是重要的,不然异步响应将被缓存导致Comet无法工作。
        但是无论proxy_buffering是否开启,proxy_buffer_size都是生效的

    2. proxy_buffers

    语法:proxy_buffers  数量  size
    默认值:proxy_buffers 256 8k
    上下文:http,server,location

    作用:设置存储被代理服务器响应的body所占用的buffer个数和每个buffer大小。
        具体的意思是说,开辟256个长度为8k大小的read_buf用来存储body,当然不是连接建立初始化时就开辟256个,而是当当前buf不够存响应body时才会新申请一个,最多申请256个buf。

    3. proxy_buffer_size

    语法:proxy_buffer_size size
    默认值:proxy_buffer_size 4k/8k
    上下文:http,server,location

    作用:Nginx使用该大小申请read_buf,即大小指定了 upstream header 最大长度,如果响应头超过了这个长度,Nginx会报upstream sent too big header错误,然后client收到的是502。

    4. proxy_busy_buffer_size

    语法:proxy_busy_buffer_size  size
    上下文:http,server,location

    作用:proxy_busy_buffers_size不是独立的空间,他是proxy_buffers和proxy_buffer_size的一部分。
        nginx会在没有完全读完后端响应就开始向客户端传送数据,所以它会划出一部分busy状态的buffer来专门向客户端传送数据(建议为proxy_buffers中单个缓冲区的2倍),然后它继续从后端取数据。
        proxy_busy_buffer_size参数用来设置处于busy状态的buffer有多大。

    1)如果完整数据大小小于busy_buffer大小,当数据传输完成后,马上传给客户端;
        2)如果完整数据大小不小于busy_buffer大小,则装满busy_buffer后,马上传给客户端;

    5. proxy_temp_path

    语法:proxy_temp_path  path [level1 level2 level3]
    默认值:proxy_temp_path proxy_temp
    上下文:http,server,location

    作用:定义proxy的临时文件存在目录以及目录的层级。

    6. proxy_max_temp_file_size

    语法: proxy_max_temp_file_size大小;

    默认值: proxy_max_temp_file_size 1G;

    上下文: http,服务器,位置(如果)

    从以下版本开始可用:0.1.8 

    作用:设置临时文件的总大小

    7. proxy_temp_file_wirte_size

    语法: proxy_temp_file_write_size大小;

    默认值: proxy_temp_file_write_size   proxy_buffer_size * 2;

    上下文: http,服务器,位置(如果)

    作用:设置同时写入临时文件的数据量的总大小。通常设置为8k或者16k。

     nginx中超时设置、请求超时、响应等待超时配置:

    proxy_connect_timeout :后端服务器连接的超时时间_X
    proxy_read_timeout:连接成功后_Y
    proxy_send_timeout :后端服务器数据回传时间_Z
    nginx使用proxy模块时,默认的读取超时时间是60s。

     HttpGzip模块配置:

    /nginx/sbin/nginx  -V
    nginx version: nginx/0.7.65
    configure arguments: --with-http_stub_status_module --with-http_gzip_static_module --prefix=/opt/nginx
    通过/nginx/sbin/nginx  -V命令可以查看安装Nginx时的编译选项,由输出可知,我们已经安装了HttpGzip模块。

    如果没有安装:请到原来的nginx解压的目录下重新执行:

    ./configure  --with-http_stub_status_module --with-http_gzip_static_module
    
    make && make install 

    下面是HttpGzip模块在Nginx配置中的相关属性设置:

      gzip  on;

    表示开启GZIP压缩,实时压缩输出数据流。
    gzip_min_length  1k;

    设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,不管页面多大都进行压缩。建议设置成大于1K的字节数,小于1K可能会越压越大。
    gzip_buffers     4  16k;

    表示申请4个单位为16K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
    gzip_http_version  1.1;

    用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可。
    gzip_comp_level  2;

    用来指定GZIP压缩比,1 压缩比最小,处理速度最快;9 压缩比最大,传输速度快,但处理最慢,也比较消耗cpu资源。
    gzip_types  text/plain application/x-javascript text/css application/xml;

    用来指定压缩的类型,无论是否指定,“text/html”类型总是会被压缩的。
    gzip_vary  on;

     选项可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用Squid缓存经过Nginx压缩的数据。

     负载均衡配置

    下面设定负载均衡的服务器列表。
    upstream ixdba.net{
    ip_hash;
    server 192.168.12.133:80;
    server 192.168.12.134:80  down;
    server 192.168.12.135:8009  max_fails=3  fail_timeout=20s;
    server 192.168.12.136:8080;
    }

           upstream 是Nginx的 HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。在上面的设定中,通过upstream指令指定了一个负载均衡器的名称ixdba.net。这个名称可以任意指定,在后面需要的地方直接调用即可。


    Nginx的负载均衡模块目前支持4种调度算法,下面进行分别介绍,其中后两项属于第三方的调度方法: 


    轮询(默认):    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。
    Weight:            指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。
    ip_hash:          每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。
    fair:                  比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。
    url_hash:        按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。


    在HTTP Upstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:


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

    server虚拟主机配置

    下面介绍对虚拟主机的配置。建议将对虚拟主机进行配置的内容写进另外一个文件,然后通过include指令包含进来,这样更便于维护和管理。

    server{
    listen          80; # 监听端口
    server_name    192.168.12.188  www.ixdba.net;   
    index index.html index.htm index.jsp;
    root  /web/wwwroot/www.ixdba.net
    charset gb2312;
    access_log  logs/www.ixdba.net.access.log  main; }

    server: 标志定义虚拟主机开始,

    listen: 用于指定虚拟主机的服务端口,

    server_name:用来指定当前主机的IP地址或者绑定的域名,多个域名之间用空格分开。

    Index:用于设定访问的默认首页地址,

    root: 指令用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径。

    Charset:用于设置网页的默认编码格式。
    access_log:用来指定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式。

    URL匹配配置

           URL地址匹配是进行Nginx配置中最灵活的部分。 location支持正则表达式匹配,也支持条件判断匹配,用户可以通过location指令实现Nginx对动、静态网页进行过滤处理。
    以下这段设置是通过location指令来对网页URL进行分析处理,所有扩展名以.gif、.jpg、.jpeg、.png、.bmp、.swf结尾的静态文件都交给nginx处理,而expires用来指定静态文件的过期时间,这里是30天。

    location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$  {
                    root    /web/wwwroot/www.ixdba.net;
                   expires 30d;
            }

    以下这段设置是将upload和html下的所有文件都交给nginx来处理,当然,upload和html目录包含在/web/wwwroot/www.ixdba.net目录中。

      location ~ ^/(upload|html)/  {
                    root    /web/wwwroot/www.ixdba.net;
                    expires 30d;
            }

    在最后这段设置中,location是对此虚拟主机下动态网页的过滤处理,也就是将所有以.jsp为后缀的文件都交给本机的8080端口处理。

    location ~ .*.jsp$ { 
        index index.jsp;       
        proxy_pass http://localhost:8080;
    }

          在最后这段设置中,设置了虚拟主机的错误信息返回页面,通过error_page指令可以定制各种错误信息的返回页面。在默认情况下,Nginx会在主目录的html目录中查找指定的返回页面,特别需要注意的是,这些错误信息的返回页面大小一定要超过512K,否者会被ie浏览器替换为ie默认的错误页面。

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

    url匹配的优先级顺序:

    (localtion =) > (localtion完整url) > (localtion ^~) > (localtion ~,~*) > (lcoaltion部分起始路径) > (/)

    = 表示精确匹配
    ^~ 表示指定的路径开头
    ~ 表示区分大小写的正则匹配
    ~* 表示不区分大小写的正则匹配
    / 通用匹配,所有的URL都是以此为开头

     例子:

     1:反向代理配置

    简单配置

    1.1 、比如 www.dengwei.com 转发到 http://www.baidu.com

    server {
        listen       80;
        server_name  www.dengwei.com;# 当前服务器ip地址或绑定域名
        location / { # 访问80端口后的所有路径都转发到 proxy_pass 配置的ip中
            root   /usr/share/nginx/html;
            index  index.html index.htm;
            proxy_pass https://www.baidu.com; # 配置反向代理的ip地址和端口号 【注:url地址需加上http:// 或 https://
        }
    }

    1.2、比如 :  www.dengwei.com/api1  转发到 http://www.baidu.com:9000/api1

                        www.dengwei.com/api2  转发到 http://www.baidu.com:9000/api2

    server {
        listen       80;
        server_name  www.dengwei.com;# 当前服务器ip地址或绑定域名
        location /api1 { # ^~/api1 表示匹配前缀为api1的请求
            root   /usr/share/nginx/html;
            index  index.html index.htm;
            proxy_pass https://www.baidu.com:9000/api1; # 配置反向代理的ip地址和端口号 【注:url地址需加上http:// 或 https://
        }
        location ^~/api2 { # ^~/api2 表示匹配前缀为api2的请求
            root   /usr/share/nginx/html;
            index  index.html index.htm;
            proxy_pass https://www.baidu.com:9000/api2; # 配置反向代理的ip地址和端口号 【注:url地址需加上http:// 或 https://
        }
    }
  • 相关阅读:
    虚方法 C++快速入门23
    抽象方法 C++快速入门24
    网址探测器 零基础入门学习Delphi41
    网址探测器 零基础入门学习Delphi41
    抽象方法 C++快速入门24
    虚方法 C++快速入门23
    运算符重载 C++快速入门25
    静态属性和静态方法2 C++快速入门22
    linux系统中的文件访问控制列表ACL
    linux系统中的文件类型
  • 原文地址:https://www.cnblogs.com/dw3306/p/12942174.html
Copyright © 2020-2023  润新知