Nginx - 配置文件 Configuration 详解

⭐ 参考资料:Nginx 新手起步 · OpenResty最佳实践 (gitbooks.io)

一、概述

  1. 配置文件位置(nginx.conf):/usr/local/nginx/conf/etc/nginx/usr/local/etc/nginx

  2. 日志文件位置(access.log 和 error.log):/usr/local/nginx/logs/var/log/nginx

  3. 配置文件结构

    1. 简单指令(simple directives):由名称和参数组成,以空格分隔,以分号(;)结尾
    2. 块指令(block directives):以大括号({})包围的附加指令集合
    3. 上下文(context):大括号内包含其他指令的部分(例如:eventshttpserverlocation
  4. 启动命令

    命令功能
    nginx -s stopfast shutdown(直接关闭)
    nginx -s quitgraceful shutdown(原线程执行完手头任务后关闭)
    nginx -s reloadreloading the configuration file(原线程执行完手头任务,重新开启新的线程执行新任务)
    nginx -s reopenreopening the log files

二、context

1. main(全局配置)

  1. 位置: Nginx 配置文件的顶层,没有被任何其他上下文包裹

  2. 作用: 主要用于定义全局配置,影响整个 Nginx 进程的行为,如 worker 进程数、日志路径等

  3. 常用指令

    指令名功能
    worker_processes定义 Nginx 启动的工作进程数
    error_log定义全局错误日志的位置和日志级别
    pid定义存储 Nginx 进程 ID 的文件位置

2. events(事件处理)

  1. 位置: 通常位于 main 上下文内部

  2. 作用: 配置与网络连接处理相关的选项,包括每个 worker 进程可以处理的最大连接数、连接方法等

  3. 常用指令

    指令名功能
    worker_connections定义每个 worker 进程可以处理的最大连接数
    use指定使用的多路复用模型,如 epoll(Linux)、kqueue(FreeBSD)等

3. http(HTTP 服务)

  1. 位置: 通常位于 main 上下文内部

  2. 作用: 配置与 HTTP 服务相关的选项,包括服务器块、位置块、缓存等。是用于定义 Nginx 作为 Web 服务器的主要配置区域

    常用指令

    指令名功能
    server定义虚拟主机(server block)
    location定义处理特定 URI 路径的配置
    upstream定义上游服务器组,用于负载均衡

4. server(虚拟主机)

  1. 位置: 位于 http 上下文内部

  2. 功能: 定义虚拟主机的配置,每个 server 块表示一个虚拟主机,包括监听端口、域名、处理请求的位置等

  3. 常用指令

    指令名功能
    listen定义虚拟主机监听的端口号和 IP 地址
    server_name定义虚拟主机的域名
    location定义处理特定路径的配置

5. location(请求处理)

  1. 位置: 位于 server 上下文内部

  2. 作用: 定义如何处理特定的 URI 请求路径,可以配置静态文件服务、反向代理、重定向等

  3. 常用指令

    指令名功能
    proxy_pass定义将请求代理到另一个服务器
    root定义静态文件的根目录
    index定义默认的首页文件名

6. upstream(上游服务器组)

  1. 位置: 位于 http 上下文内部

  2. 作用: 定义上游服务器组,用于负载均衡多个后端服务器

  3. 常用指令

    指令名功能
    server定义上游服务器的地址和端口
    least_conn使用最少连接负载均衡策略
    ip_hash使用基于 IP 地址的负载均衡策略

三、http 配置

提供静态数据

  1. 功能:在部署 nginx 的服务器中存储静态文件,用户请求时直接返回本地文件(例如图像或静态 HTML 页面)

  2. 工作流程

    1. 将数据存储到 nginx 服务器的特定目录 /path/to/my/static/resource
    2. 在 nginx 配置文件中,声明资源在服务器中的位置(http.server.location.root)
    3. 在 nginx 配置文件中,声明客户端获取资源的路径(http.server.location)
    4. 客户端访问静态资源路径
  3. 配置方法:自定义 “http 块” 中的 ”server 块”

  4. 配置规则

    参数功能
    http.server提供服务的服务器,通过 “监听的端口号” 和 “服务器名称” 进行区分
    http.server.location配置用户请求的静态文件地址,优先匹配 “最长路径”
    http.server.location.root匹配的本地文件的地址前缀
  5. 示例

    http {
    		
    		server {
    				listen myPort;
    				root /path/to/my/local/resource/of/upstream/server;
    				server_name myServerName;
    				
    				location /my/path/in/url {
    						root /path/to/my/static/resource
    				}
    				
    				location /my/homepage/url {
    						root /my/path/to/homepage;
    				}
    				
    		}
    }
    

动态代理

  1. 功能:接收客户端请求,但是 nginx 自己不处理,而是交给上游服务器(upstream server)处理

  2. 工作流程

    1. 在 nginx 配置文件中,声明一个新的 server ,用于指定上游服务器
    2. 在 nginx 配置文件中,指定上游服务器的完整 “地址+端口号”(http.server.location.proxy_pass)
    3. 在 nginx 配置文件中,声明客户端获取资源的路径(http.server.location)
  3. ⭐ 注意

    • 路径结尾不带 “/” ⇒ Nginx 会保留 location 中匹配到的路径前缀,并将其添加到上游服务器的地址后面
    • proxy_pass 结尾带 “/” ⇒ Nginx 会删除 location 中匹配的路径前缀,只保留剩下的路径部分,并将其直接添加到上游服务器的地址后面
  4. 示例

    1. 用户访问 localhost:8080/upstream1/xxx ,则会由第二个 server 代理到第一个 server,请求发送给 8080 端口并获取 /data/upstream1/xxx 资源
    2. 用户访问 localhost/xxx.gif ,则由第二个 server 从服务器的 /data/images/ 地址获取 /data/images/xxx.gif 资源
    http {
    
        # 模拟的一个远程服务器
    		server {
    		    listen 8080;
    		    root /data/upstream1;
    		    location / {
    		    }
    		}
    
    		# 本地服务器
    		server {
    		    listen 80 default_server;                        # 监听 80 端口,并设置为默认服务器
    		    location /upstream1/ {                           # 代理 /upstream1/ 路径的请求到 localhost 的 8080 端口
    		        proxy_pass http://localhost:8080/;
    		    }
    		
    		    location ~ \\.(gif|jpg|png)$ {                    # 匹配 .gif, .jpg, .png 结尾的请求,并从 /data/images 目录中提供这些文件
    		        root /data/images;
    		    }
    		    
    		    # 反向代理 /yudada/ 路径的请求到 localhost 的 8082 端口
    		    location /yudada/ {
    		        proxy_pass http://localhost:8082/;            # 将所有 /yudada/ 开头的请求代理到 yudada 服务所在地址(http://localhost:8082/)
    		        proxy_set_header Host $host;                  # 传递 "客户端请求的域名" 或 "IP 地址" 给后端服务器
    		        proxy_set_header X-Real-IP $remote_addr;      # 传递 "发起请求的客户端的 IP 地址" 给后端服务器
    		        # 传递 "原始客户端的 IP 地址" 和 "可能由其他代理服务器添加的 X-Forwarded-For 头部信息"
    		        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    		        proxy_set_header X-Forwarded-Proto $scheme;   # 传递客户端请求使用的协议(通常是 http 或 https)
    		        
    		        proxy_http_version 1.1;                       # proxy_http_version 1.1 是为了支持保持连接(keep-alive)
    		        proxy_set_header Connection "keep-alive";     # 保持后端连接
    		        keepalive_timeout 3600s;                      # 设置保持连接时间为 3600 秒(即一个小时)
    		
    						# 设置超时时间
    		        proxy_connect_timeout 90s;                    # 设置连接到后端服务器的超时时间为 90 秒
    		        proxy_send_timeout 90s;                       # 设置发送请求到后端服务器的超时时间为 90 秒
    		        proxy_read_timeout 90s;                       # 设置从后端服务器读取响应的超时时间为 90 秒
    		        
    		        client_max_body_size 100m;                    # 限制上传到后端服务器的请求体最大为 100MB
    		    }
    		}
        
        
    }
    

四、缓存配置

  1. 缓存参数
配置信息配置位置功能
proxy_cache_path最外层用来设置缓存的路径和配置
proxy_cacheserver/location用来启用缓存
use_temp_path=off(推荐)server/location用于指示 Nginx 缓存注定写入缓存的文件时将它们写入同一个目录下,避免在文件系统中不必要的数据拷贝
proxy_cache_use_staleserver/location用于提高可用性,当服务器宕机或繁忙时返回过期数据(避免直接返回错误信息)
proxy_cache_revalidate onserver/location验证缓存有效性,缓存有效则服务器返回304 Not Modified响应,否则从上游服务器获取新的响应并更新缓存
proxy_cache_min_uses 3server/location用于减少冗余缓存,设置缓存最小使用次数为3次,只有当缓存项被请求了至少3次后,才会被缓存起来
proxy_cache_lock onserver/location用于启用缓存锁,保证并发时的缓存击穿,保证只有一个请求到达上游服务器

配置基础缓存

  1. 命令:proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m
    1. /path/to/cache/ 用于缓存的本地磁盘目录
    2. levels=1:2 在 /path/to/cache/ 设置了一个两级层次结构的目录 (1个一级目录和2个二级目录)
    3. keys_zone 设置一个共享内存区 my_cache,大小为 10m,该内存区用于存储缓存键和元数据,有些类似计时器的用途
    4. max_size 设置缓存的上限
    5. inactive 不被访问的情况下能够在内存中保持的时间,默认为 10m
  2. 配置位置:nginx.conf 最外层

启用缓存

  1. 命令:proxy_cache my_cache;
    1. my_cache:基础缓存中配置的共享缓存区 keys_zone=my_cache
  2. 配置位置:location { }

配置反向代理

  1. 命令:proxy_pass http://my_upstream_server;
    1. http://my_upstream_server:代理 nginx 转发的目标服务器地址
  2. 工作流程
    1. 客户端向 nginx 服务器发起请求
    2. nginx 服务器接收请求并依据转发规则发送到 my_upstream_server 上游服务器
    3. my_upstream_server 上游服务器处理请求并将结果返回给 nginx 服务器
    4. nginx 服务器将响应缓存到 my_cache 中
  3. 配置位置:location { }

允许分发过期内容

  1. 命令:proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
  2. 配置位置:location { }
  3. 功能:当 Nginx 收到服务器返回的 error,timeout 或者其他指定的 5xx 错误,并且在其缓存中有请求文件的陈旧版本,则将旧版本发送给客户端

跨硬盘分割缓存

  1. 功能:用来在多个硬盘之间分割缓存,减轻单个缓存路径的负载压力,且不需要建立一个 RAID(磁盘阵列)

  2. 配置位置:最外层

  3. 示例:基于请求 URI 跨越两个硬盘之间均分缓存

    proxy_cache_path /path/to/hdd1 levels=1:2 keys_zone=my_cache_hdd1:10m max_size=10g inactive=60m use_temp_path=off;
    proxy_cache_path /path/to/hdd2 levels=1:2 keys_zone=my_cache_hdd2:10m max_size=10g inactive=60m use_temp_path=off;
    
    # 根据请求URI的哈希值, 50%的概率分配到my_cache_hdd1缓存区域中,另外50%的概率分配到my_cache_hdd2缓存区域中
    split_clients $request_uri $my_cache {
        50% "my_cache_hdd1";
        50% "my_cache_hdd2";
    }
    
    server {
        ...
        location / {
            proxy_cache $my_cache;
            proxy_pass http://my_upstream;
        }
    }
    
  4. URI(Uniform Resource Identifier)

    统一资源标识符,用于唯一标识网络上的资源,通常包括协议类型、主机名、路径等信息

    在HTTP请求中,URI指的是请求的资源路径

  5. RAID(Redundant Array of Independent Disks)

    1. 一种将多个硬盘组合起来形成一个逻辑存储单元的技术,旨在提高数据的性能、容量或冗余度
    2. RAID技术允许将数据分布在多个硬盘上,从而提高了数据的读写速度和容错能力
    3. RAID通常用于服务器和存储系统中,以提供高性能和高可靠性的存储解决方案

Nginx是一个高性能的HTTP和反向代理服务器,常用于静态资源服务、负载均衡、反向代理、缓存等。下面是安装和配置Nginx的详细步骤: 1. 安装Nginx 在Linux系统中,可以使用包管理器安装Nginx,例如在Ubuntu上可以使用以下命令: ``` sudo apt-get update sudo apt-get install nginx ``` 在CentOS上可以使用以下命令: ``` sudo yum install epel-release sudo yum install nginx ``` 2. 配置Nginx Nginx的主要配置文件是`nginx.conf`,可以通过编辑该文件来配置Nginx。 首先,进入Nginx配置文件目录: ``` cd /etc/nginx/ ``` 然后备份`nginx.conf`文件: ``` sudo cp nginx.conf nginx.conf.bak ``` 接着编辑`nginx.conf`文件: ``` sudo nano nginx.conf ``` 在该文件中,可以配置Nginx的监听端口、Web根目录、虚拟主机等。 例如,可以将Nginx监听端口改为80: ``` http { ... server { listen 80; ... } ... } ``` 可以设置Nginx的Web根目录: ``` http { ... server { ... root /var/www/html; ... } ... } ``` 可以配置Nginx的虚拟主机: ``` http { ... server { listen 80; server_name example.com; ... } ... } ``` 3. 检查Nginx配置文件 完成配置后,可以使用以下命令检查Nginx配置文件是否正确: ``` sudo nginx -t ``` 如果配置文件正确,会显示`nginx: configuration file /etc/nginx/nginx.conf test is successful`。 4. 重启Nginx 完成配置并检查无误后,可以使用以下命令重启Nginx: ``` sudo systemctl restart nginx ``` 现在,Nginx已经安装并配置好了。可以通过Web浏览器访问Nginx服务器来测试它是否正常运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值