学而实习之 不亦乐乎

Nginx 基础配置(二):常见配置

2021-11-15 08:34:47

一、常见配置注解

user www www;                                # 定义运行 nginx 的用户以及用户组
worker_processes 2;                            # nginx 进程数            
#worker角色的工作进程的个数,master进程是接收并分配请求给worker处理。这个数值简单一点可以设置为cpu的核数
#查看CPU核数:grep ^processor /proc/cpuinfo | wc -l,如果开启了 ssl 和 gzip 更应该设置成与逻辑CPU数量一样甚至为2倍,可以减少I/O操作。
#ps -ef | grep nginx,可以看到有一个master进程,多个work进程,work进程数在这里配置

worker_cpu_affinity auto;                    # 配置 nginx 进程的 CPU 亲缘性
error_log /var/log/nginx/error.log info;    # 定义全局错误日志的类型,默认为 error ,错误日志路径
worker_rlimit_nofile 51200;                    # 一个 worker 进程最多能打开的文件数量
#worker进程的最大打开文件数限制。如果没设置的话,这个值为操作系统的限制。设置后你的操作系统和Nginx可以处理比“ulimit -a”更多的文件

pid /var/run/nginx.pid;                        # 进程文件
#进程号,可用于杀进程重启等,不用ps -ef 查询了。

worker_priority -10;                        # 在 Linux 系统下资源使用的优先级
worker_shutdown_timeout 30;                    # 若在 30s 内 Nginx 无法“平滑”退出,则强行关闭进程。

events {
    
    use epoll;                                # epoll事件模型,用在 Linux 2.6 以上版本内核的高性能网络 I/O 上
    #如果是 FreeBSD,则用 kqueue 模型

    worker_connections 51200;                # 单个进程的最大连接数(整个 Nginx 的最大连接数 = 单个进程的最大连接数 X 进程数)
    #worker进程同时打开的最大连接数。系统连接数有限制,所以设置不切实际的高没什么好处,不要超过上面的worker_rlimit_nofile值
}

http {
    include mime.types;                        # 设定mime类型,即文件扩展名与文件类型映射表
    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"';

    client_header_buffer_size 1k;            # 设置用户请求头所使用的 buffer 的大小
    large_client_header_buffers 4 4k;        # 当默认的缓冲区大小不够用时,就会使用此参数
    server_names_hash_bucket_size 128;        # 设置 server_names 散列表的桶的大小,在域名比较多的情况下需要调整这个值

    gzip on;                                # 开启gzip压缩 
    gzip_comp_level 6;                        # 设置 gzip 压缩等级,1 最小,但处理速度最快;9 最大,但处理速度最慢(传输快但比较消耗cpu)
    gzip_min_length 1k;                        # 大于1k才压缩
    gzip_buffers 4 8k;                        # 设置系统需要多大的缓存用于存储 gzip 的压缩结果数据流。4 8k代表以8k为单位,原始数据大小以 8k 为单位的 4 倍申请内存。
    gzip_types text/plain text/css text/xml text/javascript application/xml application/json;
    #匹配mime类型进行压缩,无论是否指定, text/html 类型总是会被压缩的
    
    access_log logs/access.log main;        #访问日志路径

    sendfile on;                            # 启用 sendfile() 函数,开启高效文件传输模式
    # sendfile 指令指定 nginx 是否调用 sendfile() 函数来输出文件,减少用户空间到内核空间的上下文切换。
    # 对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。

    tcp_nopush on;                            # 设置调用tcp_cork方法,为了防止网络阻塞,需要开启 sendfile
    #在一个数据包里发送所有头文件。tcp_nopush = on 会设置调用tcp_cork方法。
    #默认on,结果就是数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。
    #tcp_nodelay on;                        # 和指令tcp_nopush互斥,不缓存,立刻发送数据包。为了防止网络阻塞,需要开启 sendfile

    keepalive_timeout 65;                    # 长连接超时时间,单位是秒。
    # 服务器将在这个超时时间过后关闭链接。所以文件上传超过65s没有成功就失败了。
    
    client_max_body_size 10m;                #允许客户端请求的最大单文件字节数。如果有上传较大文件,请设置它的限制值    
    client_body_buffer_size 32K;            #缓冲区代理缓冲用户端请求的最大字节数
    client_body_timeout 60;                    #设置请求体的超时时间
    client_header_timeout 30;                #设置请求头的超时时间

    server_tokens off;                        #关闭在错误页面中的nginx版本数字,隐藏版本的bug
    send_timeout 10;                        #用于指定响应客户端的超时时间。
    #用于指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接。

    upstream backend {    # upstream块,weight 代表权重
        server 192.168.1.12:8081 weight=3;
        server 192.168.1.13:8081 weight=2;
        # 权重越高,请求的比例越高
    }

    server {
        listen 80;
        server_name www.xx.com;

        access_log /var/log/nginx/access_log main;
        charset koi8-r;

        location / {
            proxy_pass http://backend;
            proxy_redirect off;
            proxy_set_header Host $host;    #设置header, 内容为host
            proxy_set_header X-Real-Ip $remote_addr;
            #后端服务器通过 X-Forwarded-For 获取用户的真实 IP 地址
            #X-Forwarded-For是用于记录代理信息的,每经过一级代理(匿名代理除外)代理服务器都会把这次请求的来源IP追加在X-Forwarded-For中
            #如果只有一层代理,这两个头的值就是一样的
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        }

        error_page 404 /404.html;            # 对后端服务器抛出的错误 404 进行页面重定向

        location /404.html {

            root /spool/www;                # 文件路径

        }

        location ~* \.(jpg|jpeg|gif)$ {
            root /spool/www;
            expires 30d;                    # 浏览器保留缓存的时间,如有 CDN,则 CDN 也会进行缓存
        }
    }
}

二、常见配置技巧

1.user
默认是 nobody,会导致权限问题,一般会使用低于 root 级别的用户(如 www 等),并在 Linux 下禁止用户通过 SSH 登录服务器,以提高安全性。

2.worker_processes
代表 worker 进程数,一般情况下建议和服务器的 CPU 核心数相同;也可以使用 worker_processes auto (Nginx 1.2.5版本之后),它会自动根据 CPU 核心数启动进程。实际应用中,需要考虑服务器的分配,避免因进程启动过多导致过多的上下文切换。

3.worker_cpu_affinity auto
在 1.9.10 中添加,表示可以根据服务器的 CPU 核心数自动设置 CPU 亲缘性,以提升 Nginx 性能。

4.error_log & access_log
关于日志记录的配置。如果将 error_log 配置为 error 级别,可以减少不必要的日志记录;如果是测试环境可以设置为 info 级别。配置日志记录需要考虑硬盘的独立性,不要使用 Linux 的根分区,以避免出现大量 I/O 影响 Linux 服务器的吞吐能力,要单独挂载到一个磁盘上,使用独立 I/O 。
另外,需要注意硬盘的使用寿命,关注 message 的日志,定期检查硬盘(Nginx 在记录日志时是异步处理的,因此不会因为硬盘问题导致请求异常,但会影响日志记录)。

5.worker_priority
配置 Nginx 在 Linux 服务器上使用资源的优先级,作为反向代理服务,Nginx 应该拥有极高的优先级,因此建议配置为 -10.

6.gzip_comp_level
配置压缩等级,等级最高为 9 ,等级越高压缩后的文件越小,但是消耗的 CPU 资源也会越多。经测试,文件压缩等级为 7 和 9时,在文件大小上只有细微的差别,一般用 5 ~ 7 的等级就可以了。

7.upstream 块
配置后端服务器,可以结合 proxy_next_upstream 等指令进行大量优化

8.error_page
对错误进行重定向,在捕获后端服务器错误的状态码后,将请求重定向到其他位置,如友好的提示页面。

9.location & root
通过 root 路径可以读取静态文件,在 Nginx 1.7.11 版本之前,当 Nginx 读取硬盘文件时,都是进行阻塞型操作;后来引入了线程池,为读取硬盘文件提供了非阻塞型的操作,极大的提升了硬盘 I/O 的速度,也提升了 proxy_cache 的缓存能力。

Nginx 的常见配置在使用中有着不同的变化,可以在 Nginx 的官方 Wiki 中查看。