Fellow Travellers

nginx 预研及应用

张永朋
字数统计: 6k阅读时长: 27 min
2019/08/20 Share

nginx 预研及应用

一、通过源码构建nginx

使用该 configure 命令配置构建。它定义了系统的各个方面,包括允许nginx用于连接处理的方法。最后它创建了一个 Makefile

configure 命令支持以下参数:

  • –help
    打印帮助信息
  • –prefix=path
    定义了一个存储nginx服务文件的目录。默认/usr/local/nginx
  • –sbin-path=path
    指定了nginx可执行文件的名字,该名字通常在安装的时候被使用,默认名是:prefix/sbin/nginx
  • –modules-path=path
    定义了nginx动态模块安装的目录,默认是 :prefix/modules
  • –conf-path=path
    设置 nginx.conf 配置文件的名字,如果需要,nginx可以指定不同的配置文件启动,默认是 prefix/conf/nginx.conf
  • –error-log-path=path
    设置错误、警告的日志文件路径,安装之后可以在 nginx.conf 配置文件中 error_log 指令可以指定错误日志路径。默认的文件是:prefix/logs/nginx.pid
  • –pid-path=path
    设置 nginx.pid 文件的路径,该文件将用来存储主进程的进程id。默认prefix/logs/nginx.pid
  • –lock-path=path
    设置lock文件的路径,安装完成之后也可以在 nginx.conf中直接通过 lock_file 改变lock文件指向的路径。默认 prefix/logs/nginx.pid
  • –user=name
    设置未授权用户的名字,这些用户可以被 worker 进程所使用。安装之后,这个名字可以被 nginx.conf 配置文件中 user 所改变。
  • –group=name
    设置组的名字,这些组的权限将会被 worker 进程所使用。安装之后,这个名字可以被 nginx.conf 配置文件中 user 所改变。默认情况下,组名被设置为未授权用户的名字。
  • –build=name
    设置一个可选的nginx build 名称。
  • –builddir=path
    设置一个构建目录。
  • –with-select_module
  • –without-select_module
    模块(使服务以 select() 方法启动)有效或无效。如果nginx 运行没有出现合适的方法,诸如:kquene,epull,or /dev/poll。
  • –with-poll_module
  • –without-poll_module
    模块(使服务以 poll() 方法启动)有效或无效。如果nginx 运行没有出现合适的方法,诸如:kquene,epull。
  • –with-threads
    使线程池的使用生效
  • –with-file-aio
    基于 FreeBSD and Linux 的异步IO生效或失效。
  • –with-http_ssl_module
    构建支持https的服务模块。这个模块不是默认的。运行该模块OpenSSL 库是必须的。
  • –with-http_image_filter_module
  • –with-http_image_filter_module=dynamic
    允许构建以jpeg、gif、png和webp格式转换图像的 ngx_-http_-image_-filter_module 。默认情况下不生成此模块。
  • –with-http_geoip_module
  • –with-http_geoip_module=dynamic
    可以构建ngx_http_geoip_module 根据客户端ip地址来创建创建变量,并且重新编译MaxMind ,这个模块默认是不被创建的。
  • –with-http_sub_module
    可以构建ngx_http_sub_module 模块,该模块可以将响应中指定的字符串被另一个替换,该模块默认是不被创建的。
  • –with-http_dav_module
    构建该模块提供通过WebDAV 协议实现文件自动管理,该模块默认是不被创建的。
  • –with-http_flv_module
    构建该模块对服务端的Flash Video (FLV)提供伪视频流技术,该模块默认是不会被构建的。
  • –with-http_mp4_module
    构建该模块对服务端的MP4 文件提供伪视频流技术,该模块默认不被构建。
  • –with-http_gunzip_module
    构建该模块可以让解压响应头带有“Content-Encoding: gzip”的文件,而不需要客户端支持“gzip”编码方法。
  • –with-http_gzip_static_module
    构建该模块能够发送“.gz”后缀的预压缩文件取代常规文件。该模块默认不被构建。
  • –with-http_auth_request_module
    支持客户端依据之前请求结果授权,该模块默认不被构建。
  • –with-http_random_index_module
    enables building the ngx_http_random_index_module module that processes requests ending with the slash character (‘/’) and picks a random file in a directory to serve as an index file. This module is not built by default.
  • –with-http_secure_link_module
  • –with-http_degradation_module
    构建ngx_http_degradation_module 模块,该模块默认未被构建。
  • –with-http_slice_module
    将一个请求分为若干子请求,每个子请求返回确定范围的响应。该模块实现针对响应数据较大数据的缓存。该模块默认是不被构建的。
  • –with-http_stub_status_module
    访问基础的状态信息,默认不被构建
  • –without-http_charset_module
    使ngx_http_charset_module 失效,上述模块将指定字符集添加到“Content-Type”响应头当中,可以将响应的字符集转换成另一个字符集。
  • –with-stream
  • –with-stream=dynamic
    构建该模块可以普通的 TCP/UDP 代理和负载均衡,该模块默认不被构建。
  • –with-stream_ssl_module
    添加 SSL/TLS protocol support 协议支持,默认不被构建。
  • –with-stream_geoip_module
  • –with-stream_geoip_module=dynamic

demo:

1
./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-http_ssl_module --with-pcre=../pcre-8.43 --with-zlib=../zlib-1.2.11 --with-openssl=../openssl-1.1.1b

编译实战:
1、下载nginx源码 nginx-release-1.16.0.tar.gz
downloadUrl: wget http://nginx.org/download/nginx-1.16.0.tar.gz
2、下载zlib源码 zlib-1.2.11.tar.gz
downloadUrl: http://www.zlib.net/
3、下载pcre源码 pcre-8.42.tar.gz
downloadUrl: https://ftp.pcre.org/pub/pcre/
3、下载opensll源码 openssl-1.1.1b.tar.gz
downloadUrl: https://www.openssl.org/source/old/1.1.1/openssl-1.1.1b.tar.gz
4、解压各文件,和nginx 同级目录,执行下列命令:

1
2
./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-http_ssl_module --with-pcre=../pcre-8.42 --with-zlib=../zlib-1.2.11 --with-openssl=../openssl-1.1.1b
make && make install

附nginx目录:
.
├── client_body_temp [error opening dir]
├── fastcgi.conf
├── fastcgi.conf.default
├── fastcgi_params
├── fastcgi_params.default
├── fastcgi_temp [error opening dir]
├── html
│ ├── 50x.html
│ └── index.html
├── koi-utf
├── koi-win
├── logs
│ ├── access.log
│ └── error.log
├── mime.types
├── mime.types.default
├── nginx
├── nginx.conf
├── nginx.conf.default
├── nginx.pid
├── proxy_temp [error opening dir]
├── scgi_params
├── scgi_params.default
├── scgi_temp [error opening dir]
├── uwsgi_params
├── uwsgi_params.default
├── uwsgi_temp [error opening dir]
└── win-utf

一、使用者手册

该手册对nginx作简要介绍,并描述了nginx可以做的任务,使用该手册的前提是读者已在pc安装了nginx。如果没有,请查看安装nginx 页面。这个手册描述了如何启动和关闭nginx、如何重新加载配置、描述其配置文件的配置文件架构、描述设置静态服务器的配置、如何配置代理服务、如何用FastCGI application 来连接。
nginx 有一个 master 集成和多个
worker 进程。master 主要作用是读取和解析配置以及维持worker 进程。worker 进程是处理真实的请求进程。nginx 依赖事件驱动模型(event-based)和操作系统来高效地分发请求到worker 进程中。worker 进程地数量被定义在配置文件中,可以通过调整cpu核心的数量来修改(详见worker_processes)。
默认,配置文件名nginx.conf ,被放置在
/usr/local/nginx/conf, /etc/nginx, or /usr/local/etc/nginx

启动、关闭、重新加载配置

直接通过可执行文件启动nginx。一旦启动,就可以通过可执行文件传参 -s 的方式来控制nginx。使用语法如下:

nginx -s signal

signal,有如下参数:

  • stop - 快速关闭
  • quit - 优雅关闭
  • reload - 加载配置文件
  • reopen - 重新打开日志文件
    例如,停止nginx 进程,要等待worker 进程完成当前的请求,可以使用如下命令:

nginx -s quit
注意:该命令执行应该使用开启该nginx的用户。

配置文件的改变只能通过nginx重新加载配置或重启nginx生效。重新加载配置,执行如下:

nginx -s reload

一旦master 进程接收到了重新加载配置的信号,它会校验配置文件语法,并尝试去应用配置。如果配置成功,master 会创建新的worker 并通知旧的worker 进程去关闭。否则,master 进程会回滚当前的改变到历史配置,继续使用旧的配置。旧worker 进程接收到命令去关闭,会停止接收新的请求并将现有的请求处理完成后,才完成退出动作。

使用Unix 的工具kill 工具信号也可以发给nginx 进程。这种情况,带有进程id的信号直接发送给一个进程。这个进程id是被nginx master进程所重写,默认情况下 nginx.pid 在目录
/usr/local/nginx/logs 或者 /var/run。例如,如果master 进程id 是1628,发送退出信号去优雅地关闭nginx,可执行:

kill -s QUIT 1628

为了获取nginx 进程id地列表,ps 工具被使用,例如:

ps -ax | grep nginx

更多信号发送到nginx,详看Controlling nginx

配置文件结构

nginx 包含很多模块,而这些模块是在配置文件中被特定地指令所控制。指令包括简单指令和指令块。一个简单地指令包含被空格分隔的名字和参数,以分号(;)结尾。指令块有和简单指令一样的结构,除了没有分号结尾以及额外的指令被花括号所包括({ and })。如果指令块在指令中有其他指令,则称之为上下文(例如 events, http, server, 和 location)。
指令被放置到所有context是被当作在main 上下文中。eventshttp 指令是在main 上下文中,server 指令在http 上下文中,locationserver 上下文中。剩下的一行# 注释。

静态资源服务

web 服务器最重要的一个任务就是发布一个文件服务(像图片或者静态html文件)。你能够实现将本地文件映射到网络url,可以直接通过请求访问文件。下面的示例是要实现/data/www (存放html静态资源) 和 /data/images (包含图片),这需要编辑配置文件,在http 指令块下 server 指令块下 添加两个location 指令块。。
首先创建 /data/www 目录,然后放一个html文件,然后再在/data/images 文件夹下放置些图片供测试。
接下来,打开配置文件,默认的配置已经包含了几个 server 块的示例,将注释打开创建一个新的server 指令块。

1
2
3
4
http {
server {
}
}

通常这个配置文件会包含多个server 块,而这些server 是通过它们监听的端口和服务名称来加以区分。一旦nginx 确定哪一个server 处理请求,它会测试请求头中的参数和location 中配置的server 中定义是否匹配。
添加location块到server 块当中。

1
2
3
location / {
root /data/www;
}

这个locaiton 块定义了“/”前缀和请求的URI做匹配。对于匹配的请求,这个URI将会被添加到root指令中重定向路径的后面,上述demo即是转向 /data/www ,以形成本地文件系统上所请求的路径。如果匹配多个location块,则nginx选择具有最长前缀的块。location上面提供长度为1的最短前缀,因此只有当所有其他location 块都无法提供匹配时,才会使用此块。

接下来添加第二个 location

1
2
3
location /images/ {
root /data;
}

它将会匹配以/images/ 开头的请求路径(location/ 也能匹配上,但是匹配前缀更短)。

而最终的server 块的配置如下:

1
2
3
4
5
6
7
8
9
server {
location / {
root /data/www;
}

location /images/ {
root /data;
}
}

上述已经运行的配置监听80端口,可以铜鼓http://localhost/加以访问。为了响应url 以/images/ 开头的请求,nginx服务端将会发送/data/images 目录下的文件。例如为了响应http://localhost/images/example.png,nginx会发送/data/images/example.png文件。如果这个文件不存在,就会返回404错误。以/images/ 开头的URIs路径将会映射到/data/www目录下。为了响应请求http://localhost/some/example.html, nginx将会发送/data/www/some/example.html文件。为了使新的配置生效,需要发送reload信号到nginx 的master进程。通过执行:

1
nginx -s reload

如果加载出现了问题,你可以在access.logerror.log中查找问题。文件路径/usr/local/nginx/logs/var/log/nginx

设置一个简单的代理服务

代理服务是nginx最常使用的一个功能,就是意味着nginx作为一个服务器接收请求,让他们去访问被代理的服务器,从被代理的服务器检索响应,并将他们转发到客户端。
我们将会配置一个基础的代理服务,请求的图片文件都来自于本地目录,其他请求发送到一个被代理的服务器。在这个例子中,两个服务都会被定义到一个简单的nginx实例中。
首先,通过添加一个或多个server块来定义被代理的服务。

1
2
3
4
5
6
7
server {
listen 8080;
root /data/up1;

location / {
}
}

上述配置监听8080端口,并且映射所有请求到/data/up1目录。创建这个目录,并把index.html文件放进去。注意root 指令需要放置到location块中。这个root生效要求location块被选择,并且location块中没有root指令。

接下来使用来自现在的配置,修改它作为一个代理服务器。在第一个location块,配置proxy_pass指令,参数配置协议、名称、端口以及被代理的服务。

1
2
3
4
5
6
7
8
9
server {
location / {
proxy_pass http://localhost:8080;
}

location /images/ {
root /data;
}
}

我们将修改第二个location块,它将会映射请求以/images/开头的请求到本地磁盘/data/images 目录下,为了使之匹配图片资源,可配置如下:

1
2
3
location ~ \.(gif|jpg|png)$ {
root /data/images;
}

这个参数正则匹配所有以.gif.jpg或者 .png结尾的URIs。一个正则表达式应该以~开头,该请求将会被映射到目录/data/images下。
当nginx选择了一个location块来服务一个请求,首先它会校验location指令指定的前缀,记住location指令匹配最长路径,然后校验正则。如果匹配到了正则,nginx将会挑选该location块,否则会选择之前记下来的模块。
最终的配置如下:

1
2
3
4
5
6
7
8
9
server {
location / {
proxy_pass http://localhost:8080/;
}

location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}

启动FastCGI代理
nginx也经常被使用路由请求到FastCGI服务器,FastCGI服务器可以运行多种框架和编程语言,比如PHP
最基础简单的配置,使用fastcgi_pass取代proxy_pass,改变参数到9000。在php中,SCRIPT_FILENAME被使用决定脚本名称,QUERY_STRING设置请求参数,结果配置如下:

1
2
3
4
5
6
7
8
9
10
11
server {
location / {
fastcgi_pass localhost:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
}

location ~ \.(gif|jpg|png)$ {
root /data/images;
}
}

代理缓存

完整示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#user  nobody;
worker_processes 2;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
worker_connections 1024;
}


http {
include 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;
#需要首先配置 缓存目录,文件目录层级2级,空间名字 10m大小,目录最大大小(超过启动nginx自己的淘汰规则),在24小时的时间内没有被访问就会被清理,存放临时文件
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=cache:10m inactive=24h max_size=1g use_temp_path=off;
sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

#gzip on;

server {
listen 80;
server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
location /www {
alias /data/;
}

location /images/ {
root /data;
}

location ~ ^/nginxdemo {
proxy_pass http://nginxdemoserver;
proxy_cache cache; # 开启缓存
proxy_cache_valid 200 304 12h; #200和304头信息过期时间12小时
proxy_cache_valid any 10m;
add_header Nginx_Cache "$upstream_cache_status";
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;# 一个服务报错请求下一个
}
#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;
}
}

upstream nginxdemoserver {
least_conn;
server 10.211.55.4:8080 weight=1;
server 10.211.55.4:8082 weight=1;
}

}

websocket代理

为了将基于HTTP/1.1协议的客户端和服务端连接转换成websocket,请使用HTTP/1.1协议所提供的协议转换机制。

然而,有一个微妙之处:由于“Upgrade”是 hop-by-hop 请求头,因此它不会从客户端传递到代理服务器。通过转发代理,客户端可以使用该CONNECT 方法来规避此问题。但是,这不适用于反向代理,因为客户端不知道任何代理服务器,并且需要在代理服务器上进行特殊处理。

从版本1.3.13开始,nginx实现了特殊的操作模式,如果代理服务器返回带有代码101(交换协议)的响应,则允许在客户端和代理服务器之间建立通道,并且客户端要求通过请求中的“Upgrade”请求头。

如上所述,包括“Upgrade” 和 “Connection”的hop-by-hop不会从客户端传递到代理服务器,因此为了让代理服务器知道客户端将协议切换到WebSocket的意图,这些报头必须明确传递:

1
2
3
4
5
6
location /chat/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}

一个更为复杂的配置,取决于“Connection”请求头的值取决于客户端请求是否有“Upgrade”请求头,下demo中如果$http_upgradedefault,则$connection_upgrade设置为upgrade

1
2
3
4
5
6
7
8
9
10
11
12
13
14
http {
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

server {
location /chat/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
}

默认情况下,如果代理服务器在60秒内未传输任何数据,则将关闭连接。

demo:

1
2
3
4
5
6
7
8
9
10
11
location ~ ^/websocket/gs-guide-websocket/ {
proxy_pass http://websocketsserver;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
#由于服务器端源码(建议大家做好大小写匹配)只匹配了"Upgrade"字符串,所以如果这里填"upgrade"服务器端会将这条http请求当成普通的请求,导致websocket握手失败
proxy_set_header Connection "Upgrade";
proxy_set_header Origin '';
proxy_set_header Remote_addr $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 600s;
}

nginx 动态添加模块,平滑升级:

例如上述配置不支持缓存代理:通过平滑升级实现缓存代理:
1、如果需要下载第三方源码包编译便下载源码包,此处不需要,在nginx的core 模块中,只需要重新编译
2、查看nginx编译了哪些模块

1
2
nginx -V
configure arguments: --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-http_ssl_module --with-pcre=../pcre-8.42 --with-zlib=../zlib-1.2.11 --with-openssl=../openssl-1.1.1b

再编译:

1
2
3
4
5
6
7
8
9
10
$ ./configure \
--prefix=/usr/local/nginx \
--with-zlib=../zlib-1.2.11 \
--with-pcre=../pcre-8.42 \
--with-http_ssl_module \
--with-openssl=../openssl-1.1.1b \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp

$ make //注意,不要make install

替换nginx二进制文件

1
2
$ cp /usr/local/nginx/nginx /usr/local/nginx/nginx.bak
$ cp ./objs/nginx /usr/local/nginx/nginx

再次确认是否成功安装

1
$ /usr/local/nginx/nginx -V

至此nginx重新编译添加模块成功。

代理缓存

完整示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#user  nobody;
worker_processes 2;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
worker_connections 1024;
}


http {
include 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;
#需要首先配置 缓存目录,文件目录层级2级,空间名字 10m大小,目录最大大小(超过启动nginx自己的淘汰规则),在24小时的时间内没有被访问就会被清理,存放临时文件
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=cache:10m inactive=24h max_size=1g use_temp_path=off;
sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

#gzip on;

server {
listen 80;
server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
location /www {
alias /data/;
}

location /images/ {
root /data;
}

location ~ ^/nginxdemo {
proxy_pass http://nginxdemoserver;
proxy_cache cache; # 开启缓存
proxy_cache_valid 200 304 12h; #200和304头信息过期时间12小时
proxy_cache_valid any 10m;
add_header Nginx_Cache "$upstream_cache_status";
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;# 一个服务报错请求下一个
}
#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;
}
}

upstream nginxdemoserver {
least_conn;
server 10.211.55.4:8080 weight=1;
server 10.211.55.4:8082 weight=1;
}

}

附成都现场nginx配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
#user  nobody;
worker_processes 2;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid logs/nginx.pid;


events {
worker_connections 1024;
}


http {
include mime.types;
default_type application/octet-stream;
#解决nginx出现413 Request Entity too lagrge
client_max_body_size 100m;
#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;

#keepalive_timeout 0;
keepalive_timeout 65;

server {
listen 8091;
server_name localhost 10.1.233.73;
#charset koi8-r;
access_log logs/host.access.log ;
location ~ ^/dgpCD-server-web {
proxy_pass http://10.1.233.73:8081;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-FORWARDED-HOST $server_addr;
proxy_set_header X-FORWARDED-PORT $server_port;
}
}

server{
listen 8080 ssl;
server_name localhost 10.1.233.73; # dghy.cdmpnr.cn
ssl_certificate ssl/2220425__cdmpnr.cn.pem;
ssl_certificate_key ssl/2220425__cdmpnr.cn.key;
ssl_session_tickets on;
charset utf-8;
location ~ ^/dasc-sso/(.*)$ {
proxy_pass http://cas_server/dasc-sso/$1$is_args$args;
proxy_redirect http:// https://;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-FORWARDED-HOST $server_addr;
proxy_set_header X-FORWARDED-PORT $server_port;
}

location ~ ^/dgpCD-server-web {
rewrite ^/(dgpCD-server-web)$ $scheme://$host:$server_port/$1/ permanent;
proxy_pass http://dgpcd_server;
proxy_redirect http:// https://;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Scheme https;
proxy_set_header X-FORWARDED-HOST $server_addr;
proxy_set_header X-FORWARDED-PORT $server_port;
}

location ~ ^/websocket/gs-guide-websocket/ {
proxy_pass http://websocketsserver;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
#由于服务器端源码(建议大家做好大小写匹配)只匹配了"Upgrade"字符串,所以如果这里填"upgrade"服务器端会将这条http请求当成普通的请求,导致websocket握手失败
proxy_set_header Connection "Upgrade";
proxy_set_header Origin '';
proxy_set_header Remote_addr $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 600s;
}

location /websocket {
rewrite ^/(.*)(websocket)$ $scheme://$host:$server_port/$2/ permanent;
proxy_redirect http:// https://;
proxy_pass http://websocketsserver;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Scheme https;
proxy_set_header X-FORWARDED-HOST $server_addr;
proxy_set_header X-FORWARDED-PORT $server_port;
proxy_set_header Upgrade-Insecure-Requests 1;
}

location ~ ^/dgm-server-web {
proxy_pass http://dgmcd_server;
proxy_redirect http:// https://;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-FORWARDED-HOST $server_addr;
proxy_set_header X-FORWARDED-PORT $server_port;
}

location ~ ^/cdoms {
#add_header Access-Control-Allow-Origin *;
#add_header Access-Control-Allow-Credentials true;
#add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
rewrite ^/(.*)(cdoms)$ $scheme://$host:$server_port/$2/ permanent;
proxy_pass http://cdoms_server;
proxy_redirect http:// https://;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-FORWARDED-HOST $server_addr;
proxy_set_header X-FORWARDED-PORT $server_port;
}


location ~ ^/MasterEvalutionBase {
#add_header Access-Control-Allow-Origin *;
#add_header Access-Control-Allow-Credentials true;
#add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
proxy_pass http://master;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-FORWARDED-HOST $server_addr;
proxy_set_header X-FORWARDED-PORT $server_port;
}

location ~ ^/web_static {
proxy_pass http://web_static;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-FORWARDED-HOST $server_addr;
proxy_set_header X-FORWARDED-PORT $server_port;
}

location /api {
proxy_pass http://calcuApi;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-FORWARDED-HOST $server_addr;
proxy_set_header X-FORWARDED-PORT $server_port;
}


##dghycdzg
location /dghycdzg {
proxy_pass http://dghycdzg;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-FORWARDED-HOST $server_addr;
proxy_set_header X-FORWARDED-PORT $server_port;
}

location /dghycdzb {
proxy_pass http://dghycdzb;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-FORWARDED-HOST $server_addr;
proxy_set_header X-FORWARDED-PORT $server_port;
}

location /Proxy.ashx {
#rewrite ^/(.*)(Proxy.ashx)([\?]*)([http]*)(.*)$ $scheme://$host:$server_port/$2$3$4$5 permanent;
proxy_pass http://Proxy;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-FORWARDED-HOST $server_addr;
proxy_set_header X-FORWARDED-PORT $server_port;
}

location /dascService {
proxy_pass http://dascService;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-FORWARDED-HOST $server_addr;
proxy_set_header X-FORWARDED-PORT $server_port;
}

location /dasc {
rewrite ^/(dasc)$ $scheme://$host:$server_port/$1/ permanent;
proxy_pass http://dasc;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-FORWARDED-HOST $server_addr;
proxy_set_header X-FORWARDED-PORT $server_port;
}

location /CDMD {
index index.html;
try_files $uri $uri/ /index.html;
root E:/Software/nginx-1.16.0/statics;
}

location /CDZG {
index index.html;
try_files $uri $uri/ /index.html;
root E:/Software/nginx-1.16.0/statics;
}

location /UPRSMS {
index index.html;
try_files $uri $uri/ /index.html;
root E:/Software/nginx-1.16.0/statics;
}

location /dgp_js_api319 {
index index.html;
try_files $uri $uri/ /index.html;
root E:/Software/nginx-1.16.0/statics;
}
}

upstream websocketsserver {
ip_hash;
server 10.1.233.73:8081 weight=1;
server 10.1.233.73:8079 weight=1;
}

### 负载均衡服务配置
upstream load_balance_server{
ip_hash;
server 10.1.233.73:8081 weight=1 fail_timeout=20s;
server 10.1.233.73:8081 weight=1 fail_timeout=20s;
}

### 多规负载均衡
upstream dgpcd_server {
#ip_hash;
#fair;
server 10.1.233.73:8079 weight=1;
server 10.1.233.73:8081 weight=1;
}

upstream dgmcd_server {
ip_hash;
server 10.1.233.73:8079 weight=1;
server 10.1.233.73:8081 weight=1;
}

upstream cas_server {
server 10.1.233.75:8090 weight=1;
}

upstream cdoms_server {
server 10.1.233.75:8080 weight=1;
}

upstream master {
ip_hash;
server 10.1.233.73:8079 weight=1;
server 10.1.233.73:8081 weight=1;
}

upstream UPRSMS {
ip_hash;
server 10.1.233.73:8079 weight=1;
server 10.1.233.73:8081 weight=1;
}

upstream front_resource {
server 10.1.233.73:8081 weight=1;
}

upstream web_static {
server 10.99.34.8:80 weight=1;
}

upstream calcuApi {
server 10.1.233.77:8888 weight=1;
}

upstream dghycdzg {
server 10.1.233.77:81 weight=1;
}

upstream dghycdzb {
server 10.1.233.77:81 weight=1;
}

upstream Proxy {
server 10.1.233.73:83 weight=1;
}
upstream dascService {
server 10.1.233.75:8090 weight=1;
}

upstream dasc {
server 172.25.16.8:8090 weight=1;
}
}
CATALOG
  1. 1. nginx 预研及应用
    1. 1.1. 一、通过源码构建nginx
    2. 1.2. 一、使用者手册
      1. 1.2.1. 启动、关闭、重新加载配置
      2. 1.2.2. 配置文件结构
      3. 1.2.3. 静态资源服务
      4. 1.2.4. 设置一个简单的代理服务
      5. 1.2.5. 代理缓存
      6. 1.2.6. websocket代理
      7. 1.2.7. nginx 动态添加模块,平滑升级:
      8. 1.2.8. 代理缓存