• Nginx配置文件详解


    在项目使用中,使用最多的三个核心功能是静态服务器、反向代理和负载均衡。

    这三个不同的功能的使用,都跟 Nginx 的配置息息相关,Nginx 服务器的配置都集中在 nginx.conf 这个配置文件中,并且所有的可配置选项大致分为以下几个部分。

    main                                # 全局配置
    
    events {                            # 工作模式配置
        ....
    }
    
    http {                              # http设置
        ....
        server {                        # 服务器主机配置(虚拟主机、反向代理等)
            ....
            location {                  # 路由配置(虚拟目录等)
                ....
            }
            location path {
                ....
            }
            location otherpath {
                ....
            }
        }
        server {
            ....
            location {
                ....
            }
        }
        upstream name {                 # 负载均衡配置
            ....
        }
    }
    

    一、main 模块

    • user:用来指定 nginx worker 进程运行用户以及用户组,默认 nobody 账号运行

    • worker_processes:指定 nginx 要开启的子进程数量,运行过程中监控每个进程消耗内存(一般几M~几十M不等)根据实际情况进行调整,通常数量是 CPU 内核数量的整数倍

    • error_log:定义错误日志文件的位置及输出级别【debug / info / notice / warn / error / crit】

    • pid:用来指定进程 id 的存储文件的位置

    • worker_rlimit_nofile:用于指定一个进程可以打开最多文件数量的描述

    • ...

    二、event 模块

    • worker_connections:指定最大可以同时接收的连接数量,这里一定要注意,最大连接数量是和 worker processes 共同决定的。

    • multi_accept:配置指定 nginx 在收到一个新连接通知后尽可能多的接受更多的连接

    • use epoll:配置指定了线程轮询的方法,如果是 linux2.6+,使用 epoll,如果是 BSD 如 Mac 请使用 Kqueue

    • ...

    三、http 模块

    作为 web 服务器,http 模块是 nginx 最核心的一个模块,配置项也是比较多的,项目中会设置到很多的实际业务场景,需要根据硬件信息进行适当的配置。

    1)基础配置

    • sendfile on:配置 on 让 sendfile 发挥作用,将文件的回写过程交给数据缓冲去去完成,而不是放在应用中完成,这样的话在性能提升有有好处

    • tcp_nopush on:让 nginx 在一个数据包中发送所有的头文件,而不是一个一个单独发

    • tcp_nodelay on:让 nginx 不要缓存数据,而是一段一段发送,如果数据的传输有实时性的要求的话可以配置它,发送完一小段数据就立刻能得到返回值,但是不要滥用哦


    • keepalive_timeout 10:给客户端分配连接超时时间,服务器会在这个时间过后关闭连接。一般设置时间较短,可以让 nginx 工作持续性更好

    • client_header_timeout 10:设置请求头的超时时间

    • client_body_timeout 10:设置请求体的超时时间

    • send_timeout 10:指定客户端响应超时时间,如果客户端两次操作间隔超过这个时间,服务器就会关闭这个链接


    • limit_conn_zone $binary_remote_addr zone=addr:5m :设置用于保存各种key的共享内存的参数,

    • limit_conn addr 100: 给定的key设置最大连接数


    • server_tokens:虽然不会让 nginx 执行速度更快,但是可以在错误页面关闭 nginx 版本提示,对于网站安全性的提升有好处哦

    • include /etc/nginx/mime.types:指定在当前文件中包含另一个文件的指令

    • default_type application/octet-stream:指定默认处理的文件类型可以是二进制

    • type_hash_max_size 2048:混淆数据,影响三列冲突率,值越大消耗内存越多,散列 key 冲突率会降低,检索速度更快;值越小 key,占用内存较少,冲突率越高,检索速度变慢

    2)日志配置

    • access_log logs/access.log:设置存储访问记录的日志

    • error_log logs/error.log:设置存储记录错误发生的日志

    3)SSL 证书配置

    • ssl_protocols:指令用于启动特定的加密协议,nginx 在 1.1.13 和 1.0.12 版本后默认是 ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1 与 TLSv1.2 要确保 OpenSSL >= 1.0.1,SSLv3 现在还有很多地方在用但有不少被攻击的漏洞。

    • ssl prefer server ciphers:设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件

    4)压缩配置

    • gzip:是告诉 nginx 采用 gzip 压缩的形式发送数据。这将会减少我们发送的数据量。

    • gzip_disable:为指定的客户端禁用 gzip 功能。我们设置成 IE6 或者更低版本以使我们的方案能够广泛兼容。

    • gzip_static:告诉 nginx 在压缩资源之前,先查找是否有预先 gzip 处理过的资源。这要求你预先压缩你的文件(在这个例子中被注释掉了),从而允许你使用最高压缩比,这样 nginx 就不用再压缩这些文件了(想要更详尽的 gzip_static 的信息,请点击这里)。

    • gzip_proxied:允许或者禁止压缩基于请求和响应的响应流。我们设置为 any,意味着将会压缩所有的请求。

    • gzip_min_length:设置对数据启用压缩的最少字节数。如果一个请求小于1000字节,我们最好不要压缩它,因为压缩这些小的数据会降低处理此请求的所有进程的速度。

    • gzip_comp_level:设置数据的压缩等级。这个等级可以是1-9之间的任意数值,9是最慢但是压缩比最大的。我们设置为4,这是一个比较折中的设置。

    • gzip_type:设置需要压缩的数据格式。上面例子中已经有一些了,你也可以再添加更多的格式。

    5)文件缓存配置

    • open_file_cache:打开缓存的同时也指定了缓存最大数目,以及缓存的时间。我们可以设置一个相对高的最大时间,这样我们可以在它们不活动超过20秒后清除掉。

    • open_file_cache_valid:在 open_file_cache 中指定检测正确信息的间隔时间。

    • open_file_cache_min_uses:定义了 open_file_cache 中指令参数不活动时间期间里最小的文件数。

    • open_file_cache_errors:指定了当搜索一个文件时是否缓存错误信息,也包括再次给配置中添加文件。我们也包括了服务器模块,这些是在不同文件中定义的。如果你的服务器模块不在这些位置,你就得修改这一行来指定正确的位置。

    四、sever 模块

    srever 模块配置是 http 模块中的一个子模块,用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息。

    server {
        listen         80;
        server_name    localhost  192.168.1.100;
        charset        utf-8;
        access_log     logs/access.log;
        error_log      logs/error.log;
        ......
    }
    
    • server:一个虚拟主机的配置,一个 http 中可以配置多个 server

    • server_name:用来指定 ip 地址或者域名,多个配置之间用空格分隔

    • charset:用于设置 www/ 路径中配置的网页的默认编码格式

    • access_log:用于指定该虚拟主机服务器中的访问记录日志存放路径

    • error_log:用于指定该虚拟主机服务器中访问错误日志的存放路径

    五、location 模块

    location 模块是 Nginx 配置中出现最多的一个配置,主要用于配置路由访问信息。

    在路由访问信息配置中关联到反向代理、负载均衡等等各项功能,所以 location 模块也是一个非常重要的配置模块。

    1)基本配置

    location / {
        root    /nginx/www;
        index   index.php index.html index.htm;
    }
    
    • location /:表示匹配访问根目录

    • root:用于指定访问根目录时,访问虚拟主机的 web 目录

    • index:在不指定访问具体资源时,默认展示的资源文件列表

    2)反向代理配置

    通过反向代理代理服务器访问模式,通过 proxy_set 配置让客户端访问透明化。

    location / {
        proxy_pass http://localhost:8888;
        proxy_set_header X-real-ip $remote_addr;
        proxy_set_header Host $http_host;
    }
    

    3)uwsgi 配置

    location / {
        include uwsgi_params;
        uwsgi_pass localhost:8888
    }
    

    六、负载均衡模块(upstream)

    upstream 模块主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器。简单的配置方式如下。

    upstream name {
        ip_hash;
        server 192.168.1.100:8000;
        server 192.168.1.100:8001 down;
        server 192.168.1.100:8002 max_fails=3;
        server 192.168.1.100:8003 fail_timeout=20s;
        server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
    }
    
    • ip_hash:指定请求调度算法,默认是weight权重轮询调度,可以指定

    • server host:port:分发服务器的列表配置

    • -- down:表示该主机暂停服务

    • -- max_fails:表示失败最大次数,超过失败最大次数暂停服务

    • -- fail_timeout:表示如果请求受理失败,暂停指定的时间之后重新发起请求

    七、Nginx 主要配置

    1)静态Http服务器配置

    首先,Nginx 是一个 HTTP 服务器,可以将服务器上的静态文件(如HTML、图片)通过 HTTP 协议展现给客户端。

    配置

    server {
        listen 80;   # 端口
        server_name localhost  192.168.1.100;   # 域名
        location / {                   # 代表这是项目根目录
            root /usr/share/nginx/www;          # 虚拟目录
        }
    }
    

    2)反向代理服务器配置

    什么是反向代理?

    客户端本来可以直接通过 HTTP 协议访问某网站应用服务器,如果网站管理员在中间加上一个 Nginx,客户端请求 Nginx,Nginx 请求应用服务器,然后将结果返回给客户端,此时 Nginx 就是反向代理服务器。

    反向代理配置

    server {
        listen 80;
        location / {
            proxy_pass http://192.168.0.112:8080;   # 应用服务器HTTP地址
        }
    }
    

    既然服务器可以直接 HTTP 访问,为什么要在中间加上一个反向代理,不是多此一举吗?反向代理有什么作用?继续往下看,下面的负载均衡、虚拟主机,都基于反向代理实现,当然反向代理的功能也不仅仅是这些。

    3)负载均衡配置

    当网站访问量非常大,也摊上事儿了。因为网站越来越慢,一台服务器已经不够用了。于是将相同的应用部署在多台服务器上,将大量用户的请求分配给多台机器处理。同时带来的好处是,其中一台服务器万一挂了,只要还有其他服务器正常运行,就不会影响用户使用。Nginx 可以通过反向代理来实现负载均衡。

    负载均衡配置

    upstream myapp {
        server 192.168.0.111:8080;   # 应用服务器1
        server 192.168.0.112:8080;   # 应用服务器2
    }
    server {
        listen 80;
        location / {
            proxy_pass http://myweb;
        }
    }
    

    4)虚拟主机配置

    有的网站访问量大,需要负载均衡。然而并不是所有网站都如此出色,有的网站,由于访问量太小,需要节省成本,将多个网站部署在同一台服务器上。

    例如将 www.aaa.com 和 www.bbb.com 两个网站部署在同一台服务器上,两个域名解析到同一个 IP 地址,但是用户通过两个域名却可以打开两个完全不同的网站,互相不影响,就像访问两个服务器一样,所以叫两个虚拟主机。

    虚拟主机配置

    server {
        listen 80 default_server;
        server_name _;
        return 444;   # 过滤其他域名的请求,返回444状态码
    }
    server {
        listen 80;
        server_name www.aaa.com;                # www.aaa.com域名
        location / {
            proxy_pass http://localhost:8080;   # 对应端口号8080
        }
    }
    server {
        listen 80;
        server_name www.bbb.com;                # www.bbb.com域名
        location / {
            proxy_pass http://localhost:8081;   # 对应端口号8081
        }
    }
    

    在服务器 8080 和 8081 分别开了一个应用,客户端通过不同的域名访问,根据 server_name 可以反向代理到对应的应用服务器。

    虚拟主机的原理是通过 HTTP 请求头中的 Host 是否匹配 server_name 来实现的,有兴趣的同学可以研究一下HTTP协议。

    另外,server_name 配置还可以过滤有人恶意将某些域名指向你的主机服务器。

    八、全局变量

    • $args:这个变量等于请求行中的参数,同 $query_string。

    • $is_args:如果已经设置 $args,则该变量的值为 "?",否则为 ""。

    • $content_length:请求头中的 Content-length 字段。

    • $content_type:请求头中的 Content-Type 字段。

    • $document_uri:与 $uri 相同。

    • $document_root:当前请求在 root 指令中指定的值。

    • $host:请求主机头字段,否则为服务器名称。

    • $http_user_agent:客户端 agent 信息。

    • $http_cookie:客户端 cookie 信息。

    • $limit_rate:这个变量可以限制连接速率。

    • $request_method:客户端请求的动作,通常为 GET 或 POST。

    • $remote_addr:客户端的 IP 地址。

    • $remote_port:客户端的端口。

    • $remote_user:已经经过 Auth Basic Module 验证的用户名。

    • $request_body_file:客户端请求主体的临时文件名。

    • $request_uri:请求的 URI,带参数

    • $request_filename:当前请求的文件路径,由 root 或 alias 指令与 URI 请求生成。

    • $scheme:所用的协议,比如 http 或者是 https,比如 rewrite ^(.+)$ $scheme://example.com$1 redirect;。

    • $server_protocol:请求使用的协议,通常是 HTTP/1.0 或 HTTP/1.1。

    • $server_addr:服务器地址,在完成一次系统调用后可以确定这个值。

    • $server_name:服务器名称。

    • $server_port:请求到达服务器的端口号。

    • $request_uri:包含请求参数的原始URI,不包含主机名,如:/foo/bar.php?arg=baz,它无法修改。

    • $uri:不带请求参数的当前 URI,$uri 不包含主机名,如 /foo/bar.html 可能和最初的值有不同,比如经过重定向之类的。它可以通过内部重定向,或者使用 index 指令进行修改。不包括协议和主机名,例如 /foo/bar.html。

    例子:

    访问链接是:http://localhost:88/test/index.html
    网站路径是:/var/www/html

    $host:localhost
    $server_port:88
    $request_uri:http://localhost:88/test/index.html
    $document_uri:/test/index.html
    $document_root:/var/www/html
    $request_filename:/var/www/html/test/index.html
    

    @ 版权声明:本文为CSDN博主「一个有梦想的混子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    @ 原文链接:https://blog.csdn.net/qq_33454884/article/details/89212702

  • 相关阅读:
    Lua弱引用table
    Javascript定义类(class)的三种方法
    双检锁技术
    【翻译】ASP.NET缓存管理
    socket python
    mvc项目
    MSBuild
    阅读glibc源码
    MVC3使用Unity实现依赖注入接口与于实现类自动注册
    C# 指针之美
  • 原文地址:https://www.cnblogs.com/Dm920/p/15743258.html
Copyright © 2020-2023  润新知