在日常运维工作中,运维人员会时常使用到nginx的反向代理,负载均衡以及缓存等功能来优化web服务性能。
一、后端的Real Server的准备
两台RS服务器(192.168.1.104/192.168.1.105)要事先配置好nginx。 二、nginx代理服务器192.168.1.103(假设外网ip是111.112.114.23)的配置 1.nginx反向代理和缓存
0)安装依赖软件(如果是ubuntu系统,则sudo apt-get update && sudo apt-get upgrade && sudo apt-get install libpcre3 libpcre3-dev zlib1g-dev libssl-dev build-essential openssl libssl0.9.8 libssl-dev)
1)首先添加用户nginx,实现以之运行nginx服务进程:
2)接着开始编译和安装: #以上编译安装nginx后,--http-client-body-temp-path、--http-proxy-temp-path、--http-fastcgi-temp-path、--http-uwsgi-temp-path、--http-scgi-temp-path默认的路径就在/usr/local/nginx下,分别是client_body_temp、proxy_temp、fastcgi_temp、scgi_temp、uwsgi_temp
[root@node1 src]# cd /usr/local/nginx/ 3)反代的实现,和缓存的开启(可参考:nginx缓存配置的操作记录梳理)
[root@node1 src]# vim /usr/local/nginx/conf/nginx.conf #要想开启nginx的缓存功能,需要添加此处的两行内容!
#这一行分别表示:定义缓存存储目录,手动创建;缓存级别,表示缓存目录的第一级目录是1个字符,第二级目录是2个字符;内核中建立用于缓存缓存数据源数据的空间,查找缓存的时候,先从这个内核空间中找到,缓存数据的源数据,然后再到对应目录中查找缓存;这一行分别表示:缓存空间最大值;缓存的数据,60分钟内没有被访问过就删除
#这一行分别表示:创建缓存的时候可能生成一些临时文件存放的位置,自动创建
server {
[root@node1 src]# mkdir /var/www/cache
4)验证结果
---------------------------------------------------------------------------------------------------------
proxy_set_header参数解释
--------------------------------------------------------------------------------------------------------- 2.url的重写
----------------------------------------------------------------------------- rewrite regex replacement [flag]
Regex:被代替的原URL路径,可以是莫须有的,不存在的,支持正则表达式
a)
rewrite /images/.*\.jpg /images/a.jpg last;
b)
c)
d) -----------------------------------------------------------------------------
下面是nginx配置文件中的配置,简单实现url的重写配置(可以在vhosts虚拟主机配置里设置)
server {
location / {
location /text { } [root@node1 src]# mkdir /var/www/html/text
注意: 3.nginx实现带健康状态检测的负载均衡 nginx要能够检测后端nginx的健康状态,需要新的模块,重新编译nginx 模块的使用:healthcheck_nginx_upstreams-master.zip
下载模块,下载到本机的/usr/loca/src目录下
[root@node1 ~]# cd /usr/local/src
接下来切换到nginx解压目录,打补丁~
然后重新编译nginx,加上healthcheck_nginx_upstreams-master模块 [root@node1 src]# make && make install
接下来配置实现nginx带健康状态的负载均衡:
server { server_name localhost;
location / {
}
----------------------------------------------------------------------------------------
healthcheck_enable //开启健康探测功能 proxy_pass http://cluster //与upstream cluster相对应,在访问http://111.112.114.23时将流量转发到cluster组内机器上
location /stats //定义一个站点,用来查看后方服务器的健康状况
最后,重启nginx
测试: 访问http://111.112.114.23,第一次出现的如果是RS1的访问结果,那么再刷一下,就会出现RS2的访问结果,这样就看出了负载均衡的效果。
可以查看后端两台Real Server服务器的健康状态:
关闭RS1的nginx服务,再次访问http://111.112.114.23/stat查看后端机器状态,就会发现RS1的健康状态已提示Bad,即显示后端的192.168.1.101的RS1不能正常连接。
这样就实现了负载均衡和健康探测,但依然不能满足高并发量,再次用ab进行测试:
但是,这样通过nginx代理可以满足的最大连接请求依然没有直接访问RS的大!
[root@node1 src]# ab -c 100 -n 10000 http://111.112.114.23/test.jpg
继续做优化!如下: proxy_cache_path /var/www/cache levels=1:2 keys_zone=mycache:20m max_size=2048m inactive=24h; proxy_temp_path /var/www/cache/tmp;
upstream cluster { }
server {
location / {
}
-------------------------------------------------------------- proxy_set_header //允许重新定义或者添加发往后端服务器的请求头。 proxy_cache //指定用于页面缓存的共享内存。 proxy_cache_valid //为不同的响应状态码设置不同的缓存时间。
proxy_cache_use_stale //指定后端服务器出现状况时,nginx可以使用的过期缓存
接着重启nginx服务 [root@node1 src]# mkdir /var/www/cache #这个前面做缓存时,已经创建了。 再次进行压力测试,可以看到通过nginx代理可以满足的最大连接请求已经达到了5000多,超过了直接访问RS的最大连接请求了! 这样负载均衡+健康探测+缓存已经完成! [root@node1 src]# ab -c 100 -n 10000 http://111.112.114.23/test.jpg
接下来一个问题就是在启用缓存之后的访问问题,试着重新访问一下该站点http://111.112.114.23:
即第一次访问http://111.112.114.23时访问到了192.168.1.104(即RS1),显示结果是:“welcome to 192.168.1.104”,前端nginx将本次的访问结果放入本地缓存,在缓存未失效之前,访问http://111.112.114.23时实际上是nginx的本地缓存提供的访问结果,依然显示“welcome to 192.168.1.104”的页面。
看看缓存目录中有没有内容 (责任编辑:IT) |