Nginx 基本应用

1. Nginx 介绍

Nginx 是一款开源的、跨平台的、高性能的 Web 服务器、反向代理服务器以及负载均衡器。它因其轻量级、稳定性和高并发处理能力,在全球范围内得到了广泛应用。Nginx作为当今火爆的、高性能的http及反向代理服务,不管前端还是后端,都需要去全面了解、学习和实操。

下载地址:https://nginx.org/en/download.html

Nginx 基本应用

为了有一个全面的认知,接下来我们先来看看 Nginx 的架构以及一些特点:

  • 处理请求响应快(异步非阻塞I/O,零拷贝,mmap,缓存机制)
  • 扩展性好(模块化设计)
  • 内存消耗低(异步非阻塞,多阶段处理)
  • 具有很高的可靠性(无数次的生产验证,很多头部公司都在用)
  • 热部署
  • 高并发连接(事件驱动模型,多进程机制)
  • 自由的BSD许可协议(可以自己修改代码后发布,包容性极强)

2. Nginx 模块组成

Nginx服务由N多个模块组成,每个模块就是一个功能,每个模块只负责自身的功能,所以说对于“高内聚,低耦合”的编程规则,在Nginx身上可谓体现的淋漓尽致。

Nginx 基本应用

  • 核心模块:是Nginx 服务器正常运行必不可少的模块,提供错误日志记录、配置文件解析、事件驱动机制、进程管理等核心功能。
  • 标准HTTP模块:提供 HTTP 协议解析相关的功能,如:端口配置、网页编码设置、HTTP 响应头设置等。
  • 可选HTTP模块:主要用于扩展标准的 HTTP 功能,让Nginx能处理一些特殊的服务,如:Flash 多媒体传输、解析 GeoIP 请求、SSL 支持等。
  • 邮件服务模块:主要用于支持 Nginx 的邮件服务,包括对 POP3 协议、IMAP 协议和 SMTP 协议的支持。
  • 第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,如:Json 支持、Lua 支持等。
Nginx模块名称 模块作用
ngx_http_access_module 四层基于IP的访问控制,可以通过匹配客户端源IP地址进行限制
ngx_http_auth_basic_module 状态页,使用basic机制进行用户认证,在编译安装nginx的时候需要添加编译参数--withhttp_stub_status_module,否则配置完成之后监测会是提示语法错误
ngx_http_stub_status_module 状态统计模块
ngx_http_gzip_module 文件的压缩功能
ngx_http_gzip_static_module 静态压缩模块
ngx_http_ssl_module nginx 的https 功能
ngx_http_rewrite_module 重定向模块,解析和处理rewrite请求
ngx_http_referer_module 防盗链功能,基于访问安全考虑
ngx_http_proxy_module 将客户端的请求以http协议转发至指定服务器进行处理
ngx_stream_proxy_module tcp负载,将客户端的请求以tcp协议转发至指定服务器处理
ngx_http_fastcgi_module 将客户端对php的请求以fastcgi协议转发至指定服务器助理
ngx_http_uwsgi_module 将客户端对Python的请求以uwsgi协议转发至指定服务器处理
ngx_http_headers_module 可以实现对头部报文添加指定的key与值
ngx_http_upstream_module 负载均衡模块,提供服务器分组转发、权重分配、状态监测、调度算法等高级功能
ngx_stream_upstream_module 后端服务器分组转发、权重分配、状态监测、调度算法等高级功能
ngx_http_fastcgi_module 实现通过fastcgi协议将指定的客户端请求转发至php-fpm处理
ngx_http_flv_module 为flv伪流媒体服务端提供支持

3. 目录及配置文件解读

Nginx 基本应用 Nginx 基本应用

3.1 nginx.conf 配置文件

Nginx 基本应用

nginx.conf 这个文件是 nginx 的核心配置文件,内容由三部分组成,分别为全局块、events块和http块,格式如下:

全局模块
event模块
http模块
    upstream模块
    
    server模块
        location块
        location块
        ...
    server模块
        location块
        location块
        ...
    ...

各模块的功能作用如下描述:

  • 全局模块:配置影响nginx全局的指令,比如运行nginx的用户名,nginx进程pid存放路径,日志存放路径,配置文件引入,worker进程数等。
  • events块:配置影响nginx服务器或与用户的网络连接。比如每个进程的最大连接数,选取哪种事件驱动模型(select/poll epoll或者是其他等等nginx支持的)来处理连接请求,是否允许同时接受多个网络连接,开启多个网络连接序列化等。
  • http块:可以嵌套多个server、配置代理、缓存、日志格式定义等绝大多数功能和第三方模块的配置。如:文件引入、mime-type定义、日志自定义、是否使用sendfile传输文件、连接超时时间、单连接请求数等。
  • server块:配置虚拟主机的相关参数,比如域名、端口等等,一个http中可以有多个server。
  • location块:配置url路由规则。
  • upstream块:配置上游服务器的地址以及负载均衡策略和重试策略等等。

Nginx 的配置很灵活,支持include配置文件,如果我们的域名都配置到nginx.conf,这个文件就会比较乱,影响管理和阅读,所以直接拆分出来,分成不同的配置文件。

这种方式的好处是:我们可以编辑主配置文件 nginx.conf 来修改Nginx的全局配置,也可以在 conf.d 目录中创建新的配置文件为不同的虚拟主机或网站定义不同的配置。

即在主配置文件nginx.conf文件中增加:include conf.d/*.conf,此处的 * 号可以一次性添加conf.d文件夹中的全部配置。

3.2 location 路由匹配规则

Nginx根据用户请求的URI来匹配对应的location模块,匹配到哪个location,请求将被哪个location块中的配置项所处理。
location语法格式:

location [修饰符] URI {
    ...
}

常见匹配规则如下:

修饰符 作用
无修饰符的前缀匹配,匹配前缀就是 配置的url,比如 /aaa
= 精确匹配
~ 正则表达式模式匹配,区分大小写
~* 正则表达式模式匹配,不区分大小写
^~ ^~ 类型的前缀匹配,类似于无修饰符前缀匹配,不同的是,如果匹配到了,那么就停止后续匹配。

^ 表示“非”,~ 表示“正则”,字符意思是:不会继续匹配正则。

/ 通用匹配,任何请求都会匹配到(只要你域名对,所有请求通吃!)

以上规则简单总结就是优先级从高到低依次为(序号越小优先级越高):

1. location = # 精准匹配
2. location ^~ # 带参前缀匹配
3. location ~ # 正则匹配(区分大小写)
4. location ~* # 正则匹配(不区分大小写)
5. location /a # 普通前缀匹配,优先级低于带参数前缀匹配
6. location / # 任何没有匹配成功的,都会匹配到这里处理

3.2.1 前缀匹配(无修饰符)

这种方式最常用:

location /api/{
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://localhost:10081/;
}

3.2.2 前缀匹配(^~)

^~ 表示 uri 以某个字符串开头:

location ^~ /aaa/ {
    default_type text/plain;
    return 200 "hello";
}
#curl http://127.0.0.1:10080/aaa/bbb

3.2.3 正则匹配(~ 区分大小写)

location  ~ ^/document$ {
    default_type text/plain;
    return 200 "hello";
}
#curl http://127.0.0.1:10080/document

3.2.4 正则匹配(~* 不区分大小写)

location  ~* ^/document$ {
    default_type text/plain;
    return 200 "hello";
}

#curl http://127.0.0.1:10080/document
#curl http://127.0.0.1:10080/DOCUMENT

3.2.5 通用匹配( / )

通用匹配使用一个 / 表示,可以匹配所有请求,一般nginx配置文件最后都会有一个通用匹配规则,当其他匹配规则均失效时,请求会被路由给通用匹配规则处理,如果没有配置通用匹配,并且其他所有匹配规则均失效时,nginx会返回404错误。

location / {
    root   html;
    index  index.html index.htm;
}

4. Nginx 常见应用场景

  • Web 服务器
  • 反向代理
  • 负载均衡
  • HTTPS 配置
  • 缓存
  • 限流
  • 压缩
  • 黑/白名单
  • 动静分离
  • 防盗链

4.1 Web服务器

Nginx可以作为一个轻量级的Web服务器,处理和响应HTTP请求。它支持静态文件的快速传输,并且能够处理大量的并发连接。
Web服务器配置:

server {
    listen       10080;
    server_name  localhost;

    # 配置根目录以及默认页面
    location / {
        root   html;
        index  index.html index.htm;
    }
}

4.2 反向代理

使用一台代理服务器(下图中的深色服务器)对底层的应用服务器(下图中的浅色服务器)进行代理。将他们的地址信息对客户端屏蔽,客户端只需要访问代理服务器即可,代理服务器会将请求转发给底层的真正起作用的应用服务器。但在客户端眼里,服务器只有唯一的一台,就是代理服务器。

反向代理 代理的是服务器,正向代理是代理的客户端。

Nginx 基本应用

反向代理配置:

http {
	server {
	    listen 10080;
	    server_name www.a1.com;
	    location / {
		proxy_pass http://127.0.0.1:10081;
	    }
	}
	
	server {
	    listen 10080;
	    server_name www.a2.com;
	    location / {
		proxy_pass http://127.0.0.1:10082;
	    }
	}
}

4.3 负载均衡

Nginx可以将客户端请求分发到多个后端服务器上,实现负载均衡。它可以根据不同的策略(如轮询、IP哈希、最少连接数等)将请求分发到不同的服务器上,以达到优化资源利用和提高系统性能的目的。

例如:把 www.a3.com 均衡到本机不同的端口,也可以均衡到不同的地址上。

负载均衡配置:

http {
	upstream myserver {
            #ip_hash;
            server 127.0.0.1:10081 weight=3;
            server 127.0.0.1:10082;
	}
	
	server {
     	    listen 10080;
     	    server_name www.a3.com;
     	    location / {
        	proxy_pass http://myserver;
     	    }
    }
}

4.3.1 Nginx 常用的负载策略

负载策略 描述 特点
轮询 默认方式 1. 每个请求会按时间顺序逐一分配到不同的后端服务器

2. 在轮询中,如果服务器down掉了,会自动剔除该服务器

3. 缺省配置就是轮询策略

4. 此策略适合服务器配置相当,无状态且短平快的服务使用

weight 权重方式 1. 在轮询策略的基础上指定轮询的几率

2. 权重越高分配到的请求越多

3. 此策略可以与least_conn和ip_hash结合使用 4. 此策略比较适合服务器的硬件配置差别比较大的情况

ip_hash 依据ip的hash值来分配 1. 在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)

2. ip_hash不能与backup同时使用

3. 此策略适合有状态服务,比如session存储信息

4. 当有服务器需要剔除,必须手动down掉

least_conn 最少连接方式 1. 此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况
fair(第三方) 响应时间方式 1. 根据后端服务器的响应时间来分配请求,响应时间短的优先分配

2. Nginx本身不支持fair,如果需要这种调度算法,则必须安装upstream_fair模块

url_hash(第三方) 依据URL分配方式 1. 按访问的URL的哈希结果来分配请求,使每个URL定向到一台后端服务器

2. Nginx本身不支持url_hash,如果需要这种调度算法,则必须安装Nginx的hash软件包

4.4 HTTPS 配置

Nginx可以作为SSL/TLS终端代理,对外提供HTTPS服务。它可以负责SSL/TLS握手、证书验证等操作,将加密的请求转发到后端服务器,减轻后端服务器的压力。

HTTPS 配置:

server {
    listen       10443 ssl;
    server_name  localhost;

    ssl_certificate      cert/test.pem;
    ssl_certificate_key  cert/test.key;

    location / {
        root   html;
        index  index.html index.htm;
    }
}

4.5 缓存

Nginx代理缓存可以在某些场景下有效的减少服务器压力,让请求快速响应,从而提升用户体验和服务性能。

指令名称 作用解释 语法 默认配置 示例 作用域
proxy_cache 设置是否开启对后端响应的缓存 proxy_cache zone | off; proxy_cache off; proxy_cache mycache; # 规定开启nginx缓存并且缓存名称为: mycache http, server, location
proxy_cache_valid 配置什么状态码可以被缓存,以及缓存时长 proxy_cache_valid [code ...] time; 没有默认值 proxy_cache_valid 200 304 2m; # 对于状态为200和304的缓存文件,缓存时间是2分钟 http, server, location
proxy_cache_key 设置缓存文件的 key proxy_cache_key string; proxy_cache_key schemeschemeschemeproxy_host$request_uri; proxy_cache_key "hosthosthostrequest_uri $cookie_user"; # 使用host +请求的uri以及cookie拼接成缓存key http, server, location
proxy_cache_path 指定缓存存储的路径,文件名为cache key的md5值,然后多级目录的话,根据level参数来生成,key_zone参数用来指定在共享内存中缓存数据的名称和内存大小,比如keys_zone=mycache:100m,inactive用来指定缓存没有被访问后超时移除的时间,默认是10分钟,也可以自己指定比如inactive=2h ;max_size 用来指定缓存的最大值,超过这个值则会自动移除最近最少使用(lru淘汰算法)的缓存 这个指令对应的参数很多,具体见官网:proxy_cache_path proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [min_free=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time]; proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:128m inactive=3d max_size=2g; # 设置缓存存放的目录为/data/nginx/cache,并设置缓存名称为mycache,大小为128m, 三天未被访问过的缓存将自动清除,磁盘中缓存的最大容量为2GB。 http
proxy_cache_bypass 定义不从缓存中获取响应数据的条件。如果字符串参数中至少有一个值不为空且不等于" 0 ",则不会从缓存中获取响应: proxy_cache_bypass string ...; 没有默认值 proxy_cache_bypass cookienocachecookie_nocache cookienocachearg_nocache$arg_comment; http, server, location
proxy_cache_min_uses 指定某一个相同请求在几次请求之后才缓存响应内容 proxy_cache_min_uses number; proxy_cache_min_uses 1; proxy_cache_min_uses 3; 规定某一个请求在第3次之后才走nginx缓存 http, server, location
proxy_cache_use_stale 指定后端服务器在返回什么状态码的情况下可以使用过期的缓存 proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 ... |off ; proxy_cache_use_stale off; proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504; # 规定服务在出现error timeout,以及502,503,504时可使用过期缓存 http, server, location
proxy_cache_lock 默认不开启,开启后若出现并发重复请求,nginx只让一个请求去后端读数据,其他的排队并尝试从缓存中读取; proxy_cache_lock on |off; proxy_cache_lock off; proxy_cache_lock on; # 开启缓存锁 http, server, location
proxy_cache_lock_timeout 等待缓存锁(proxy_cache_lock)超时之后将直接请求后端,且结果不会被缓存 proxy_cache_lock_timeout time; proxy_cache_lock_timeout 5s; proxy_cache_lock_timeout 6s; # 等待缓存锁超时(6ms)之后将直接请求后端,结果不会被缓存。 http, server, location
proxy_cache_methods 如果客户端请求方法在该指令中,则响应将被缓存。“GET”和“HEAD”方法总是被添加到列表中,尽管建议显式地指定它 proxy_cache_methods GET|HEAD |POST ...; proxy_cache_methods GET HEAD; proxy_cache_methods GET HEAD PUT POST; # 规定 可缓存的方法有 :get head put post http, server, location
... ... ... ... ... ...

配置文件:

http{
    ...
    # 指定缓存存放目录为/usr/local/nginx/test/nginx_cache_storage,并设置缓存名称为mycache,大小为64m, 1天未被访问过的缓存将自动清除,磁盘中缓存的最大容量为1gb
    proxy_cache_path /usr/local/nginx/test/nginx_cache_storage levels=1:2 keys_zone=mycache:64m inactive=1d max_size=1g;
    ...
    
    server{
        ...
        #  指定 username 参数中只要有字母 就不走nginx缓存  
        if ($arg_username ~ [a-z]) {
             set $cache_name "no cache";
        }
        
        location  /interface {
             proxy_pass http://myserver/;
             # 使用名为 mycache 的缓存空间
             proxy_cache mycache;
             # 对于200 206 状态码的数据缓存2分钟
             proxy_cache_valid 200 206 1m;
             # 定义生成缓存键的规则(请求的url+参数作为缓存key)
             proxy_cache_key $host$uri$is_args$args;
             # 资源至少被重复访问2次后再加入缓存
             proxy_cache_min_uses 3;
             # 出现重复请求时,只让其中一个去后端读数据,其他的从缓存中读取
             proxy_cache_lock on;
             # 上面的锁 超时时间为4s,超过4s未获取数据,其他请求直接去后端
             proxy_cache_lock_timeout 4s;
             # 对于请求参数中有字母的 不走nginx缓存
             proxy_no_cache $cache_name; # 判断该变量是否有值,如果有值则不进行缓存,没有值则进行缓存
             # 在响应头中添加一个缓存是否命中的状态(便于调试)
             add_header Cache-status $upstream_cache_status;
        }
        ...
}

4.6 限流

Nginx主要有两种限流方式:按并发连接数限流(ngx_http_limit_conn_module)、按请求速率限流(ngx_http_limit_req_module 使用的令牌桶算法)。

4.6.1 按请求速率限流

http{
    ...
    # 对请求速率限流
    limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=5r/s;
    
    server{
        location /interface{
            ...
            limit_req zone=myRateLimit burst=5  nodelay;
            limit_req_status 520;
            limit_req_log_level info;
        }
    }
}

参数说明:
$binary_remote_addr:表示基于 remote_addr(客户端IP) 来做限流
zone=myRateLimit:10m:表示使用myRateLimit来作为内存区域(存储访问信息)的名字,大小为10M,1M能存储16000 IP地址的访问信息,10M可以存储16W IP地址访问信息。
rate=5r/s:表示相同ip每秒最多请求5次,nginx是精确到毫秒的,也就是说此配置代表每200毫秒处理一个请求,这意味着自上一个请求处理完后,若后续200毫秒内又有请求到达,将拒绝处理该请求(如果没配burst的话)。
burst=5:意思是设置一个大小为5的缓冲队列,若同时有6个请求到达,Nginx 会处理第一个请求,剩余5个请求将放入队列,然后每隔200ms从队列中获取一个请求进行处理。若请求数大于6,将拒绝处理多余的请求,直接返回503。
nodelay:针对的是 burst 参数,burst=5 nodelay 这个配置表示被放到缓冲队列的这5个请求会立马处理,不再是每隔200ms取一个了。但是值得注意的是,即使这5个突发请求立马处理并结束,后续来了请求也不一定会立马处理,因为虽然请求被处理了但是请求所占的坑并不会被立即释放,而是只能按 200ms 一个来释放,释放一个后才将等待的请求入队一个。
limit_req_status=520:表示当被限流后,nginx的返回码。
limit_req_log_level info:代表日志级别。

4.6.2 按并发连接数限流

http{
    # 针对ip  对请求连接数限流
    ...
    limit_conn_zone $binary_remote_addr zone=myConnLimit:10m; 
    ...
    
    server{
       ...
       limit_conn myConnLimit 12;
    }
}

参数说明:
limit_conn_zone $binary_remote_addr zone=myConnLimit:10m; 代表的意思是基于连接数量限流,限流的对象是ip,名称是myConnLimit,存储空间大小10mb(即存放某ip的访问记录),limit_conn myConnLimit 12; 标识该ip最大支持12个连接,超过则返回503。

4.7 压缩

http {
    # 开启/关闭 压缩机制
    gzip on;
    # 根据文件类型选择 是否开启压缩机制
    gzip_types text/plain application/javascript text/css application/xml text/javascript image/jpeg image/jpg image/gif image/png  application/json;
    # 设置压缩级别,一共9个级别 1-9,越高资源消耗越大越耗时,但压缩效果越好
    gzip_comp_level 9;
    # 设置是否携带Vary:Accept-Encoding 的响应头
    gzip_vary on;
    # 处理压缩请求的 缓冲区数量和大小
    gzip_buffers 32 64k;
    # 对于不支持压缩功能的客户端请求 不开启压缩机制
    # 比如低版本的IE浏览器不支持压缩
    gzip_disable "MSIE [1-6].";
    # 设置压缩功能所支持的HTTP最低版本
    gzip_http_version 1.1;
    # 设置触发压缩的最小阈值
    gzip_min_length 2k;
    # 根据不同配置对后端服务器的响应结果进行压缩:off/any/expired/no-cache/no-store/private/no_last_modified/no_etag/auth
    gzip_proxied any;
}

nginx.conf 配置:

# 注意:每个指令必须有分号结束。

# 工作进程数,建议设置为cpu核心数或者 auto 自动检测。注意:Windows服务器上虽然可以启动多个processes,但是实际只会用其中一个。
worker_processes  1;

# 指定日志路径、级别。这个设置可以放入全局块、http块、server块,日志级别依次为:debug|info|notice|warn|error|crit|alert|emerg。
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

# pid文件,Nginx 进程启动后,会把所有进程的ID号写到此文件,方便管理进程。
#pid        logs/nginx.pid;

events {
	# 单个进程最大连接数(最大连接数=连接数*进程数)
    # 根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。
    worker_connections  1024;
}

http {
	# 文件扩展名与文件类型映射表(conf目录下的一个文件)
    include       mime.types;
	# 默认文件类型,如果 mime.types 预先定义的类型没匹配上,默认使用二进制流的方式传输
    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"';

    #access_log  logs/access.log  main;
	
	# 用于开启高效文件传输模式。当设置为on时,Nginx会使用零拷贝技术来传输文件,这意味着数据直接在内核中传输,避免了数据在内核缓冲区和用户缓冲区之间的拷贝,从而提高了传输效率‌。
    #sendfile        on;
	# 对于大型网站、高并发服务器来说,开启sendfile和tcp_nopush可以优化大量文件传输时的性能,有效提升服务器负载能力。
    #tcp_nopush     on;

	# 连接超时时间,单位:秒
    keepalive_timeout  65;
	
	# 接收客户端请求体超时
    #client_body_timeout 20s;
    
    # 限制请求体的大小,若超过所设定的大小,返回413错误。
    #client_max_body_size 10M;
	
	# Nginx分配给请求数据的Buffer大小,如果请求的数据小于 client_body_buffer_size 直接将数据先在内存中存储。
    # 大于该值小于 client_max_body_size,就会将数据先存储到临时文件(用户组要有读写权限)中,client_body_temp 指定的路径中,默认该路径值是 /tmp/。
    #client_body_buffer_size 128k;

	# 启用gzip压缩
    #gzip  on;

	# Web服务,静态资源发布,比如:VUE 前端项目发布
	# http://127.0.0.1:10080/
    server {
        listen       10080;
        server_name  localhost;
		
		# 配置根目录以及默认页面
        location / {
            root   html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
		
        location = /50x.html {
            root   html;
        }
    }
	
	# 修改host,目录:C:\Windows\System32\drivers\etc
	#127.0.0.1 www.a1.com
	#127.0.0.1 www.a2.com
	#127.0.0.1 www.a3.com
	
	# IIS 发布了 10081、10082 两个网站
	
	# 反向代理
	# http://www.a1.com:10080/
	server {
		listen 10080;
		# 域名,可以有多个,用空格隔开
		server_name www.a1.com www.a0.com;
		
		location / {
			proxy_pass http://127.0.0.1:10081;
        }
		
		location /sub/ {
			proxy_pass http://127.0.0.1:10082;
        }
	}
	
	# http://www.a2.com:10080/
	server {
		listen 10080;
		server_name www.a2.com;
		
		location / {
			proxy_pass http://127.0.0.1:10082;
        }
	}

	# HTTPS 配置
	# https://127.0.0.1:10443/
    server {
        listen       10443 ssl;
        server_name  localhost;

        ssl_certificate      cert/test.pem;
        ssl_certificate_key  cert/test.key;

        location / {
            root   html;
            index  index.html index.htm;
        }
    }
	
	# 负载均衡
	# 定义服务列表
	upstream myserver {
		# 负载策略,默认轮询方式
		# 当我们的服务不是无状态,比如采用了session保存数据,并且未做session共享的情况下,跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要访客只访问固定的一个服务器,那么就需要用iphash,iphash的每个请求按访问ip的hash值分配,这样每个访客固定访问一个后端服务器,就可以解决session的问题。
		#ip_hash;
		# 权重,权值越高被分配到的几率越大,用于后端服务器性能不均的情况,比如服务器性能差点就少处理点请求,服务器性能好点就多处理点请求。
        server 127.0.0.1:10081 weight=3;
        server 127.0.0.1:10082;
		# 热备,当10081、10082都宕机的情况下调用10083
		server 127.0.0.1:10083 backup;
    }
	
	# http://www.a3.com:10080/
	server {
     	listen 10080;
     	server_name www.a3.com;
		
     	location / {
        	proxy_pass http://myserver;
			# 下面三行为常见反向代理传递真实客户端IP的配置,如果配置在http中,则全局对所有server生效。
			proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     	}
    }
	
	# http://127.0.0.1:10091/
	# http://127.0.0.1:10092/
	# include 配置文件
	# 可以在 conf.d 目录中创建新的配置文件为不同的虚拟主机或网站定义不同的配置。
	include conf.d/*.conf;
}