• 当前位置: 首 页 > 教育百科 > 学历/技能 > 正文

    (四)企业级高性能 WEB 服务 - Nginx 配置

    :2024年11月10日
    开源极客行

    Nginx 是一款基于 Unix-like 系统的高性能 web 服务器软件,其配置文件主要包括主配置文件(nginx.conf)和子配置文件(conf.d/*.conf)。Nginx 支持多种协议,包括 fastcgi、uwsgi、...

    Nginx 配置文件说明

    Nginx 官方帮助文档://nginx.org/en/docs/
    Nginx 的配置文件的组成部分:
    • 主配置文件:nginx.conf

    • 子配置文件:include conf.d/*.conf

    • fastcgi, uwsgi,scgi 等协议 相关的配置文件( conf/ 目录)

    • fastcgi_params

    • uwsgi_params

    • scgi_params

    • mime.types:支持的 mime 类型,MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型,MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

    • MIME 参考文档:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/MIME_types

    Nginx 配置文件 格式说明

    1. 配置文件: 由'指令'与'指令块'构成

    2. 每条指令以 ; 分号结尾, 指令与值之间以空格符号分隔

    3. 可以将多条指令放在同一行, 用分号分隔即可, 但可读性差, 不推荐

    4. 指令块以{ }大括号将多条指令组织在一起,且可以嵌套指令块

    5. include 语句允许组合多个配置文件以提升可维护性

    6. 使用 # 符号添加注释, 提高可读性

    7. 使用 $ 符号使用变量

    8. 部分指令的参数支持正则表达式

    Nginx 主配置文件的配置指令方式:

    directive value [value2 ...];

    注意

    (1) 指令必须以分号结尾

    (2) 支持使用配置变量

    内建变量: 由 Nginx 模块引入,可直接引用

    自定义变量: 由用户使用 set 命令定义, 格式: set variable_name value;

    引用变量: $variable_name

    主配置文件结构四部分

    // '全局配置段' ( 常用 )

    main block: 主配置段, 即全局配置段, 对 http,mail 都有效

    // '事件驱动相关的配置'

    event {

    ...

    }

    // http/https 协议相关配置段 ( '核心配置段' - 常用 )

    http {

    ...

    }

    # 默认配置文件不包括下面两个块

    # mail 协议相关配置段

    mail {

    ...

    }

    # stream 服务器相关配置段

    stream {

    ...

    }

    默认的 nginx.conf 配置文件格式说明

    [root@centos8 ~] grep -v "#" /apps/nginx/conf/nginx.conf | grep -v "^$"

    # 全局配置端, 对全局生效

    # 主要设置 nginx 的启动用户/组, 启动的工作进程数量, 工作模式, Nginx 的 PID 路径, 日志路径等.

    user nginx nginx;           // 定义启用 worker 进程的身份 '前者 nginx 为用户, 后者 nginx 为用户组'

    worker_processes 4|auto;    // 定义启动工作进程数数量, '一般建议设置和 CPU 核心数一致' ( 进程默认调用内核 epool 实现 IO 多路复用 ) ( '建议使用 auto: 会自动识别系统 CPU 核心数来定义该值' )

    events {                    # events 设置快, 主要影响 nginx 服务器与用户的网络连接, 比如是否允许同时接受多个网络连接, 使用哪种事件驱动模型处理请求, 每个工作进程可以同时支持的最大连接数, 是否开启对多工作进程下的网络连接进行序列化等.

    worker_connections  1024; # 设置单个 nginx 工作进程可以接受的最大并发, 作为 web 服务器的时候最大并发数为worker_connections * worker_processes, 作为反向代理的时候为(worker_connections * worker_processes)/2

    }

    http { # http 块是 Nginx 服务器配置中的重要部分, 缓存、代理和日志格式定义等绝大多数功能和第三方模块都可以在这设置, http 块可以包含多个 server 块, 而一个 server 块中又可以包含多个 location 块, server 块可以配置文件引入、MIME-Type定义、日志自定义、是否启用sendfile、连接超时时间和单个链接的请求上限等。

    include    mime.types;

    default_type application/octet-stream;

    sendfile    on;         # 作为 web 服务器的时候打开 sendfile 加快静态文件传输, 指定是否使用sendfile系统调用来传输文件,sendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝,硬盘 >> kernel buffer (快速拷贝到kernelsocket buffer) >>协议栈。

    keepalive_timeout  65;  # 长连接超时时间, 单位是秒

    server {                # 设置一个虚拟机主机, 可以包含自己的全局快, 同时也可以包含多个 location 模块. 比如本虚拟机监听的端口、本虚拟机的名称和IP配置,多个server 可以使用一个端口,比如都使用80端口提供web服务、

    listen    80;         # 配置 server 监听的端口

    server_name localhost; 本 server 的名称, 当访问此名称的时候 nginx 会调用当前serevr内部的配置进程匹配.

    location / {          # location 其实是 server 的一个指令, 为 nginx 服务器提供比较多而且灵活的指令, 都是在location中提现的,主要是基于nginx接受到的请求字符串,对用户请求的UIL进行匹配,并对特定的指令进行处理,包括地址重定向、数据缓存和应答控制等功能都是在这部分实现,另外很多第三方模块的配置也是在location模块中配置。

    root  html;         # 相当于默认页面的目录名称, 默认是相对路径, 可以使用绝对路径配置.

    index index.html index.htm; # 默认的页面文件名称

    }

    error_page  500 502 503 504 /50x.html; # 错误页面的文件名称

    location = /50x.html {                 # location处理对应的不同错误码的页面定义到/50x.html,这个跟对应其server中定义的目录下。

    root  html;                          # 定义默认页面所在的目录

    }

    }

    # 和邮件相关的配置

    # mail {

    #        ...

    #    }     mail 协议相关配置段

    # tcp代理配置, 1.9 版本以上支持

    # stream {

    #        ...

    #    }    stream 服务器相关配置段

    # 导入其他路径的配置文件

    # include /apps/nginx/conf.d/*.conf

    }

    Main 全局配置

    Nginx 性能优化

    • worker_processes:用于配置 Nginx 生成工作进程的数量,这个是 Nginx 服务器实现并发处理服务的关键所在。

    • worker_cpu_affinity:对于具有多颗 CPU 的服务器,Nginx 通过设置 worker_cpu_affinity 参数,即可轻松实现控制进程平均分配到多颗 CPU 上。

    • worker_priority:定义 nginx 工作进程的优先级,Nginx worker 进程优先级设置,默认 0,优先级由静态优先级和内核根据进程执行情况所做的动态调整( 目前只有 ±5 的调整 )共同决定。nice 值是进程的静态优先级,它的取值范围是 –20~+19,–20 是最高优先级,+19 是最低优先级。因此,如果用户希望 Nginx 占有更多的系统资源,那么可以把 nice 值配置得更小一些,但不建议比内核进程的 nice 值( 通常为 –5 )还要小。

    • worker_rlimit_nofile:表示 Nginx worker 进程 可以打开的最大句柄描述符个数,更改 worker 进程的最大打开文件数限制。如果没设置的话,这个值为操作系统的限制。设置后你的操作系统和 Nginx 可以处理比 ulimit -a 更多的文件,所以把这个值设高,这样 nginx 就不会有 too many open files 问题了。

    • worker_connections:表示每个 worker 进程的最大连接数,默认 1024 个,通过使用 worker_processes 和 worker_connections 可以实际的设置 nginx 的总体最大连接数,比如 worker_processes 设置为 2,worker_connections 设置为1024,那么 nginx 的总体最大连接数就是 2048 个。但是这些连接数,不仅包含了 nginx 和客户端的链接,还包含了 nginx 和被代理的服务端的链接,因此不代表 nginx 的并发能力是 2048,具体设置多少,要根据压测结果确定。

    • accept_mutex:由于我们在 NGINX 中配置了多个 workers,因此我们还应配置影响 worker 的相关指令。events 区域下 accept_mutex 参数 将使每个可用的 worker 进程 逐个接受新连接。默认情况下,该标志设置为 on。

    • multi_accept:使得 NGINX worker 能够在获得新连接的通知时尽可能多的接受连接。此指令的作用是立即接受所有连接放到监听队列中。如果指令被禁用,worker 进程将逐个接受连接。

    错误日志记录配置

    # 错误日志记录配置, 语法: error_log file [debug | info | notice | warn | error | crit | alert | emerg]

    # error_log logs/error.log;

    # error_log logs/error.log notice;

    error_log /apps/nginx/logs/error.log error;

    定义 pid 文件保存路径

    pid       /apps/nginx/logs/nginx.pid;    # 该文件记录着 NGINX 主进程的进程编号

    定义 worker 进程优先级

    worker_priority 0; # 定义 worker 进程优先级, -20~20(19) - 类似 nice 命令定义进程优先级

    所有 worker 进程能打开的文件数量上限

    worker_rlimit_nofile 65536; # 所有 worker 进程能打开的文件数量上限, 包括: Nginx 的所有连接 (例如与代理服务器的连接等) 而不仅仅是与客户端的连接, 另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件数的限制. 最好与 ulimit -n 或者 limits.conf 的值保持一致, 默认不限制

    HTTP 配置块

    // http 协议相关的配置结构

    http {

    ...

    ... # 各 server 的公共配置

    server {    # 每个 server 用于定义一个虚拟主机, 第一个 server 为默认虚拟服务器

    ...

    }

    server {

    ...

    server_name # 虚拟主机名

    root        # 主目录

    alias       # 路径别名

    location [OPERATOR] URL {    # 指定 URL 的特性

    ...

    if CONDITION {

    ...

    }

    }

    }

    }

    djEvTjgxMFhSX2JsNTYyaHJMZXduVFVFMF9XQUN5cUJaNTNENy1lREgyUkQwWmlTNkJmcmJpMFdjMVhhM3VRdGRwTGpkd1JZdGppakFIR1lBRUlDR29Vc0ZfNl9ya2oxaXk1bVZqR01XNzhoSjQ9.jpg

    HTTP 协议配置说明

    http {

    include       mime.types; # 导入支持的文件类型, 相对于 /apps/nginx/conf 目录 - [ cat /apps/nginx/conf/mime.types ]

    default_type  application/octet-stream; # 除 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 logs/access.log main;

    自定义优化参数

    # 自定义优化参数

    sendfile       on;   # 零拷贝技术的一种

    # tcp_nopush     on; # 开启 sendfile 的情况下, 合并请求后统一发送给客户端 - 必须开启 sendfile

    # tcp_nodelay   off; # 开启 keepalived 模式下的连接是否启用 TCP_NODELAY 选项, 为 off 时, 延迟 0.2s 发送, 默认 On 时, 不延迟发送, 立即发送用户响应报文.

    # keepalive_timeout 0;

    keepalive_timeout  65 65; # 设置会话保持时间, 第二个值为响应首部: keep-Alived:timeout=65, 可以和第一个值不同

    # gzip on; # 开启文件压缩

    Server 语句块

    server {

    server_tokens off;    // '隐藏 nginx 具体版本'

    listen       80 default_server; # 设置监听地址和端口,多个虚拟机时当前是否是默认的虚拟主机, default_server 表示是默认主机, 否则排在前面 server 为默认主机.

    server_name localhost; # 设置server name,可以以空格隔开写多个并支持正则表达式, 如:*.wang.com www.wang.* ~^www\d+\.wang\.com$ 示例: .wang.org 相当于 *.wang.org和wang.org

    # charset koi8-r; # 设置编码格式,默认是俄语格式,建议改为utf-8

    # access_log logs/host.access.log main;

    location / {

    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$ { # 以 http 的方式转发 php 请求到指定 web 服务器

    #   proxy_pass   http://127.0.0.1;

    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

    #

    # location ~ \.php$ { # 以fastcgi的方式转发php请求到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 { # 拒绝web形式访问指定文件,如很多的网站都是通过.htaccess文件来改变自己的重定向等功能。

    #   deny all;

    # }

    location ~ /passwd.html {

    deny all;

    }

    }

    # another virtual host using mix of IP-, name-, and port-based configuration

    #

    # server { # 自定义虚拟 server

    #   listen       8000;

    #   listen       somename:8080;

    #   server_name somename alias another.alias;

    #   location / {

    #       root   html;

    #       index index.html index.htm; #指定默认网页文件,此指令由ngx_http_index_module模块提供

    #   }

    #}

    # HTTPS server

    #

    # server { # https 服务器配置

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

    #   }

    #}

    MIME

    # 在响应报文中将指定的文件扩展名映射至 MIME 对应的类型

    include    /etc/nginx/mime.types;

    default_type    application/octet-stream; # 除 mime.types 中的类型外, 指定其它文件的默认 MIME 类型, 浏览器一般会提示下载.

    types {

    text/html html;

    image/gif gif;

    image/jpeg jpg;

    }

    # MIME 参考文档:

    https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_Types

    指定响应报文 Server 首部

    // 隐藏 nginx 主版本号信息

    # 是否在响应报文的 Server 首部显示 nginx 版本

    # server_tokens on | off | build | string;

    [root@centos8 ~] vim /apps/nginx/conf/nginx.conf

    server_tokens off;    # 隐藏 nginx 主版本号信息

    djEvQ1ZHd2NlUTlZM1F0RjlHbkxWaGdMOGYyRTBZTWVteFBmQXRFZEQwSVJnUV9wUzBRQlRCWnRDbE1WX3dXWHZYaGd6MzZpSjhqX0I3NTlyRGZRSDJkSmxfNl9ya2oxaXk1bVZqR01XNzhoSjQ9.jpg

    效果:

    djEvbE1JVGtldUNKeHNzOUkzRkNhbGFUVVdZeFA2WmpOZ1B2RjFPa2FpeFA5N2YtX1ltNzdMaW9MckR0OHR5bEI4Y2RNdUh1dmRHOUhFcmtjLVNKMHZDUkZfNl9ya2oxaXk1bVZqR01XNzhoSjQ9.jpg

    指定字符集

    指定字符集 utf-8,防止网页显示乱码

    UTF-8 万国码

    GB2312 是中国国家标准的简体中文字符集

    # 是否在响应报文中的 Content-Type 显示指定的字符集: 默认 off 不显示

    charset charset | off;

    # 示例

    charset utf-8;  # UTF-8 是世界通用的语言编码 - 无论是中文、还是日文、韩文、阿拉伯文,都可以正常显示

    示例:指定字符集 utf-8,防止网页显示乱码

    [root@centos8 ~] vim /apps/nginx/conf/nginx.conf

    djEvTjgxMFhSX2JsNTYyaHJMZXduVFVFOFd1UXU4Y09zOVlKelJ2MkViR1kzS204eFhrWmVKQmRETl9ReUtYSDZQQkJPUkgxQ1U1d0NjVTRZdkkzMlFZU0ZfNl9ya2oxaXk1bVZqR01XNzhoSjQ9.jpg

    [root@centos8 ~] nginx -t

    [root@centos8 ~] nginx -s reload

    演示效果

    [root@centos8 ~] vim /apps/nginx/html/index.html

    # 当然, 实际上. 前端工程师一般会在 html 文件中就配置好 utf-8 编码字符集格式类型.

    # 因此, 即使我们在 nginx 配置中未定义 utf-8 字符集格式类型. 也不会显示乱码.

    djEvTnpCS05FWnRvblZCc1JrZzRZYlJMREs5cUk2cV9FVFdxbGtVM2tXQzRHRG9xZURXd21mamNuM3hwNmtfcXV5dXU2SzFIU0FhOXN1SC1mOTJ3aE1SNGxfNl9ya2oxaXk1bVZqR01XNzhoSjQ9.jpg

    curl 192.168.80.8 -I

    djEvTjgxMFhSX2JsNTYyaHJMZXduVFVFLS1vUkhpV285LThxZGh0a3JCb054VW1OM0VFZDNzTk5GWVlhcWxHaW9xSDRjQ3dicDZaWjllTWk3RUF6X3diMlZfNl9ya2oxaXk1bVZqR01XNzhoSjQ9.jpg

    完成!
    原文来源:https://mp.weixin.qq.com/s/ojB-FjXmYVAhH1ad2gZ0xA
    [编辑:王振袢 &发表于江苏]
    [我要纠错]

    来源:本文内容搜集或转自各大网络平台,并已注明来源、出处,如果转载侵犯您的版权或非授权发布,请联系小编,我们会及时审核处理。
    声明:江苏教育黄页对文中观点保持中立,对所包含内容的准确性、可靠性或者完整性不提供任何明示或暗示的保证,不对文章观点负责,仅作分享之用,文章版权及插图属于原作者。

    关键词: Nginx 配置文件 说明 Nginx 官方
    有价值
    0
    无价值
    0
    猜您喜欢
    最热文章

    暂不支持手机端,请登录电脑端访问

    正在加载验证码......

    请先完成验证