如何使用Nginx配置虚拟服务器和做负载均衡
1 起因
对于反向代理等一些国际知名的热点名词我一向是不感冒的。谦虚讲就是不会。我认为我们根本用不到这些概念,也没有必要浪费时间学习。结果Nginx这么NB这么好用的一个软件一直,一直被我忽视着。
直到有料上线,要蹭服务器用,既得保证原有的其他系统正常能被访问,还得让有料域名得到相应。我才再一次想到了它。
2 问题
A.蹭服务器用的问题: www.aaa.com 域名解析向 外网IP 123.123.123.123,同时www.aaa.net域名也解析向外网IP 123.123.123.123。同时这个外网IP的内网地址10.10.10.10上原来就有一个不能停止的服务。内网需要继续用用这个内网地址来使用原有的系统。而且都在80端口上。
B.性能的问题:假设WEB系统名WOS,因存在性能问题扩展了另两台WEB服务器,原有一天服务器就变成3台了,如何解决发布问题,如何解决负载均衡的问题。
3 理解反向代理的概念
不的不承认,世界是又天才的。
-
有人为了蹭网发明了代理服务器,就是局域网中有一台能上网的机器,其他机器使用这台机器作为代理访问internet。这样,一台局域网内能上网的机器就使得所有局域网内的机器都能上网了。这种就是正向代理;
-
有人为了蹭服务资源发明了反向代理,就是局域网中有一台能被互联网访问到的机器,internet上的请求通过这台机器代理转向局域网内原本的不到请求的其他机器上WEB应用去响应,再把结果回送给请求的internet。这样,原本只有一台机器的web应用上能被internet访问到的,变成局域网内提供的所有web应用都能被internet访问到。这种就是反向代理。
原来我不喜欢“反向代理”这个名词,就如同我不喜欢“IOC”控制翻转一样。在没实际体验到概念的威力时,我就是BS他们,认为这是文字游戏。但是,注意我要说但是了,这些概念一旦被开发和管理的实际所验证,我就会完全认同并加以推崇。亡羊补牢,嘿嘿。
4 解决A问题,蹭服务器资源(IP资源,也就是把一台服务器当两台用)
易经讲,一而二,二而三,三生万物。三以后的就不用说了。所以我就讲一台怎么蹭,之于内部还加二级或多级的nginx或虚拟的服务器。道理就一样一样的了。
简单起见,我使用的是windows版本的nginx,性能没有仔细考量过,既然是官方的版本,相信总比IIS要强多了吧。我写下这些文字的时候,版本最新是1.3.13,推荐使用稳定的版本是,1.2.7 下载地址:http://nginx.org/download/nginx-1.2.7.zip。软件包特别小,1.14M,如果还有人记得磁盘的话,一张普通的磁盘就可完整容纳了。
解压到某目录后即可使用。由于我们是非研究性使用,一般就关注一个nginx.exe和conf目录即可。
对于nginx重点就在于配置conf文件。nginx启动后会根据/conf/nginx.conf文件中的配置情况来完成反向代理。
配置好的nginx.conf内容如下:
worker_processes 1;#一般配置与CPU核心数一致,可获取最大性能
events {
worker_connections 1024;}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
gzip on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
include youliaoo.conf;#把对服务器的配置写在一个独立的文件里,在nginx主配置文件里加载一下}
需要把youliaoo.conf文件也放在/conf/目录与nginx.conf相同目录中。内容如下:
#第一个服务
server {
listen 80;#监听80端口
server_name 10.10.10.10;#请求的头包含10.10.10.10
location /{#配置地址映射,对/进行配置的话就将所有请求进行转发
proxy_pass http://10.10.10.10:8800;#目标地址我将原有在10机80端口的WEB应用改到8800端口服务,当然也可以是其他局域网能够访问的地址
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}#第二个服务
server {
listen 80;#监听80端口#对于server_name,需要将多个域名的请求进行反向代理,所以可以配置多个server_name来满足要求
server_name www.youliaoo.com;
server_name www.youliaoo.net;
server_name youliaoo.com;
server_name youliaoo.net;
location /{#同样将所有地址进行方向代理,如果应用的规模大,还可以将注册划到一个服务器上处理、登录划到一个服务器处理、静态划到一个服务器处理等等
proxy_pass http://10.10.10.10:8080;#youliaoo系统的服务地址,局域网地址,我还是用10的机器做,也可以配置到局域网内的其他地址上去
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}
这样配置下,使用10.10.10.10来的请求将全部转发给运行在10.10.10.10:8800处理,而使用www.youliaoo.com或其他域名来的请求将被转发到10.10.10.10:8080处理。
这样配置后运行nginx.exe就会在进程中出现两个nginx.exe。因为我们配置的worker_processes 是1,如果是2的话就会有3个进程。
对于internet的访问者来讲,服务是透明的,仍然与独立享有两台服务器一样的效果。特别可以注意到,第二个服务的配置,你就可以参照配置第三个第四个。命名不同的server_name就可以实现了。
5 解决B问题,平行扩展资源使用nginx做负载均衡来提高性能
在我们假设的WEB应用系统WOS上,我们有条件增加局域网内的其他服务器资源,问题一,这些服务器只能从内网访问到,问题二,需要人为发布静态的链接地址由用户去选择。解决这些问题一个要解决隐藏其他平行扩展出来的服务器地址只发布一个地址的问题,还要解决这些服务的负载均衡问题。 我假设除了10机我们还有11,12,13,14等4台其他运行相同WEB应用的服务器可供使用。
nginx的配置还是不变,我们还是以包含的方式来配置服务器。注意上文提到的include youliaoo.conf;这句。我们来配置youliaoo.conf这个文件来达到目的。
upstream otherRes {#定义负载均衡服务器组,地址都是内网的地址哦,这其实无所谓,只要是装配nginx这台服务器能访问的地址形式都可以。
ip_hash;#这里要注意,有些应用系统使用session来实现身份认证,那么这个一定要加上。
server 10.10.10.10 weight=1;#配置地址,weight是做负载均衡时的分配权重,越大被分配来处理请求的几率就越大。
server 10.10.10.11 weight=5;#配置地址,配置1或5或10,或其他数值没有实际的意义,仅用于描述权重的分配。没有上限
server 10.10.10.12 weight=10;
server 10.10.10.13 weight=10;
server 10.10.10.14 weight=10;}
server {
listen 80;#监听80端口
server_name 10.10.10.10;#使用10.请求过来的全部相应
location /{#将所有请求地址进行代理
proxy_pass http://otherRes;#分配到我们定义好的服务器组上去,按负载均衡的配置进行请求的代理分配
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}
OK了,下面如果你已经运行了nginx请在任务管理器中结束那个占用内存较小的那个进程。再次运行nginx.exe。当然你也可以使用命令行nginx -s restart。貌似windows里开命令行还是直接结束任务更方便吧。
同过上面的配置在一台服务器性能不足够时,可以平行扩展服务器资源。从外部访问的视角,系统没有任何变化,只是处理能力更强了。而且我们可以根据服务器的实际资源情况来分配weight调配一下处理的量。当然nginx还有同过访问相应时间进行均衡,设置失败次数来标示当机等功能。可以仔细查查nginx的手册实现。一般的应用,使用以上的配置,足矣。
BINGO!