nginx配置文件解读

在我们使用 Docker 启动 nginx 镜像容器后,就可以进行访问了

[root@Dcpent]# docker run -d --name nginx -p 80:80 nginx:1.18

安装 nginx 只是学习的第一步,下一步便是配置 nginx,进行代理、负载均衡等操作了

配置文件预览

进入 docker 里面,查看 /etc/ngin/nginx.conf 文件 yum 安装的将会把配置文件放在这个地方。index.html 在 /usr/share/nginx/html 

 安装完成后直接进来确实有点打脑壳,不过这又是必须学习的,忍着看一下吧。毕竟强者的道路都是这样一步一步过来的。

1、全局配置参数

        全局配置部分被用于配置对整个server 都有效的参数和前一个章节中的例外格式。全局部分可能包含配置指令,例如, user 和worker_processes ,也包括“节、部分( section )”。例如, events ,这里没有大括号({})包围全局部分。---摘自 《精通Nginx(第二版)》

下面列举常见的全局配置参数

指令说明
user使用这个参数的来配置 worker 进程的用户和组。如果忽略 group,那么 group 的名字等于该参数指定用的用户组
worker_processes指定 worker 进程启动的数量。这些进程用于处理客户的所有连接。选择一个正确的数量取决于服务器环境、磁盘子系统和网络基础设置。一个好的经验法则是设置该参数的值与 CPU 绑定的负载处理器核心的数量相同,并用 1.5~2 之间的乘数作为 I/O 密集型负载。
error_logerror_log 是所有错误写入的文件。如果在其他区段中没有设置其他的 error_log ,那么这个日志文件将会记录所有的错误。该指令的第二个参数指定了被记录的错误级别(debug、info、notice、warn、error、crit、alert、emerg)。注意, dubug 级别的错误只有在编译时配置了 --with-debug 选项时才可以使用
pid设置记录主进程 ID 的文件,这个配置将会付给编译时的默认配置
use该指令用于指示使用什么样的连接方法。这个配置将会覆盖编译时的默认配置,如果配置该指令,那么需要一个 events 区段。通常不需要覆盖,除非是当时编译时默认值随着时间的推移产生错误是才需要被覆盖设置
worker_connection该指令配置一个工作进程能够接受并发连接的最大数。这个连接包括客户连接和向上游服务器的连接,但并不限于此。这对反向代理服务器尤为重要,为了达到这个并发性连接数量,需要在操作系统层面进行一些额外调整。

使用示例

user Dcpnet;

worker_processes 6;

# 错误日志文件 级别:warn
error_log /var/log/nginx/error.log warn;

# 记录主进程ID文件
pid       /var/run/nginx.pid;

events {
    use /dev/poll;
    worker_connection 2048;
}

这一部分在需要放在 nginx.conf 的最前面,后面才是其他的配置。【当然默认的 nginx.conf 就是这样的,可以看上面的截图】

2、include 引入其他的配置

在实际项目中,一般都不是单体应用,一个nginx 需要代理多个域名、服务器。为了避免混淆,每个域名、服务器都有各自的配置文件,最后将整合到一个配置文件中。最终的配置文件中就需要引入其他的配置

语法

include 路径/www_site_com.conf

# 使用通配符
include 路径/*.conf

当然也可以配置块

include 路径/mime.types;

配置完成后,你可以使用命令检查语法是否错误

[root@Dcpnet]# nginx -t -c site.conf

3、server 部分

在配置文件中,以 server 开始的部分被称作“虚拟服务部分”。它描述的是一组根据不同的 server_name 指定逻辑分割的资源,这些虚拟服务相应HTTP 请求,因此他们都包含在 HTTP 部分。

一个虚拟服务器由 listen 和 server_name 指令组合定义 ,其中 listen 指定了一个 IP地址/端口 组合或者是 UNIX 域套接字路径。

    listen addr[:port];
    listen port;
    listen unix:path;

        除了 listen 和 server_name ,还有一些其他的配置

序号listen 指令的参数说明备注
1default server该参数定义这样一个组合:address:port 默认的请求被绑定在此
2setfib该参数为套接字监听设置相应的FIB该参数仅支持FreeBSD ,不支持UNIX 域套接字
3backlog该参数在listen ()的调用中设置backlog 参数调用该参数在FreeBSD 系统中默认值为-1,而在其他的系统中为511
4rcvbuf在套接字监听中,该参数设置SO_RCVBUF 参数
5sndbuf在套接字监昕中,该参数设置SO_SNDBUF 参数
6accept_filter该参数设置接受的过滤器:dataready 或者httpready dataready该参数仅支持FreeBSD
7deferred该参数使用延迟的accept()调用设置TCP_DEFER ACCEPT 选项该参数仅支持Linux
8bind该参数为address :port 套接字对打开一个单独的bind ()调用如果任何其他特定套接字参数被使用,那么一个单独的bind ()将会被隐式地调用
9ipv6only该参数设置IPV6 V60NLY 参数的值该参数只能在一个全新的开始
设置,不支持UNIX 域套接字
10ssl该参数表明该端口仅接受HTTPS 的连接该参数允许更紧凑的配置
11so_keepalive该参数为TCP 监昕套接字配置keepalive

server_name 的默认值为 空字符串,如果没有设置 Host 字段的请求,他会匹配该 server 处理。

server_name 支持通配符

    server_name *.example.com;
    server_name www.example.*;

    # 匹配 *.example.com 也包括自身
    server_name .example.com

正则表达式也适用与 server_name ,但是需要在开头加上 “~” 波浪线

    server_name ~^www(\d+).example\.(com)&;

 对于一个特定的请求,确定哪些虚拟服务器提供该请求的服务时,Nginx 应该遵循下面的逻辑:

  1.  匹配 IP 地址和 listen 指令的端口
  2. 将 HOST 头字段作为一个字符串匹配 server_name 指令
  3. 将 Host 头字段与 server_name 指令值字符串的开始部分做匹配
  4. 将 Host 头字段与 server_name 指令值字符串的结尾部分做匹配
  5.  将 Host 头字段与 server_name 指令值进行正则表达式匹配
  6. 如果所有 Host 头匹配失败,那么将会转向listen 指令标记的 default_server。
  7. 如果所有的 Host 头匹配失败,并且没有 default_server,那么将会转向第一个 server 的 listen 指令。

逻辑[图参考 《精通Nginx(第二版)》]:

      在HTTP 中, server 部分或者 HTTP 配置 context 是可用的, 除非在编译安装 Nginx 时没有包含 HTTP 模块( 也就是使用了一without-http )。这部分控制了 HTTP 模块的方方面面,是使用最多的一个部分。

我们日常配置多的部分还是在 server 里面,下面我们来看一看这里面的配置内容。server 中配置主要分为四个部分:客户端指令、文件IO指令、Hash指令、Socket 指令

3.1 客户端 指令

指令说明
chunked_transfer_encoding在发送给客户端的响应中,该指令允许禁用 http/1.1 标准的块传输编码
client_body_buffer_size为了阻止临时文件写到磁盘,可以通过该指令为客户端请求体设置缓存大小,默认的缓存大小为两个内存页面
client_body_in_file_only用于调试或者是进一步处理客户端请求体。该指令设置为 "on" 能够将客户端请求体强制写入到磁盘文件
client_body_in_single_buffer为了减少复制的操作,使用该指令强制 Nginx 将整个客户端请求体保存在单个缓存中
client_body_temp_path该指令定义一个命令路径用于保存客户端请求体
client_body_timeout该指令指定客户成功读取的两个操作的时间间隔
client_header_buffer_size该指令为客户端请求头指定一个缓存大小,当请求头大于 1KB 时,会用到这个设置
client_header_timeout该超时是读取整个客户端头的时间长度
client_max_body_size该指令定义允许最大的客户端请求头,如果大于这个设置,呢么客户端将会是 413(Request Entity Too Large) 错误
keepalive_disable该指令对某些类型的客户端金庸 keep-alive 功能
keppalive_requests该指令定义在一个 keep-alive 关闭之前可以接受多少个请求
keepalive_timeout该指令指定 keep-alive 连接持续多久。第二个参数也可以设置,用于在响应头中设置 “keepalive” 头
large_client_header_buffers该指令定义最大数量和最大客户端请求头的大小
msie_padding为了填充相应的大小至 512 字节,对于 MSIE 客户端,大于 400 的状态代码会被添加注释以便满足 512 字节,通过启动该命令可以阻止这种行为
msie_refresh对于 MSIE 客户端,该指令可启用发送一个 refresh 头,而不是 redirect

3.2 文件IO 指令

这些指令用于控制 Ngin 如何投递静态文件以及如何管理文件描述符

Http文件I/O指令说明
aio该指令启用异步文件 I/O 。该指令对于现代版本的FreeBSD和所有Linux 发行版都有效。在FreeBSD 系统下, aio 可能被用于sendfile 预加载数据。在Linux 下,则需要 directio 指令,自动禁用 sendfile
directio该指令用于启用操作系统特定的标志或者功能提供大于给定参数的文件。在 Linux 系统下,使用aio 。时需要使用该指令
directio_alignment该指令设置 directio 的算法。默认值为 512 ,通常足够了,但是在 Linux 的 XFS 下推荐增加为4KB
open_file_cache该指令配置一个缓存用于存储打开的文件描述符、目录查询和文件查询错误
open_ file_cache_errors该指令按照 open_file_cache ,启用文件查询错误缰存
open_file_cache_min_usesopen_file_cache 缓存的文件描述符保留在缓存中,使用该指令配置最少使用文件描述符的次数
open_file_cache_valid该指令指定对  open_file_cache 缓存有效性检查的时间间隔
postpone_output该指令指定 Nginx 发送给客户端最小的数值,如果可能的话, 没有数据会发送,直到达到此值
read ahead如果可能的话,内核将预读文件到设定的参数大小。目前支持 FreeBSD 和Linux (Linux 会忽略大小)
sendfile该指令使用sendfile (2 )直接复制数据从一个到另一个文件描述符
sendf ile max chunk该指令设置在一个sendfile (2 )中复制最大数据的大小,这是为了阻止worker “贪婪”

3.3 Hash 指令

Hash 指令控制 Nginx 分配给某些变量多大的静态内存。在启动和重新配置时, Nginx 会计算需要的最小值。在Nginx 发出警告时,只需要调整一个 *_hash_max_size 指令的参数值就可以达到效果。*_has h_bucket_size 变量被设置了默认值,以便满足多处理器缓存行降低检索所需要的检索查找,因此基本不需要改变。

HTTP Hash 指令说明
server_names_hash_bucket_size该指令指定用于保存server_name 散列表大小的“桶”
server_names_hash_max_size该指令指定server_name 散列表的最大大小
types_hash_bucket_ size该指令指定用于存储散列表的“桶”的大小
types_hash_max_size该指令指定散列类型表的最大大小
variables_hash_bucket_size该指令指定用于存储保留变量“桶”的大小
variables_hash_max_size该指令指定存储保留变量最大散列值的大小

3.4 Socket 指令

Socket 指令描述了Nginx 如何设置创建TCP 套接字的变量选项。

HTTP socket 指令说明
lingering_close该指令指定如何保持客户端的连接,以便用于更多数据的传输
lingering_ time在使用 lingering_close 指令的连接中,该指令指定客户端连接为了处理更多的数据需要保持打开连接的时间
lingering_ timeout结合lingering_close ,该指令显示Nginx 在关闭客户端连接之前,为获得更多数据会等待多久
reset_timedout_connection使用这个指令之后,超时的连接将会被立即关闭,释放相关的内存。默认的状态是处于FIN_WAITl ,这种状态将会一直保持连接
send lowat如果非零, Nginx 将会在客户端套接字尝试减少发送操作
send timeout该指令在两次成功的客户端接收响应的写操作之间设置一个超时时间
tcp_nodelay启用或者禁用 TCP_NODELAY 选项,用于keep-alive 连接
tcp_nopush仅依赖于 sendfile 的使用。它能够使得Nginx 在一个数据包中尝试发送响应头以及在数据包中发送一个完整的文件

3.5 示例配置

http {
    include /opt/local/etc/nginx/mine.typel;
    
    # 该指令设置响应的默认MIME 类型。如果文件的MIME 类型不能被 types 指令指定的类型正确地匹配,那么将会使用该指令指定的类型
    default_type application/octet-stream;

    # 该指令使用sendfile直接复制数据从一个到另一个文件描述符
    sendfile on;
    
    # 仅依赖于sendf ile 的使用。它能够使得Nginx 在-个数据包中尝试发送响应头以及在数据包中发送一个完整的文件
    tcp_nopush on;

    # 启用或者禁用TCP NODELAY 选项,用于keep-alive 连接
    tcp_nodelay on;

    # 该指令指定keep-alive 连接持续多久。第二个参数也可以设置,用于在响应头中设置“ keepalive ”头
    keepalive_timeout 65;

    # 该指令指定server name 散列表的最大大小
    server_name_hash_max_size 1024;
}

4、location

location 指令可以用在虚拟服务器server 部分,井且意味着提供来自客户端的URI 或者内部重定向访问。除少数情况外, location 也可以被嵌套使用,它们被作为特定的配置尽可能地处理请求。

定义:

server {

    # 定义
    location [modifier] url {
        # ...
    }    

    # 命名 location
    location @name {
        # ...
    }

}

命名location 仅对内部访问重定向,在进入一个location 之前,它会保留被请求的 URI 部分。命名location 只能够在server 级别定义。

location 搭配下面的修饰符能达到不同的效果

localtion 修饰符处理方式
=该修饰符使用精确匹配并且终止搜索
~该修饰符使用区分大小写的正则表达式匹配
~*该修饰符使用不区分大小写的正则表达式匹配
^~如果该 location 是最佳的匹配,那么对于匹配这个 location 的字符串, 该修饰符不再进行正则表达式检测。注意,这不是 个正则表达式匹配,它 的目的是优先于正则表达式的匹配

当一个请求进入时,URI 将会被检测匹配一个最佳的 location

  • 没有正则表达式的 location 被作为最佳的匹配,独立含有正则表达式的 location 顺序。
  • 在配置文件中按照查找顺序进行正则表达式匹配。在查找到第一个正则表达式匹配之后结束查找。由这个最佳的 location 提供请求处理。

命令 location 尽可以在内部重定向的请求中使用。

location 指令说明
alias该指令定义 location 的其他名字,在文件系统中能够找到。如果 location 指定了 个正则表达式, alias 将会引用正则表达式中定义的 捕获 alias 指令替代 location 中匹配的 URI 部分,没有匹配的部分 将会在文件系统中搜索。当配置改变 点,配置中使用 alias 指令则会有 脆弱的表现,因此推荐使用 root ,除非是为了找到文件而需要修改 URI
internal该指令指定 个仅用于内部请求的 location (其他指定定义的重定向、 rewrite 请求、 error 请求等〉
limi t _except该指令限定 location 可以执行的 HTTP 操作( GET 也包括 HEAD)

基本的内容就介绍到这里,后期我会进行对本文章再次修复,谢谢读者!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值