最近的项目,客户要求保证应用的高可用、高稳定、高安全性。经过实际的目标受众分析,我们最终采用Nginx进行负载均衡。

为什么使用Nginx

1.实现反向代理。反向代理,即是以代理服务器来接受客户端请求,将请求转发给内部服务器,并将从服务器上得到的结果返回给客户端。顺带一提,正向代理,即是客户端配置转发代理来访问其他站点,发起的请求经过代理服务器,从原始服务器得到响应结果后再转发给客户端。总结起来就是:正向代理代理客户端,隐藏客户端,反向代理代理服务器,隐藏服务端。

2.实现负载均衡。将流量负载分摊到不同的服务单元,保证服务器的高可用。Nginx内置策略有加权轮询和ip_hash,同时也支持fair/url_hash等第三方扩展策略。

3.实现动静分离。将css/js/图片等静态文件交由代理服务器处理,其他动态资源经代理服务器,转发至内部服务器处理并返回结果。在实现动静分离的同时,也在一定程度上参与了负载均衡。

Nginx安装配置

1.安装编译工具及库文件
yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel
2.安装 PCRE,PCRE 作用是让 Ngnix 支持 Rewrite 功能
#wgethttp://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz
#tar zxvf pcre-8.35.tar.gz
#cd pcre-8.35
#./configure
#make && make install
3.安装 Nginx
http://nginx.org/
#wgethttp://nginx.org/download/nginx-1.11.6.tar.gz
#tar zxvf nginx-1.11.6.tar.gz
#cd nginx-1.11.6
#./configure (--prefix=/usr/local/webserver/nginx--with-http_stub_status_module
--with-http_ssl_module--with-pcre=/usr/local/src/pcre-8.35)
#make && make install
#/usr/local/webserver/nginx/sbin/nginx -v查看安装的nginx版本
注:若不指定prefix,Nginx默认安装在/usr/local目录下:
/usr/local/nginx/sbin/nginx -t       检查配置文件ngnix.conf的正确性命令
/usr/local/nginx/sbin/nginx          启动 Nginx
/usr/local/nginx/sbin/nginx -s stop  停止Nginx
/usr/local/nginx/sbin/nginx -s reopen重启 Nginx
/usr/local/nginx/sbin/nginx -s reload重新载入配置文件

配置文件示例:

#user  nobody;        #Nginx用户及组
worker_processes  1;  #工作进程的数量,通常等于CPU数量或者2倍于CPU
(worker_processes auto;worker_cpu_affinity auto;这样设置进程自动寻找cpu)
#错误日志:存放路径
#error_log logs/error.log;
#error_log logs/error.log  notice;
#error_log logs/error.log  info;
#pid(进程标识符):存放路径
#pid       logs/nginx.pid;
#最大连接数 = worker_processes * worker_connections/4
events {
   worker_connections  1024;#工作进程的最大连接数量
}
http {
    #设定mime类型,类型由mime.type文件定义
    include       mime.types;
    default_type  application/octet-stream;
#(日志格式设置。
$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;
$remote_user:用来记录客户端用户名称;
$time_local:用来记录访问时间与时区;
$request:用来记录请求的url与http协议;
$status:用来记录请求状态;成功是200,
$body_bytes_sent:记录发送给客户端文件主体内容大小;
$http_referer:用来记录从那个页面链接访问过来的;
$http_user_agent:记录客户浏览器的相关信息;
通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。
反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。)
    log_format  main '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';
#用log_format指令设置日志格式后,需要用access_log指令指定日志文件的存放路径;
    #access_log  logs/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
    #gzip  on;
    upstream192.168.20.35 {
    server   192.168.20.35:9001 weight=3 max_fails=2fail_timeout=30s;
    server   192.168.20.35:9002 weight=3 max_fails=2fail_timeout=30s;
    ip_hash;
    }
    server {
    listen       8111;
    server_name  192.168.20.35;
    index index.jsp index.html index.htm;
    #配置发布目录
    root  /home/lgip_fastdfs/apache-tomcat-7.0.73/webapps/ROOT;
    location /
    {
        proxy_next_upstream http_502 http_504 error timeout invalid_header;
        proxy_set_header Host  $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_passhttp://192.168.20.35;
        #expires      3d;
    }
 #动态页面交给在nginx.conf定义的upstream 均衡
    location ~.*\.(php|jsp|cgi)?$
    {
    #root/home/lgip_fastdfs/apache-tomcat-7.0.73/webapps/ROOT/WEB-INF;
        proxy_set_header Host  $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_passhttp://192.168.20.35;
    }
    #配置Nginx动静分离,定义的静态页面直接从Nginx发布目录读取。
    location ~.*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
    {
    root/home/lgip_fastdfs/apache-tomcat-7.0.73/webapps/ROOT/WEB-INF;
    #expires定义用户浏览器缓存的时间为3天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力
    expires      3d;
    }
    #定义Nginx输出日志的路径
    access_log /home/lgip_fastdfs/data/logs/nginx_lgip/access.log main;
    error_log  /home/lgip_fastdfs/data/logs/nginx_lgip/error.log  crit;
    }
}