Centos7学习笔记(二十)- nginx代理与负载均衡
一、代理类型
正向代理:-----------为访问客户端服务,dns解析,是在代理端。如科学上网。
反向代理:------------为服务器回应请求服务,dns解析,是在客户端本地完成。如多域名反代指向同一IP地址。
二、nginx代理支持的协议
http--------代理超文本传输协议 -----------http server
https--------代理http/https协议 ------------https server
tcp -----------代理tcp/udp协议 ------------ TCP server
websocket-----------代理http1.1长连接通讯协议----------websocket server
grpc-------------代理go语言远程过程调用 ----------grpc server
pop/imap---------代理邮件收发协议----------------mail server
rtmp--------------代理流媒体、直播、点播------------media server
上述不同代理所涉及的模块:
http/https访问方面——
ngx_http_proxy_module——指令:proxy_pass
ngx_http_fastcgi_module——指令:fastcgi_pass ##php代理
ngx_http_uwsgi_module——指令: uwsgi_pass ##说明:这个uwsgi是代理python的
websocket和grpc访问方面——
ngx_http_proxy_module——指令:proxy_pass ##此处代理socket
ngx_http_v2_module——此处无对应指令,grpc调用依赖该模块
三、代理的语法
1、反向代理配置的语法
syntax: proxy_pass URL;
Default: -
context: location,if in location,limit_except
一个实例:
server {
listen 80;
server_name web.example.com;
location / {
proxy_pass http://100.10.1.7:80;
proxy_set_header Host $http_host; 《===========这一行的作用是将代理请求的header头中主机信息,传递到后端主机,使后端识别具体请求的是哪个网站。
}
}
2、代理相关参数:
简单来说,代理的相关参数,都是为了解决代理过程中产生的相关问题而设置的。
proxy_set_header Host $http_host; 《===========为了解决把header头中的host信息传递到后端的问题
proxy_http_version 1.1; 《============代理和后端主机之间,默认是用http1.0协议进行短连接的。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 《==========解决代理过程中,把客户端(也可能是上一级代理)的真实IP地址,由代理主机传递给后端主机的问题
proxy_set_header X-Real-IP $remote_addr; 《==========在只有一层代理关系下,X-Real-IP和上面X-Forwarder-For作用是一样的,都是传递客户端的真实IP。区别是,后者能把多层代理过程中的不同代理主机的IP地址,一起传递向后端主机。如果需要在access_log日志文件中记录,则log_format调用的变量为$http_x_real_ip
proxy_connect_timeout time; 《===========代理与后端连接的超时时间,超过该时间值,那么nginx代理给客户端响应504错误,默认值60s,可修改短。
proxy_read_timeout time; 《==========代理等待后端服务器的响应时间,默认值60s,可适当修改。
proxy_send_timeout time; 《==========后端服务器数据回传给nginx代理的超时时间,默认值60s,可根据回传数据量适当加大。
proxy_buffering on|off; 《==========nginx代理会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传,而不是全部接收完再传给客户端
————补充: 如果proxy_buffering开启,nginx假定被代理的后端服务器会以最快速度响应,并把内容保存在由指令 proxy_buffer_size 和 proxy_buffers 指定的缓冲区里边.
如果响应body无法放在内存里边,那么部分内容会被写到磁盘上。
如果proxy_buffering被关闭了,那么响应body会按照获取body的多少立刻同步传送到客户端。nginx不尝试计算被代理服务器整个响应body的大小,nginx能从服务器接受的最大数据,是由指令 proxy_buffer_size指定的。
对于基于长轮询(long-polling)的Comet 应用来说,关闭 proxy_buffering 是重要的,不然异步响应将被缓存导致Comet无法工作。
但是无论proxy_buffering是否开启,proxy_buffer_size都是生效的
proxy_buffer_size size; 《==========设置nginx代理用于保存用户头信息的缓冲区大小,默认值4K或者8K。
————通俗一点解释:这个值是用于存储后端响应的header头信息的,一般而言,header头信息不超过该值大小,但是如果超过了,会报错的。——Nginx使用该大小申请read_buf,即大小指定了 upstream header 最大长度,如果响应头超过了这个长度,Nginx会报upstream sent too big header错误,然后client收到的是502。——还有最重要的一点,这个proxy_buffer_size大小,在proxy_buffering设定为off时,也是生效的。
proxy_buffers number size; 《==========nginx代理用于存储后端主机响应的内容主体(body),定义了其数量(最大数量)和大小。一个缓冲区的大小,默认值可能是4K或者8K。具体要看系统平台。
—————进一步补充:在ngixn处理时,并不是一下就开辟最大数量的缓冲区个数的,而是根据body大小,逐步增加个数直至达到最大大小。
proxy_busy_buffers_size size; 《===========proxy_busy_buffers_size不是独立的空间,他是proxy_buffers和proxy_buffer_size的一部分。
—————补充:nginx会在没有完全读完后端响应就开始向客户端传送数据,所以它会划出一部分busy状态的buffer来专门向客户端传送数据(建议为proxy_buffers中单个缓冲区的2倍),然后它继续从后端取数据。
proxy_busy_buffers_size参数用来设置处于busy状态的buffer有多大。
1)如果完整数据大小小于busy_buffers大小,当数据传输完成后,马上传给客户端;
2)如果完整数据大小不小于busy_buffers大小,则装满busy_buffers后,马上传给客户端。
proxy_temp_path path [level1 [level2 [level3]]]; 《==========定义proxy的临时文件存在目录以及目录的层级。默认目录名是proxy_temp。通常,yum安装并启动的nginx的话,绝对路径是/var/cache/nginx/proxy_temp
——————补充:官方文档中的例子是这样的:
proxy_temp_path /spool/nginx/proxy_temp 1 2;
那么意思就是在proxy_temp目录下,可以支持有三层子目录结构。实际生成效果可能是这样的
proxy_temp_path /spool/nginx/proxy_temp/7/45/00000123457 《=========最后的00000123457是文件名
这里的level1、2、3,如果有值,就代表有一级、二级、三级子目录。而目录名完全是数字命名,这里的具体的值就是代表目录名的数字位数。
proxy_max_temp_file_size size; 《=======临时文件的总大小。默认值1024m
proxy_temp_file_write_size size; 《=========设置同时写入临时文件的数据量的总大小。通常设置为8k或者16k。默认是proxy_buffer_size和proxy_buffers中设置的缓冲区大小的2倍,Linux下一般是8k
fastcgi_buffers number size; 《=========类似proxy_buffers,基于php解析
fastcgi_buffer_size size; 《=========类似proxy_buffer_size
(proxy_buffers、proxy_busy_buffers_size、proxy_buffer_size、proxy_buffering的作用域都是http、server、location。)
通常的做法中,把上面这些参数,统一写到/etc/nginx/proxy_params文件中
示例:
proxy_set_header Host $http_host; proxy_http_version 1.1; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; proxy_connect_timeout 30s; proxy_read_timeout 60s; proxy_send_timeout 100s; proxy_buffering on; proxy_buffer_size 32k; proxy_buffers 8 128k; proxy_busy_buffers_size 256k;
四、nginx的负载均衡
nginx要实现负载均衡需要使用到proxy_pass代理模块配置
nginx负载均衡与nginx代理不同地方在于,nginx代理一个location只能代理一台服务器,而nginx负载均衡则是将客户端请求代理转发至一组upstream虚拟服务池
具体体现是使用upstream指令,它的写法如下:
upstream name {...}
其作用域是http。
upstream web {
server 172.16.1.7:80;
server 172.16.1.8:80;
server 172.16.1.9:80;
server 172.16.1.10:80;
}
server {
listen 80;
server_name test.hcrbbs.top;
location / {
proxy_pass http://web;
include proxy_params; 《=======这里引用了上面的proxy_params文件中的所有代理参数。
}
}
多段upstream,需要多段server去对应使用。
案例:
使用nginx负载均衡时,如何将后端请求超时的服务器流量平滑的切换到另一台上。
如果后台服务连接超时,Nginx是本身是有机制的,如果出现一个节点down掉的时候,Nginx会更据你具体负载均衡的设置,将请求转移到其他的节点上,但是,如果后台服务连接没有down掉,但是返回错误异常码了如:504、502、500,这个时候你需要加一个负载均衡的设置,如下:
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
nginx负载均衡的调度算法:
| 轮询 | 按时间顺序逐一分配到不同的后端服务器 |
| weight | 加权轮询,weight值越大,被分配到的几率越高 |
| ip_hash | 每个请求按访问IP的hash结果分配,这样来自同一个IP的固定访问一个后端服务器 |
| url_hash | 按照访问URL的hash结果来分配请求,是每个URL定向到同一个后端服务器 |
| least_conn | 最少连接,哪个机器连接数少就分发 |
weight调度算法用在后端服务器性能不一的情况,性能高,则可以赋予更高的加权值。默认的weight值是1。
weight调度示例:
upstream web {
server 172.16.1.7:80 weight=10;
server 172.16.1.8:80 weight=3;
server 172.16.1.9:80 weight=5;
server 172.16.1.10:80 weight=1;
}
ip_hash调度算法不能和weight加权轮询算法一起用。前者在使用时,又容易带来问题,比如,一个有大量的电脑的内网,他们都是NAT转发到同一个公网IP地址去访问web服务器,那么在负载均衡后端的某一主机,就会负载过大。
ip_hash调度示例:
upstream web {
ip_hash;
server 172.16.1.7:80;
server 172.16.1.8:80;
server 172.16.1.9:80;
server 172.16.1.10:80;
}
nginx负载均衡后端状态:
对于nginx负载均衡来说,其后端主机,可以有几种状态来表述,不同的状态,有不同的用途或者处理方法。
| down | 当前服务器暂时不参与负载均衡 |
| backup | 预留的备份服务器 |
| max_fails | 允许请求失败的次数 |
| fail_timeout | 经过max_fails失败后,服务暂停的时间 |
| max_conns | 限制最大的接收连接数 |
down状态一般用于停机维护:
upstream web {
server 172.16.1.7:80 down;
server 172.16.1.8:80;
server 172.16.1.9:80;
server 172.16.1.10:80;
}
backup用于指定某后端主机做备份机器,当服务池中其他服务器都不可用时,才会启用backup。
upstream web {
server 172.16.1.7:80 down;
server 172.16.1.8:80;
server 172.16.1.9:80;
server 172.16.1.10:80 backup;
}
max_fails和fail_timeout是一起使用,用于后端主机状态检查。但其实无法直观的查看后端主机的状态指标,属于允许过程检测机制。
upstream web {
server 172.16.1.7:80;
server 172.16.1.8:80 max_fails=2 fail_timeout=5s; 《=========表示fail_timeout超时失败5秒后,记一次fail,最大允许fail次数max_fails是2次,2次后标记该主机down。
server 172.16.1.9:80 max_fails=2 fail_timeout=5s;
server 172.16.1.10:80 ;
}
使用第三方模块来监测nginx负载均衡后端的主机状态,有一个叫nginx_upstream_check_module的模块。但这里涉及一个问题,由于nginx是yum方式安装,需要重新编译安装来集成这个第三方模块。执行如下:
yum install -y gcc glibc gcc-c++ pcre pcre-devel openssl-devel patch 《=======安装编译依赖环境
nginx -v 《==========获取当前的nginx版本
wget https://nginx.org/download/nginx-1.20.1.tar.gz 《==========下载对应版本的源码包
wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/refs/heads/master.zip 《======下载当前最新的nginx_upstream_check_module模块的源码包
tar xf nginx-1.20.1.tar.gz 《=====解压nginx源码
unzip master.zip 《======解压模块源码
pwd 《======获取当前目录,以便给后面编译添加绝对路径,此时为/hom/study。
nginx -V 《=========获取当前的yum安装的nginx所使用的参数,参数部分全部复制出来
cd nginx-1.20.1 《========进入nginx源码目录
patch -p1 <../nginx_upstream_check_module-master/check_1.20.1+.patch 《=========用p1表示当前在ningx源码目录下,p0表示不在。此处是给源码打补丁,附加模块功能。
sudo ./configure --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-compat --with-debug --with-file-aio --with-google_perftools_module --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_degradation_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_mp4_module --with-http_perl_module=dynamic --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-http_xslt_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-stream_ssl_preread_module --with-threads --add-module=/home/study/nginx_upstream_check_module-master/ --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E'
然后是漫长排错期。如下安装了N多依赖软件
sudo yum -y install openssl-devel libxml2 libxslt libxml2-devel libxslt-devel gd gd-devel perl-devel perl-ExtUtils-Embed gperftools-devel
最后(如果sudo报错,需用root用户执行)
make && make install
然后是健康监测模块的调用,示例:
upstream web {
server 172.16.1.7:80 max_fails=2 fail_timeout=5s;
server 172.16.1.8:80 max_fails=2 fail_timeout=5s;
server 172.16.1.9:80 max_fails=2 fail_timeout=5s;
server 172.16.1.10:80 max_fails=2 fail_timeout=5s ;
check interval=3000 rise=2 fall=3 timeout=1000 type=tcp; 《===========这里的3000和1000都是毫秒,rise表示成功次数,表示up,fail表示失败次数,然后标记down
check_http_send "HEAD HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
server {
listen 80;
server_name test.hcrbbs.top;
location / {
proxy_pass http://web;
include proxy_params;
}
location /status {
check_status;
access_log off;
allow 10.0.0.0/24;
deny all;
}
}
上述示例中涉及的指令的具体解释:
interval:向后端发送的健康检查包的间隔,单位为毫秒。
fall(fall_count): 如果连续失败次数达到fall_count,服务器就被认为是down。
rise(rise_count): 如果连续成功次数达到rise_count,服务器就被认为是up。
timeout: 后端健康请求的超时时间,单位毫秒。
default_down: 设定初始时服务器的状态,如果是true,就说明默认是down的,如果是false,就是up的。默认值是true,也就是一开始服务器认为是不可用,要等健康检查包达到一定成功次数以后才会被认为是健康的。
| type:健康检查包的类型,现在支持以下多种类型: | |
| tcp:简单的tcp连接,如果连接成功,就说明后端正常。 | |
| ssl_hello:发送一个初始的SSL hello包并接受服务器的SSL hello包。 | |
| http:发送HTTP请求,通过后端的回复包的状态来判断后端是否存活。 | |
| mysql: 向mysql服务器连接,通过接收服务器的greeting包来判断后端是否存活。 | |
| ajp:向后端发送AJP协议的Cping包,通过接收Cpong包来判断后端是否存活。 | |
| port: 指定后端服务器的检查端口。你可以指定不同于真实服务的后端服务器的端口,比如后端提供的是443端口的应用,你可以去检查80端口的状态来判断后端健康状况。默认是0,表示跟后端server提供真实服务的端口一样。该选项出现于Tengine-1.4.0。 |
指令完整语法:
Syntax: check interval=milliseconds [fall=count] [rise=count] [timeout=milliseconds] [default_down=true|false] [type=tcp|http|ssl_hello|mysql|ajp] [port=check_port]
Default: 如果没有配置参数,默认值是:interval=30000 fall=5 rise=2 timeout=1000 default_down=true type=tcp
Context: upstream
Syntax: check_http_send http_packet
Default: GET / HTTP/1.0\r\n\r\n
Context: upstream
该指令可以配置http健康检查包发送的请求内容。为了减少传输数据量,推荐采用"HEAD"方法。
当采用长连接进行健康检查时,需在该指令中添加keep-alive请求头,如:"HEAD / HTTP/1.1\r\nConnection: keep-alive\r\n\r\n"。 同时,在采用"GET"方法的情况下,请求uri的size不宜过大,确保可以在1个interval内传输完成,否则会被健康检查模块视为后端服务器或网络异常。
Syntax: check_http_expect_alive [ http_2xx | http_3xx | http_4xx | http_5xx ]
Default: http_2xx | http_3xx
Context: upstream
该指令指定HTTP回复的成功状态,默认认为2XX和3XX的状态是健康的。

status页面解释:
server number是后端服务器的数量
generation是Nginx reload的次数
Index是服务器的索引
Upstream是在配置中upstream的名称
Name是服务器IP
Status是服务器的状态
Rise是服务器连续检查成功的次数
Fall是连续检查失败的次数
Check type是检查的方式
Check port是后端专门为健康检查设置的端口
五、redis解决缓存问题
1、准备一台或多台redis服务器,安装redis
yum -y install redis
2、设置redis,使其监听在内网的网段。
sed -i '/^bind/c bind 127.0.0.1 172.16.1.61' /etc/redis.conf 《=========这里172.16.1.61是redis服务器自身的内网IP地址
3、启动redis
systemctl enable redis
systemctl start redis
4、web服务器端,补充安装php71w-pecl-redis模块
yum -y install php71w-pecl-redis
(PS:一定要检查一下这个依赖模块是否已经安装,否则,会出现“session_start(): Cannot find save handler 'redis' - session startup failed”的错误)
5、修改/etc/php.ini文件中session的配置
这里,可以参考/etc/php-zts.d/redis.ini文件中的示例,来修改/etc/php.ini文件
示例内容为:
; phpredis can be used to store PHP sessions. ; To do this, uncomment and configure below ;session.save_handler = redis ;session.save_path = "tcp://host1:6379?weight=1, tcp://host2:6379?weight=2&timeout=2.5, tcp://host3:6379?weight=2"
php.ini文件内容修改有三处。
| 修改前 | 修改后 |
| session.save_handler = files | session.save_handler = redis |
| ;session.save_path = "/tmp" | session.save_path = "tcp://172.16.1.61:6379" 《======此处根据需求修改 |
| session.auto_start = 0 | session.auto_start = 1 |
6、注释掉/etc/php-fpm.d/www.conf文件中相关行
;php_value[session.save_handler] = files 《=======提醒:该文件用“;”进行注释
;php_value[session.save_path] = /var/lib/php/session 《=======提醒:该文件用“;”进行注释
7、重启php-fpm服务
systemctl restart php-fpm
8、将配置好的php.ini文件和www.conf文件,推送到其他web服务器端
scp -r -P52113 /etc/php.ini root@172.16.1.8:/etc/php.ini
scp -r -P52113 /etc/php-fpm.d/www.conf root@172.16.1.8:/etc/php-fpm.d/www.conf
9、将所有web端服务器的php-fpm服务重启并检查
systemctl restart php-fpm
systemctl status php-fpm
六、nginx的四层负载均衡
1、四层负载均衡仅能做TCP/IP、UDP协议的转发,通常是用来做端口转发。
2、四层负载均衡可以用来解决七层负载均衡中的端口限制问题。(七层负载均衡中,最大使用的端口数量是65535)所以四层负载均衡通常用来解决大规模集群、高并发连接的情形。
3、四层负载均衡可以解决七层负载均衡的高可用问题。(四层负载均衡在七层负载均衡前端,能实现七层负载均衡的高可用)
4、四层负载均衡的转发效率比七层高很多,但仅支持tcp/ip协议,不支持http和https协议。后2者是七层协议。
nginx四层负载均衡示例:
1、准备两台七层负载均衡lb01、lb02,IP地址分别是172.16.1.5和172.16.1.6,并均配置使用nginx_upstream_check_module模块。 并对后端172.16.1.17-20的web服务器做负载均衡。示例配置:
upstream php {
server 172.16.1.17:80;
server 172.16.1.18:80;
server 172.16.1.19:80;
server 172.16.1.20:80;
check interval=3000 rise=2 fall=3 timeout=1000 type=tcp;
}
server {
listen 80;
server_name php.hcrbbs.top;
location / {
proxy_pass http://php;
include proxy_params;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
}
location /status {
check_status;
access_log off;
allow 10.0.0.0/24;
deny all;
}
}proxy_next_upstream的作用:如果后台服务连接超时,Nginx是本身是有机制的,如果出现一个节点down掉的时候,Nginx会更据你具体负载均衡的设置,将请求转移到其他的节点上,但是,如果后台服务连接没有down掉,但是返回错误异常码了如:504、502、500,这个时候你需要加一个负载均衡的设置,如下:
proxy_next_upstream http_500 | http_502 | http_503 | http_504 |http_404;
意思是,当其中一台返回错误码404,500...等错误时,可以分配到下一台服务器程序继续处理,提高平台访问成功率。
2、准备一台四层负载均衡proxy4_01,IP地址为172.16.1.3和10.0.0.3,按照官方方法,yum安装好nginx。并确定nginx是否带有--with-stream模块。
yum -y install nginx
nginx -V 《============此处,查看结果中是否有--with-stream参数。如果没有此参数,或者是--with-stream=dynamic,都要重新编译nginx,添加该模块。
3、四层负载均衡配置
先看nginx.conf文件配置:
include /etc/nginx/conf.c/*.conf;
conf.c目录下的proxy4_domain.conf文件内容:
stream {
upstream lb {
server 172.16.1.5:80;
server 172.16.1.6:80;
}
server {
listen 80;
proxy_connect_timeout 3s;
proxy_pass lb;
}
}注意:如果nginx.conf文件中server段是配置监听在80端口的,需要改掉80端口为其他端口或者把server段注释掉。
4、四层负载均衡的日志配置
server {
log_format proxy '$remote_addr - $remote_port - [$time_local] - $server_addr - $server_port $protocol '
'"$status" "$bytes_received" "$upstream_addr" "$upstream_bytes_sent" "upstream_connec_time"';
access_log /var/log/nginx/proxy.log proxy;
upstream xxx {
}
......
}七、nginx实现动静分离
动静分离的实现分为两类,一类是单台web实现动静分离。一类是基于web架构,通过七层负载均衡来实现动态资源和静态资源请求的分离。
单台web的动静分离——比如对一些纯静态资源,如js文件、jgp文件、css文件、gif文件、mp4文件等的请求,直接用location来处理定位。示例配置如下:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires max;
log_not_found off;
}
location ~* /robots.txt {
deny all;
}基于web架构的动静分离
基于web架构的动静分离,一般都是根据实际应用程序场景,决定动静分离是在七层负载均衡端实现,还是后端web服务器上去实现。由于演示代码环境不太好搭建,以下,仅抄录网上的一些配置实例,提供动静分离处理的思路。
user www;
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
pid /usr/local/nginx/nginx.pid;
worker_rlimit_nofile 102400;
events
{
use epoll;
worker_connections 102400;
}
http
{
include mime.types;
default_type application/octet-stream;
fastcgi_intercept_errors on;
charset utf-8;
server_names_hash_bucket_size 128;
client_header_buffer_size 4k;
large_client_header_buffers 4 32k;
client_max_body_size 300m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
client_body_buffer_size 512k;
proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
###2012-12-19 change nginx logs
log_format main '$http_x_forwarded_for - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $request_time $remote_addr';
#这里为后端服务器wugk应用集群配置,根据后端实际情况修改即可,tdt_wugk为负载均衡名称,可以任意指定
#但必须跟vhosts.conf虚拟主机的pass段一致,否则不能转发后端的请求。
upstream tdt_wugk {
server 10.10.141.30:8080 weight=1max_fails=2fail_timeout=30s;
server 10.10.141.30:8081 weight=1max_fails=2fail_timeout=30s;
server 10.10.141.31:8080 weight=1max_fails=2fail_timeout=30s;
server 10.10.141.31:8081 weight=1max_fails=2fail_timeout=30s;
server 10.10.141.32:8080 weight=1max_fails=2fail_timeout=30s;
server 10.10.141.32:8081 weight=1max_fails=2fail_timeout=30s;
}
#这里为后端APP应用负载均衡配置,根据后端实际情况修改即可。tdt_app为负载均衡名称,可以任意指定
upstream tdt_app {
server 10.10.141.40:8080 weight=1max_fails=2fail_timeout=30s;
server 10.10.141.40:8081 weight=1max_fails=2fail_timeout=30s;
server 10.10.141.41:8080 weight=1max_fails=2fail_timeout=30s;
server 10.10.141.41:8081 weight=1max_fails=2fail_timeout=30s;
server 10.10.141.42:8080 weight=1max_fails=2fail_timeout=30s;
server 10.10.141.42:8081 weight=1max_fails=2fail_timeout=30s;
}
#include引用vhosts.conf,该文件主要用于配置Nginx 虚拟主机
include vhosts.conf;
}vhosts.conf文件内容:
####www.wuguangke.cn
server
{
listen 80;
server_name www.wuguangke.cn;
index index.html index.htm;
#配置发布目录为/data/www/wugk
root /data/www/wugk;
location /
{
proxy_next_upstream http_502 http_504 error timeout invalid_header;
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://tdt_wugk;
expires 3d;
}
#动态页面交给http://tdt_wugk,也即我们之前在nginx.conf定义的upstream tdt_wugk 均衡
location ~ .*\.(php|jsp|cgi)?$
{
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://tdt_wugk;
}
#配置Nginx动静分离,定义的静态页面直接从Nginx发布目录读取。
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
root /data/www/wugk;
#expires定义用户浏览器缓存的时间为3天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力
expires 3d;
}
#定义Nginx输出日志的路径
access_log /data/logs/nginx_wugk/access.log main;
error_log /data/logs/nginx_wugk/error.log crit;
}
##########chinaapp.sinaapp.com 2012-12-19
server
{
listen 80;
server_name chinaapp.sinaapp.com;
index index.html index.htm;
root /data/www;
location /
{
proxy_next_upstream http_502 http_504 error timeout invalid_header;
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://tdt_app;
expires 3d;
}
location ~ .*\.(php|jsp|cgi)?$
{
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://tdt_app;
}
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
root /data/www/app;
expires 3d;
}
access_log /data/logs/nginx_app/access.log main;
error_log /data/logs/nginx_app/error.log crit;
}
