3、Nginx核心配置
  Eo5oZmyR5Xwy 2023年11月02日 103 0

全局配置

Nginx 的全局配置块位于 nginx.conf 文件的顶部,用于设置全局的 Nginx 配置选项。全局配置块适用于整个 Nginx 服务器,可以用来配置服务器的全局行为和性能优化。 以下是一些常见的 Nginx 全局配置选项: worker_processes:

定义 Nginx 使用的工作进程数。通常,可以设置为 CPU 核心数或者服务器的物理 CPU 数量。例如:

worker_processes auto;  # 自动根据 CPU 核心数设置工作进程数
worker_cpu_affinity 00000001 00000010 00000100 00001000; 
#将Nginx⼯作进程绑定到指定的CPU核⼼,默认Nginx是不进⾏进程绑定的,绑定并不是意味着当前nginx进程独占以⼀核⼼CPU,但是可以保证此进程不会运⾏在其他核⼼上,这就极⼤减少了nginx的⼯作进程在不同的cpu核⼼上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。

image.png

实施nginx进程绑定核心数,如果不进行绑定,nginx进程会在逻辑cpu上进行漂移,造成cpu的频繁切换
将NGINX绑定到特定的核心数是一种性能优化策略,它可以提高NGINX的性能和效率。以下是一些理由解释为什么要绑定NGINX到核心数:

1、避免竞争条件:当NGINX运行在多核系统上时,默认情况下,操作系统可以在可用的任何核心上调度NGINX的工作进程。这可能导致多个工作进程在同一时间竞争相同的资源,例如共享缓存、锁或其他资源,从而导致竞争条件。通过将NGINX绑定到核心数,可以限制每个NGINX工作进程在特定核心上运行,减少竞争条件的可能性。

2、提高缓存命中率:当NGINX用作反向代理或缓存服务器时,绑定到核心数可以增加缓存的命中率。由于绑定了特定的核心,请求和响应可以更快地在该核心的本地缓存中进行处理,从而提高缓存效率。

3、减少上下文切换:在多核系统中,如果NGINX的工作进程频繁地在不同的核心之间切换,会导致上下文切换的开销。上下文切换是从一个核心切换到另一个核心时,需要保存和恢复进程状态的操作。通过绑定NGINX到核心数,可以减少这种上下文切换的开销,提高系统的整体性能。

4、预测性能:将NGINX绑定到核心数可以提高系统的可预测性和一致性性能。通过固定NGINX进程在特定核心上的运行,可以减少不同核心之间的性能差异,从而更好地控制系统的行为和响应时间。

请注意,绑定NGINX到特定的核心数并不总是适用于所有情况。这取决于系统的配置、负载特征和应用程序需求。在决定是否绑定NGINX到核心数时,需要进行测试和评估,以确保获得最佳的性能和资源利用率。

user: 指定 Nginx 运行的用户和用户组。建议使用非特权用户来运行 Nginx,以增加服务器的安全性。例如:

user nginx nginx;  # 使用用户 "nginx" 和用户组 "nginx" 运行 Nginx

error_log: 指定错误日志文件的路径。可以设置为标准输出 stderr,也可以指定具体的日志文件路径。例如:

error_log /var/log/nginx/error.log;
错误⽇志记录配置,语法:error_log file [debug | info | notice | warn | error | crit |
alert | emerg]

pid: 指定保存 Nginx 主进程 ID 的文件路径。例如:

pid /var/run/nginx.pid;
worker_rlimit_nofile 65536; #这个数字包括Nginx的所有连接(例如与代理服务器的连接等),⽽不仅仅是与
客⼾端的连接,另⼀个考虑因素是实际的并发连接数不能超过系统级别的最⼤打开⽂件数的限制.
daemon off; #前台运⾏Nginx服务⽤于测试、docker等环境。
master_process off|on; #是否开启Nginx的master-woker⼯作模式,仅⽤于开发调试场景

events 块: events 块用于配置 Nginx 服务器的事件模型和连接处理。常见的配置选项包括:

worker_connections:指定每个工作进程的最大连接数。

use:指定事件驱动模型,如 epoll、kqueue 或 select。

events {
    worker_connections 1024;
    use epoll;
    accept_mutex on; #优化同⼀时刻只有⼀个请求⽽避免多个睡眠进程被唤醒的设置,on为防⽌被同时唤醒默认
为off,全部唤醒的过程也成为"惊群",因此nginx刚安装完以后要进⾏适当的优化。
    multi_accept on; Nginx服务器的每个⼯作进程可以同时接受多个新的⽹络连接,但是需要在配置⽂件中配
置,此指令默认为关闭,即默认为⼀个⼯作进程只能⼀次接受⼀个新的⽹络连接,打开后⼏个同时接受多个
}

http 块: http 块包含 Nginx 的 HTTP 配置,用于配置 HTTP 服务器的行为和特性。在 http 块中可以配置虚拟主机、HTTP 核心模块、代理、缓存、日志等。

http {
    # HTTP 配置项
}

这些全局配置选项可以在 nginx.conf 文件的全局配置块中进行设置。全局配置块中的选项会影响整个 Nginx 服务器,而服务器块中的选项则只对特定的虚拟主机或监听端口生效。配置完全根据具体需求进行调整和优化,以满足特定的应用场景和性能要

http配置

Nginx 的 http 配置块用于配置 HTTP 服务器的行为和特性,它包含在 nginx.conf 文件中。在 http 配置块中,你可以设置全局 HTTP 配置、定义虚拟主机、配置代理、缓存、负载均衡等。 image.png 以下是 http 配置块的详细配置内容: http 块开头: http 块从 http { 开始,包含了整个 HTTP 配置的内容。在这个块中,你可以设置全局 HTTP 配置和定义多个服务器块。 server 块: server 块用于配置虚拟主机或监听端口。每个 server 块对应一个虚拟主机或一个监听端口。每个服务器块包含以下内容:

listen:指定服务器块监听的端口号。
server_name:定义服务器块对应的域名或 IP 地址,可使用正则。
root:指定该服务器块的根目录,用于存放静态文件。
index:定义默认访问页面的文件名。
location:用于匹配特定的 URL 路径,并设置相应的处理规则,如代理、反向代理、缓存等。
http {
    server {
        listen 80;
        server_name example.com;
        root /var/www/example;
        index index.html;
    }

    server {
        listen 80;
        server_name another.com;
        root /var/www/another;
        index index.php;
    }
}

MIME 类型配置 在 http 块中,你可以通过 types 指令定义 MIME 类型。MIME 类型用于告诉浏览器如何解析不同类型的文件。默认情况下,Nginx 会根据内置的 MIME 类型定义来设置。你可以根据需要添加或覆盖 MIME 类型定义。例如:

http {
    types {
        text/html            html htm shtml;
        text/css             css;
        application/javascript  js;
        image/jpeg           jpeg jpg;
        image/png            png;
    }
}
或者
include mime.types; #导⼊⽀持的⽂件类型
default_type application/octet-stream; #设置默认的类型,会提⽰下载不匹配的类型⽂

配置文件包含: 你可以在 http 块中使用 include 指令来引入其他配置文件,以便组织和管理更复杂的配置。例如,include mime.types; 可以引入 MIME 类型定义的配置文件。 其他配置

#⽇志配置部分
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的情况下,合并请求后统⼀发送给客⼾端。
tcp_nodelay off; #在开启了keepalived模式下的连接是否启⽤TCP_NODELAY选项,当为off时,延迟0.2s发送,默认On时,不延迟发送,⽴即发送⽤⼾相应报⽂。
keepalive_timeout 65 65; #设置会话保持时间
gzip on; #开启⽂件压缩
error_page 500 502 503 504 /50x.html; #定义错误⻚⾯
location = /50x.html {
root html;
}

location ~ \.php$ { #以http的⽅式转发php请求到指定web服务器
proxy_pass http://127.0.0.1;
}

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

核心配置

多域名不同站点

1、创建配置文件目录

mkdir /apps/nginx/conf/conf.d

2、将配置文件路径加载到主配置文件中

vim /apps/nginx/conf/nginx.conf
include /apps/nginx/conf/conf.d/*.conf
#注意:这个最后include需要包含在http模块中,否则会报错

3、新增配置文件

vim /apps/nginx/conf/conf.d/test.conf
server {
 listen 80;
 server_name www.baidu.com;
 location / {
 root /apps/nginx/html/baidu;
 }
}
server {
 listen 80;
 server_name www.qq.com;
 location / {
 root /apps/nginx/html/qq;
}
}
nginx -t测试配置文件正确性

4、重新加载配置文件,并测试

nginx -s reload

image.png

root和alias

root:指定web的家⽬录,在定义location的时候,⽂件的绝对路径等于 root+location; alias:定义路径别名,会把访问的路径重新定义到其指定的路径; image.png image.png image.png

location详细配置

location 是 Nginx 配置中一个非常重要的指令块(block),用于根据请求的 URL 路径或其他条件来定义不同的处理规则。通过 location 块,你可以指定不同的行为,如代理请求、重定向、设置缓存、限制访问等。 location 块可以出现在 http、server 或 location 块中,并且可以嵌套在其他 location 块中。每个 location 块都包含了一组配置指令,用于根据匹配条件来定义请求的处理方式。

= #⽤于标准uri前,需要请求字串与uri精确匹配,如果匹配成功就停⽌向下匹配并⽴即处理请求。
~ #⽤于标准uri前,表⽰包含正则表达式并且区分⼤⼩写,并且匹配
!~ #⽤于标准uri前,表⽰包含正则表达式并且区分⼤⼩写,并且不匹配
~* #⽤于标准uri前,表⽰包含正则表达式并且不区分⼤写,并且匹配
!~* #⽤于标准uri前,表⽰包含正则表达式并且不区分⼤⼩写,并且不匹配
^~ #⽤于标准uri前,表⽰包含正则表达式并且匹配以什么开头
$ #⽤于标准uri前,表⽰包含正则表达式并且匹配以什么结尾
\ #⽤于标准uri前,表⽰包含正则表达式并且转义字符。可以转. * ?等
* #⽤于标准uri前,表⽰包含正则表达式并且代表任意⻓度的任意字符

匹配优先级:=, ^~, 〜/〜*,/
location优先级:(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正
则顺序) > (location 部分起始路径) > (/)

image.pngimage.pngimage.png

Nginx四层访问控制

访问控制基于模块ngx_http_access_module实现,可以通过匹配客⼾端源IP地址进⾏限制

server {
 listen 80;
 server_name www.baidu.com;
 location / {
 root /apps/nginx/html/baidu;
 allow 10.0.7.200;
 deny 10.0.7.201;
 }

image.png image.png

Nginx账⼾认证功能

Nginx 提供了基本的账户认证功能,通常称为 HTTP 基本认证(HTTP Basic Authentication)。这种认证方式是一种简单的用户名和密码认证机制,用于保护网站或特定目录的访问。 基本认证的工作原理是在客户端发送请求时,Nginx 会向客户端返回一个 401 Unauthorized 的状态码,并要求客户端提供用户名和密码。客户端在接收到该响应后,会弹出一个用户名和密码的对话框,然后将用户名和密码以 Base64 编码的形式放入请求头中的 Authorization 字段中再次发送给服务器。 要启用 Nginx 的基本认证功能,需要在配置文件中定义一个 location 块,并在其中使用 auth_basic 和 auth_basic_user_file 指令。auth_basic 指令用于设置认证提示框中显示的信息,而 auth_basic_user_file 指令用于指定保存用户名和密码的文件路径。 要创建账户密码文件用于 Nginx 的基本认证(HTTP Basic Authentication),可以使用 htpasswd 命令。这个命令通常用于生成密码文件,并在其中添加用户名和密码的记录。

sudo apt-get update
sudo apt-get install apache2-utils
sudo htpasswd -c /path/to/.htpasswd username1
server {
    listen 80;
    server_name example.com;
    location /private/ {
        auth_basic "Restricted Access";          # 认证提示框中显示的信息
        auth_basic_user_file /path/to/.htpasswd; # 保存用户名和密码的文件路径
        # 其他配置项...
    }

    # 其他配置项...
}

⾃定义错误⻚⾯

在 Nginx 中,你可以自定义错误页面,以便在服务器遇到特定的 HTTP 错误码时向客户端返回自定义的错误页面。这使得网站更加用户友好,能够提供更有意义的错误信息 image.png

server {
    listen 80;
    server_name example.com;

    # 自定义 404 错误页面
    error_page 404 /custom_404.html;

    # 自定义 500 错误页面
    error_page 500 /custom_500.html;

    # 其他配置项...
}

⾃定义访问⽇志

在 Nginx 中,你可以自定义访问日志格式,以记录特定的访问信息。通过自定义访问日志格式,你可以选择性地记录客户端 IP、访问时间、请求方法、请求的 URI、HTTP 状态码等信息,以便更好地分析和监控服务器的访问情况; 要自定义访问日志,需要在 Nginx 配置中使用 log_format 指令。该指令允许你定义访问日志的格式和内容。

http {
    log_format custom_log '$remote_addr - $remote_user [$time_local] '
                         '"$request" $status $body_bytes_sent '
                         '"$http_referer" "$http_user_agent"';

    server {
        listen 80;
        server_name example.com;

        access_log /path/to/access.log custom_log;

        # 其他配置项...
    }

    # 其他配置项...
}

在上面的配置中,我们定义了一个名为 custom_log 的访问日志格式。这个格式包含了多个变量,如 $remote_addr(客户端 IP 地址)、$remote_user(客户端的用户名,如果启用了基本认证)、$time_local(访问时间)、$request(请求的 URI 和 HTTP 方法)、$status(HTTP 状态码)、$body_bytes_sent(响应体的大小)、$http_referer(来自哪个页面的访问,即引荐页面)、$http_user_agent(客户端的 User-Agent 信息)等。

检测文件是否存在

在 Nginx 的配置文件中,可以使用 try_files 指令来检测文件是否存在。try_files 指令允许你在请求处理过程中按顺序尝试多个文件或 URI,如果文件或 URI 存在,则直接返回该文件或 URI 的内容,如果不存在,则继续按照指定的顺序尝试其他文件或 URI。

server {
    listen 80;
    server_name example.com;

    root /path/to/your/website;

    location /images/ {
        try_files $uri /custom_404.html;
    }

    location /downloads/ {
        try_files $uri /downloads/default.pdf;
    }

    # 其他配置项...
}

try_files $uri $uri/index.html $uri.html =489;
首先,尝试检测请求的 URI 是否对应一个存在的文件。
如果不存在文件,尝试检测是否存在一个名为 index.html 的文件在请求的目录中。
如果仍然不存在文件,尝试检测是否存在一个以 .html 扩展名的文件与请求 URI 相匹配。
如果上述尝试都失败,返回一个状态码为 489 的响应。

⻓连接配置

keepalive_timeout number; #设定保持连接超时时⻓,0表⽰禁⽌⻓连接,默认为75s,通常配置在http字段作为 站点全局配置 keepalive_requests number; #在⼀次⻓连接上所允许请求的资源的最⼤数量,默认为100次

http {
    keepalive_timeout 65s;      # 设置长连接超时时间为 65 秒
    keepalive_requests 100;     # 在一个长连接上允许发送 100 个请求

    server {
        listen 80;
        server_name example.com;

        # 其他配置项...
    }

    # 其他配置项...
}

作为下载服务器配置

http {
    # 其他 http 配置...

    server {
        listen 80;
        server_name download.example.com; # 根据实际情况修改

        location / {
            root /path/to/download/files; # 下载文件的根目录
            autoindex on; # 允许列出目录内容
            autoindex_exact_size off; # 显示文件大小的范围
            autoindex_localtime on; # 显示本地时间而不是 UTC 时间
        }

        # 其他 server 配置...
    }

    # 其他 http 配置...
}
limit_rate rate; #限制响应给客⼾端的传输速率,单位是bytes/second,默认值0表⽰⽆限制
限速与不限速的对⽐:
limit_rate 10k;

上传服务器

将 Nginx 配置为上传服务器需要做一些调整。上传是一个比较复杂的过程,通常涉及到文件的上传和处理,包括安全性考虑。以下是一个基本的 Nginx 配置示例,用于作为简单的上传服务器:

client_max_body_size 1m; #设置允许客⼾端上传单个⽂件的最⼤值,默认值为1m
client_body_buffer_size size; #⽤于接收每个客⼾端请求报⽂的body部分的缓冲区⼤⼩;默认16k;超出此⼤⼩时,其将被暂存到磁盘上的由下⾯client_body_temp_path指令所定义的位置
client_body_temp_path path [level1 [level2 [level3]]];
#设定存储客⼾端请求报⽂的body部分的临时存储路径及⼦⽬录结构和数量,⽬录名为16进制的数字,使⽤hash之后的
值从后往前截取1位、2位、2位作为⽂件名:

其他配置

keepalive_disable none | browser ...; keepalive_disable msie6:禁用旧版的 Internet Explorer(IE6)的 Keep-Alive 功能
limit_except method ... { ... },仅⽤于location限制客⼾端使⽤除了指定的请求⽅法之外的其它⽅法;如get post put delete等
limit_except [method ...] {
    # 允许通过的配置
}

image.png

aio on | off #是否启⽤asynchronous file I/O(AIO)功能,需要编译开启
directio size | off; #操作完全和aio相反,aio是读取⽂件⽽directio是写⽂件到磁盘,启⽤直接I/O,默认为关闭,当⽂件⼤于等于给定⼤⼩时,例如directio 4m,同步(直接)写磁盘,⽽⾮写缓存。
open_file_cache off; #是否缓存打开过的⽂件信息
open_file_cache max=N [inactive=time];
nginx可以缓存以下三种信息:
(1) ⽂件元数据:⽂件的描述符、⽂件⼤⼩和最近⼀次的修改时间
(2) 打开的⽬录结构
(3) 没有找到的或者没有权限访问的⽂件的相关信息
max=N:可缓存的缓存项上限数量;达到上限后会使⽤LRU(Least recently used,最近最少使⽤)算法实现管理
inactive=time:缓存项的⾮活动时⻓,在此处指定的时⻓内未被命中的或命中的次数少于
open_file_cache_min_uses指令所指定的次数的缓存项即为⾮活动项,将被删除
open_file_cache_errors on | off;是否缓存查找时发⽣错误的⽂件⼀类的信息,默认值为off
server_tokens off; #隐藏Nginx server版本。
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  KRsXEGSB49bk   2023年11月24日   37   0   0 Server客户端加载
  OGG2zAst6hx8   2023年11月26日   29   0   0 bootstrapServerkafka
  ymimIgn1vImn   2023年11月13日   15   0   0 ServerWindowsDNS
  zNxK8cIqmu7p   2023年11月19日   31   0   0 ServerAPIPod
  it2nV7RK7uw1   2023年11月28日   75   0   0 DockerServerIP