环境介绍
主机名 |
系统环境 |
Ip地址 |
|
Nginx |
nginx |
Centos 6.6 64位 |
172.16.4.100 |
Web-01 |
Web-01 |
Centos 6.6 64位 |
172.16.4.101 |
Web-02 |
Web-02 |
Centos 6.6 64位 |
172.16.4.102 |
安装nginx
使用官网制作好的rpm包
[[email protected] ~]# rpm -ivh nginx-1.6.2-1.el6.ngx.x86_64.rpm [[email protected] ~]# service nginx start
访问测试,出现如下页面表示nginx安装正常
反向代理
功能:用户请求服务时请求nginx服务器,nginx根据用户请求的信息,和服务器的设置判断交给什么服务器进行处理。
配置示例:
server{ #在server段中定义 listen server_name location/ { #当访问这个location的时候,转发到其他web服务器 proxy_passhttp://172.16.4.100:80/; #定义转发的服务器 } }
两个例外:
1、模式匹配:如果使用正则表达式向后匹配,那么location给出的url就不是真正的URL而是一个模式,模式是无法向后映射成为URL的路径的,会在转发服务器的路径后添加这个模式对应的路径。
location /uri { #这个url路径如果使用模式匹配 proxy_passhttp://back_server:port/newuri/url; #那么映射后的路径就不是newurl,而是在newurl后面补上匹配到的url路径 }
2、设置了rewrite指令
location /uri { rewrite proxy_passhttp://back_server:port/重写后的路径;#会在请求页面后直接添加重写后的路径 }
设置反向代理
代理所有请求到后端web server配置
后端web服务器设置
提供web页面,并启动web服务即可
[[email protected] ~]# echo "WEB-01" >>/var/www/html/index.html [[email protected] ~]# service httpd start
Nginx设置
设置前先备份配置文件
[[email protected] ~]# cd /etc/nginx/conf.d/ [[email protected] conf.d]# cp default.conf{,.bak}
修改配置文件
[[email protected] conf.d]# vim default.conf server { listen 80; server_name localhost; location/ { #root /usr/share/nginx/html; proxy_pass #表示将用户请求转发到172.16.4.101服务器 index index.html index.htm; } }
访问nginx就跳转到了后端的web-01服务器
只代理一个目录配置
将访问nginx服务器bbs的目录的请求转发给后端web服务器
Web服务器设置
[[email protected] ~]# mkdir /var/www/html/bbs [[email protected] ~]# echo "WEB-01-bbs">> /var/www/html/bbs/index.html
Nginx设置
location/ { root /usr/share/nginx/html; #proxy_pass http://172.16.4.101/; index index.html index.htm; } location/bbs/ { proxy_pass http://172.16.4.101/bbs/; }
验证:
访问首页是nginx服务器响应
访问bbs目录是后端web服务器响应
路径别名
将访问forum的URL,转发到后端的bbs。不一定要location的URL和后端一致。
location/forum/ { proxy_pass http://172.16.4.101/bbs/; }
访问forum目录,但是响应的内容确实bbs目录
使用正则表达式的匹配
将所有图片定义到指定的后端服务器
Web服务器需要在指定目录放一张图片即可
[[email protected] ~]# ll /var/www/html/ total 124 -rw-r--r-- 1 root root 104372 Mar 7 20101.jpg
Nginx配置
location~* \.(jpg|png|gif)$ { proxy_pass http://172.16.4.101; }
验证,访问nginx服务器但是出现了web服务器提供的图片
把图片放到指定的目录
nginx配置文件的设置方法和上面一样不需要改变
location~* \.(jpg|png|gif)$ { proxy_pass http://172.16.4.101; }
只需要web服务器把图片放到指定目录即可
[[email protected] html]# mkdir images [[email protected] html]# cp 1.jpg images/
验证,出现的图片还是后端web服务器的
处理日志问题
查看httpd的访问日志,发现是nginx服务器访问的而不是客户端,这样不利于做日志的分析
[[email protected] ~]# tail /var/log/httpd/access_log 172.16.4.100 - - [27/May/2015:10:00:14 +0800]"GET / HTTP/1.0" 200 7 "-" "curl/7.19.7(x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.15.3 zlib/1.2.3 libidn/1.18libssh2/1.4.2"
解决方法
Nginx服务器设置,将用户请求报文封装一份,发送给后端web服务器
location/forum/ { proxy_pass http://172.16.4.101/bbs/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location~* \.(jpg|png|gif)$ { proxy_pass http://172.16.4.101; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }
Httpd服务器设置
修改日志记录方式
LogFormat "%{X-Real-IP}i %l %u %t\"%r\" %>s %b \"%{Referer}i\"\"%{User-Agent}i\"" combined
客户端访问一次,查看日志就是记录客户端的地址了
[[email protected] html]# tail -1 /var/log/httpd/access_log 172.16.250.208 - - [27/May/2015:11:13:27 +0800]"GET /bbs/ HTTP/1.0" 304 - "-" "Mozilla/5.0 (WindowsNT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81Safari/537.36"
代理段其他参数说明:
proxy_connect_timeout:指定连接后端服务器超时时长
proxy_hide_header:设定发给客户端的报文隐藏首部
proxy_read_timeout:后端接受了nginx请求报文,但是没有响应的超时时间
proxy_pass_request_headers on|off:nginx收到客户端请求报文后,直接封装成新报文,发送给后端服务器
proxy_buffer:缓冲大小
Nginx代理缓存
修改nginx配置文件,在httpd字段中设置缓存目录
[[email protected] ~]# vim /etc/nginx/nginx.conf proxy_cache_path /cache/nginx/ levels=1:1keys_zone=mycache:32M
配置说明:
proxy_cache_path /cache/nginx/ #指定缓存目录
levels=1:1 #指定目录级别
keys_zone=mycache:32M #指定缓存在内存中的名称和大小(内存中只有键,没有值)
缓存目录级别说明:
levels=1:1 #标志缓存有2级子目录,一级子目录一个字符,二级子目录两个字符
levels=2:2 #表示缓存2级子目录,一级子目录有两个字符,2级子目录有两个字符
最多有三级目录,每个目录最多有三个字符
设置缓存目录
[[email protected] ~]# mkdir -p /cache/nginx [[email protected] ~]# chown -R nginx:nginx /cache/nginx/
定义server或location启用缓存
location/forum/ { proxy_cache mycache; #启用缓存,指明缓存所在的内存空间名称 proxy_cache_valid 200 1d; #200状态码内容缓存一天 proxy_cache_valid 301 302 10m; #301,302状态码缓存10分钟 proxy_cache_valid any 1m; #所有内容缓存1分钟 proxy_cache_use_stale error timeout http_500 http_502 http_503; #后端服务器错误,响应超时,出现5xx类状态码的请求可以使用过期缓存 proxy_pass http://172.16.4.101/bbs/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location~* \.(jpg|png|gif)$ { proxy_cache mycache; proxy_cache_valid 200 1d; proxy_cache_valid 301 302 10m; proxy_cache_valid any 1m; proxy_cache_use_stale error timeout http_500 http_502 http_503; proxy_pass http://172.16.4.101; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }
设置完成之后,使用客户端访问一次在缓存目录下就会产生缓存,用户再次访问相同内容就是在缓存中响应,效果和启用持久连接类似
[[email protected] ~]# tree /cache/nginx/ /cache/nginx/ └── e └── d └── 29262f3ee6c380561111eba521f7cfde
说明:如果将缓存目录的磁盘为固态硬盘,并且做成RAID1,那么性能就是非常牛逼的。
负载均衡模块
proxy_pass有一个缺点,就是只能代理一个主机,而负载均衡就是可以定义一个组,可以被proxy_pass代理,而且还可以根据调度算法代理。
配置负载均衡:
说明:配置之前关闭缓存功能,否则影响验证效果。
后端准备两台web服务器提供不同web页面以便验证负载均衡效果。
[[email protected] ~]# echo "web-01" > /var/www/html/bbs/index.html [[email protected] ~]# echo "web-02" > /var/www/html/bbs/index.html
定义组,将后端web服务器01和02定义为一个组
在http字段定义
[[email protected] ~]# vim /etc/nginx/nginx.conf upstreamup servers { server 172.16.4.101; server 172.16.4.102; }
转发时使用upstream定义的组
location/forum/ { proxy_pass http://upservers/bbs/; #将原本的转发地址设置为upstream组 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }
验证负载均衡,默认为轮询
[[email protected] ~]# curl 172.16.4.100/forum/ web-01 [[email protected] ~]# curl 172.16.4.100/forum/ web-02 [[email protected] ~]# curl 172.16.4.100/forum/ web-01 [[email protected] ~]# curl 172.16.4.100/forum/ web-02
定义后端服务器权重
Server后根weight=number定义服务器权重
upstreamupservers { server172.16.4.101 weight=2; server172.16.4.102; }
访问验证:
[[email protected] ~]# curl 172.16.4.100/forum/ web-01 [[email protected] ~]# curl 172.16.4.100/forum/ web-02 [[email protected] ~]# curl 172.16.4.100/forum/ web-01 [[email protected] ~]# curl 172.16.4.100/forum/ web-01 [[email protected] ~]# curl 172.16.4.100/forum/ web-02 [[email protected] ~]# curl 172.16.4.100/forum/ web-01 [[email protected] ~]# curl 172.16.4.100/forum/ web-01
基于ip地址哈希调度
upstreamupservers { ip_hash; #表示启用基于ip地址哈希调度的方法 server172.16.4.101; server172.16.4.102; }
访问验证,相同的ip地址访问就始终定位到一台服务器响应
[[email protected] ~]# curl 172.16.4.100/forum/ web-02 [[email protected] ~]# curl 172.16.4.100/forum/ web-02 [[email protected] ~]# curl 172.16.4.100/forum/ web-02
后端服务器健康检测
max_fails=number 错误到达指定次数,标记为失败,在可用列表中移除
fail_timeout=time 超时时长
upstream定义
upstreamupservers { server172.16.4.101 max_fails=2 fail_timeout=1; server172.16.4.102 max_fails=2 fail_timeout=1; }
当掉web-02服务器访问验证,web2就不会出现了
[[email protected] ~]# curl 172.16.4.100/forum/ web-01 [[email protected] ~]# curl 172.16.4.100/forum/ web-01 [[email protected] ~]# curl 172.16.4.100/forum/ web-01
手动下线服务器
down 和 backup
down一直不用
backup所有主机不可用才使用
示例:标记web-02为备用,那么主要web-01可用就不会使用web-02
upstreamupservers { server172.16.4.101 max_fails=2 fail_timeout=1; server172.16.4.102 max_fails=2 fail_timeout=1 backup; }
关闭web-01的httpd服务,web-02就可用了
访问验证
[[email protected] ~]# curl 172.16.4.100/forum/ web-02 [[email protected] ~]# curl 172.16.4.100/forum/ web-02 [[email protected] ~]# curl 172.16.4.100/forum/ web-02
自定义响应首部:
示例:返回响应服务器地址
server { listen 80; server_name localhost; add_header X-via $server_addr; #添加这一行内容即可 …… }
缓存命中返回
修改配置文件
server { listen 80; server_name localhost; add_header X-via $server_addr; add_header X-Cache $upstream_cache_status; #返回命中信息 location/forum/ { proxy_pass http://172.16.4.101/bbs/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_cachemycache; #返回响应时,需要开启缓存功能 proxy_cache_valid 200 1d; proxy_cache_valid 301 302 10m; proxy_cache_valid any 1m; proxy_cache_use_stale error timeout http_500 http_502 http_503; } }
第一次访问未命中
第二次访问命中
官方配置资料:
代理和缓存:http://nginx.org/en/docs/http/ngx_http_proxy_module.html
负载均衡:http://nginx.org/en/docs/stream/ngx_stream_upstream_module.html