标签:
一:前言
Nginx是一个支持反向代理、负载均衡、页面缓存、URL重写以及读写分离的高性能Web服务器。
二:环境准备
1、操作系统
CentOS 6.4 X86_64
[root@shinezone logs]# cat /proc/version Linux version 2.6.32-358.el6.x86_64 (mockbuild@c6b8.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) ) #1 SMP Fri Feb 22 00:31:26 UTC 2013
2、软件版本
Nginx 1. 2版本
[root@nginx conf]# /data1/app/services/nginx/sbin/nginx -V nginx version: nginx/1.2.8 built by gcc 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) TLS SNI support enabled configure arguments: --user=www --group=www --prefix=/data1/app/services/nginx --with-poll_module --with-pcre --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module [root@nginx conf]#
3、Nginx安装
备注:这里我是使用的公司rpm包一键打包成的,这里地址不方便透露。Nginx官网 www.nginx.org官网下载直接安装编译即可。
4、实验机器
172.17.0.43 web.proxy.com
172.17.17.17 web01.test.com
172.17.92.132 web02.test.com
5、时间同步
备注:这里需要把3台机器时间同步到一直。我是手动设置的。
yum install ntp -y netdate 202.102.2.101
6、关闭防火墙&Selinux
备注:三台机器都为同样的操作。
[root@nginx conf]# /etc/init.d/iptables stop [root@nginx conf]# setenforce 0 setenforce: SELinux is disabled
三:Nginx反向代理
这里我是一键rpm装的,路径是打包定义好的。安装路径为
/data1/app/services/nginx
在做反向代理的时候我们需要准备2台web服务器。
1、web01安装httpd
yum install httpd -y
2、web02安装httpd
yum install httpd -y
3、提供测试页面,我这里是php做的测试,一个为DZ论坛一个为PHP测试页面。当然你们也可以用静态的,如下:
[root@web01~] echo "<h1>web01.test.com</h1>" > /var/www/html/index.html [root@web02~] echo "<h1>web02.test.com</h1>" > /var/www/html/index.html
4、启动2台Apache测试机的httpd服务
[root@web01 ~]# service httpd start
[root@web02 ~]# service httpd start
5、测试一下。
上面我说到了我的web01是DZ,web02是PHPinfo
访问web01截图如下:
访问web02截图如下:
这里前提环境都没有问题,简单说下方向代理和正向代理。
正向代理:也就是传说中的代理,他的工作原理就像一个跳板,简单来说,我是一个User,我访问不了某个网站,但是我可以访问一个代理服务器,
这个代理服务器可以直接访问到我想要访问的某个网站,于是我先连接到代理服务器,然后告诉代理服务器我要访问的网站,代理服务器去给我把我想要的内容取过来,然后生成缓存转发给我,从网站的角度来看,只是在代理服务器来取内容的时候又一次记录,有时候并不知道是用户的请求,也隐藏了用户的资料。
结论就是,正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,
为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),
然后代理向原始服务器转交请求并将获得的内容返回给客户端。
客户端必须要进行一些特别的设置才能使用正向代理。
反向代理:如,User想要访问www.test.com/redmine,但是www.test.com上面并没有redmine页面,他是偷偷从另一台服务器取回来的,然后作为自己的内容来返回USer,但是这里的User并不知情,这里的例子就是反向代理。
结论就是,反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样
(3).两者区别
从用途上来讲:
正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。反向代理的典型用途是将防火墙后面的服务器提供给Internet用户访问。反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。另外,反向代理还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下
从安全性来讲:
正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。
6.nginx 代理模块
说明:代理模块的指令有很多我这里只讲解重要的proxy_pass,想了解更多代理指令请参考官方中文文档。
这个模块可以转发请求到其他的服务器。HTTP/1.0无法使用keepalive(后端服务器将为每个请求创建并且删除连接)。nginx为浏览器发送HTTP/1.1并为后端服务器发送HTTP/1.0,这样浏览器就可以为浏览器处理keepalive。
cd /data1/app/services/nginx/conf cp nginx.conf nginx.conf.bak20160708 vim nginx.conf location / { proxy_pass http://172.17.17.17:80; }
语法:proxy_pass URL
默认值:no
使用字段:location, location中的if字段
这个指令设置被代理服务器的地址和被映射的URI,地址可以使用主机名或IP加端口号的形式,
例如:proxy_pass http://localhost:8000/uri/;
8.重新加载一下配置文件
[root@nginx conf]# service nginx reload
9、测试一下,当我们访问代理服务器IP的时候则跳转到了172.17.17.17
五、Nginx负载均衡
注,大家可以看到,由于我们网站是发展初期,nginx只代理了后端一台服务器,但由于我们网站名气大涨访问的人越来越多一台服务器实在是顶不住,于是我们加了多台服务器,
那么多台服务器又怎么配置代理呢,我们这里以两台服务器为案例,为大家做演示。
1.upstream 负载均衡模块说明
案例:
下面设定负载均衡的服务器列表
unstream webserver { ip_hash; server 172.17.17.17:80; server 172.17.17.18:80 down; server 172.17.17.19:8009 max_fails=3 fail_timeout=30s; server 172.17.17:20:8080; } server { location / { proxy_pass http://webserver } }
upstream是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。在上面的设定中,通过upstream指令指定了一个负载均衡器的名称test.net。这个名称可以任意指定,在后面需要用到的地方直接调用即可
2.upstream 支持的负载均衡算法
2.upstream 支持的负载均衡算法
Nginx的负载均衡模块目前支持4种调度算法,下面进行分别介绍,其中后两项属于第三方调度算法。
轮询(默认)。每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。Weight 指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。
ip_hash。每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。
fair。这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。
url_hash。此方法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。
3.upstream 支持的状态参数
在HTTP Upstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:
down,表示当前的server暂时不参与负载均衡。
backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
注,当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。
4、配置Nginx负载
[root@nginx conf]# pwd /data1/app/services/nginx/conf [root@nginx conf]# vim nginx.conf upstream webserver { ip_hash; server 172.17.17.17 weight=1 max_fails=2 fail_timeout=2; server 172.17.92.132 weight=1 max_fails=2 fail_timeout=2; # server 127.0.0.1:8080 backup; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.php index.htm; proxy_pass http://webserver; proxy_set_header X-Real-IP $remote_addr; }
5、重新加载一下配置文件。
/data1/appservices/nginx/sbin/nginx -s reload
6.测试
但大家想一下,如果不幸的是所有服务器都不能提供服务了怎么办,用户打开页面就会出现出错页面,那么会带来用户体验的降低,所以我们能不能像配置LVS是配置sorry_server呢,答案是可以的,但这里不是配置sorry_server而是配置backup。
7、配置backup服务器。
#gzip on; server { listen 8080; server_name localhost; root /data1/www/errorpage; index index.html; } upstream webserver { #ip_hash; server 172.17.17.17 weight=1 max_fails=2 fail_timeout=2; server 172.17.92.132 weight=1 max_fails=2 fail_timeout=2; server 127.0.0.1:8080 backup; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.php index.htm; proxy_pass http://webserver; proxy_set_header X-Real-IP $remote_addr; }
mkdir -pv /data1/www/errorpage echo "Sorry....." > /data1/www/errorpage/index.html
8、配置ip_hash负载均衡
server { listen 8080; server_name localhost; root /data1/www/errorpage; index index.html; } upstream webserver { ip_hash; server 172.17.17.17 weight=1 max_fails=2 fail_timeout=2; server 172.17.92.132 weight=1 max_fails=2 fail_timeout=2; #server 127.0.0.1:8080 backup; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.php index.htm; proxy_pass http://webserver; proxy_set_header X-Real-IP $remote_addr; }
ip_hash,每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。(一般电子商务网站用的比较多)
[root@shinezone logs]# netstat -antp | grep 80 | wc -l 62 [root@shinezone logs]# netstat -antp | grep 80 | wc -l 172
标签:
原文地址:http://www.cnblogs.com/yangxiaofei/p/5654307.html