最近在研究负载均衡,今天终于把环境搭好了,在此记录下Nginx服务器搭建方法以及 nginx.conf 的配置文件说明, 部分注释收集与网络.

   本文主要帮助大家能快速搭建一个可用的负载均衡环境.

   首先是需要JBOSS服务器若干,具体搭建方法在此不做描述.

安装nginx,

shell代码

shell>> cd /opt  

shell>> wget http://nginx.org/download/nginx-1.0.6.tar.gz  

shell>> tar xzvf nginx-0.7.64.tar.gz  

shell>> cd nginx-1.0.6

shell>> ./configure \  


  •    --user=nginx \  

  •    --group=nginx \  

  •    --prefix=/opt/nginx \  

  •    --sbin-path=/usr/sbin/nginx \  

  •    --conf-path=/etc/nginx/nginx.conf \  

  •    --error-log-path=/var/log/nginx/error.log \  

  •    --http-log-path=/var/log/nginx/access.log \  

  •    --http-client-body-temp-path=/tmp/nginx/client_body \  

  •    --http-proxy-temp-path=/tmp/nginx/proxy \  

  •    --http-fastcgi-temp-path=/tmp/nginx/fastcgi \  

  •    --pid-path=/var/run/nginx.pid \  

  •    --lock-path=/var/lock/subsys/nginx \  

  •    --with-http_stub_status_module这里解释一下:
    # --user            是指启用程序所属用户
    # --group           是指启动程序所属组
    # --prefix          是指nginx安装目录(不是源代码目录)
    # --sbin-path       是指nginx命令位置
    # --conf-path       是指配置文件路径
    # --error-log-path  是错误日志路径
    # --http-log-path   是访问日志

其他是一些临时文件的路径和做linux service需要用到的文件
# --with-http_stub_status_module    需要监控服务需安装此监控状态模块


然后:

shell>> cd /opt/nginx  

shell>> make  

shell>> make install

   到此为止,NGINX已经可以正常启动了,我们可以cd到nginx安装目录执行 ./sbin/nginx 启动nginx.

   但是我们如果想要把nginx做成一个服务,必须要写一个shell.

   简单说一下,

   # chkconfig:   - 85 15 所有运行级别,启动优先级85, 关闭优先级15

   # processname: 进程名称

   # config:      nginx配置文件位置

   # config:      系统会优先找第一个,如果找不到再去找第二个

   # pidfile:     进程ID存放文件,用来存放程序启动后的进程ID

   # Source function library.  linux常用的方法库,有兴趣可以去看看service XXX status 就使用了里边的一个方法

   # Source networking configuration.  网络配置

  1. #!/bin/sh    

  2. #    

  3. # nginx - this script starts and stops the nginx daemon    

  4. #         by haitao.tu at 2009-12-15    

  5. #         email:tuhaitao@foxmail.com    

  6. #    

  7. # chkconfig:   - 85 15    

  8. # description:  Nginx is an HTTP(S) server, HTTP(S) reverse \    

  9. #               proxy and IMAP/POP3 proxy server    

  10. # processname: nginx    

  11. # config:      /etc/nginx/nginx.conf    

  12. # config:      /etc/sysconfig/nginx    

  13. # pidfile:     /var/run/nginx.pid    

  14. # Source function library.    

  15. . /etc/rc.d/init.d/functions    

  16. # Source networking configuration.    

  17. . /etc/sysconfig/network    

  18. # Check that networking is up.    

  19. [ "$NETWORKING" = "no" ] && exit 0    

  20. nginx="/usr/sbin/nginx"    

  21. prog=$(basename $nginx)    

  22. NGINX_CONF_FILE="/etc/nginx/nginx.conf"    

  23. [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx    

  24. lockfile=/var/lock/subsys/nginx    

  25. start() {    

  26.    [ -x $nginx ] || exit 5    

  27.    [ -f $NGINX_CONF_FILE ] || exit 6    

  28.    echo -n {1}quot;Starting $prog: "    

  29.    daemon $nginx -c $NGINX_CONF_FILE    

  30.    retval=$?    

  31.    echo    

  32.    [ $retval -eq 0 ] && touch $lockfile    

  33.    return $retval    

  34. }    

  35. stop() {    

  36.    echo -n {1}quot;Stopping $prog: "    

  37.    killproc $prog    

  38.    retval=$?    

  39.    echo    

  40.    [ $retval -eq 0 ] && rm -f $lockfile    

  41.    return $retval    

  42. }    

  43. restart() {    

  44.    configtest_q || configtest || return 6    

  45.    stop    

  46.    start    

  47. }    

  48. reload() {    

  49.    configtest_q || configtest || return 6    

  50.    echo -n {1}quot;Reloading $prog: "    

  51.    killproc $nginx -HUP    

  52.    echo    

  53. }    

  54. configtest() {    

  55.  $nginx -t -c $NGINX_CONF_FILE    

  56. }    

  57. configtest_q() {    

  58.    configtest >/dev/null 2>&1    

  59. }    

  60. rh_status() {    

  61.    status $prog    

  62. }    

  63. rh_status_q() {    

  64.    rh_status >/dev/null 2>&1    

  65. }    

  66. # Upgrade the binary with no downtime.    

  67. upgrade() {    

  68.    local pidfile="/var/run/${prog}.pid"    

  69.    local oldbin_pidfile="${pidfile}.oldbin"    

  70.    configtest_q || configtest || return 6    

  71.    echo -n {1}quot;Staring new master $prog: "    

  72.    killproc $nginx -USR2    

  73.    retval=$?    

  74.    echo    

  75.    sleep 1    

  76.    if [[ -f ${oldbin_pidfile} && -f ${pidfile} ]];  then    

  77.        echo -n {1}quot;Graceful shutdown of old $prog: "    

  78.        killproc -p ${oldbin_pidfile} -QUIT    

  79.        retval=$?    

  80.        echo    

  81.        return 0    

  82.    else    

  83.        echo {1}quot;Something bad happened, manual intervention required, maybe restart?"    

  84.        return 1    

  85.    fi    

  86. }    

  87. case "$1" in    

  88.    start)    

  89.        rh_status_q && exit 0    

  90.        $1    

  91.        ;;    

  92.    stop)    

  93.        rh_status_q || exit 0    

  94.        $1    

  95.        ;;    

  96.    restart|configtest)    

  97.        $1    

  98.        ;;    

  99.    force-reload|upgrade)    

  100.        rh_status_q || exit 7    

  101.        upgrade    

  102.        ;;    

  103.    reload)    

  104.        rh_status_q || exit 7    

  105.        $1    

  106.        ;;    

  107.    status|status_q)    

  108.        rh_$1    

  109.        ;;    

  110.    condrestart|try-restart)    

  111.        rh_status_q || exit 7    

  112.        restart    

  113.            ;;    

  114.    *)    

  115.        echo {1}quot;Usage: $0 {start|stop|reload|configtest|status|force-reload|upgrade|restart}"    

  116.        exit 2    

  117. esac  



   好了,已经做成chkconfig了,下边需要配置一下nginx反向代理,需要修改/usr/local/nginx/nginx.conf配置文件

  1. user  nginx;    

  2. worker_processes  2;    

  3. error_log   /log/nginx/error.log;    

  4. #error_log  /var/log/nginx/error.log  notice;    

  5. #error_log  /var/log/nginx/error.log  info;    

  6. pid         /run/nginx.pid;    

  7. events {    

  8.    use epoll; # 采用epoll,是linux下最快的event    

  9.    worker_connections  2048;    

  10. }    

  11. http {    

  12.    include       mime.types;    

  13.    default_type  application/octet-stream;    

  14.    sendfile        on;    

  15.    keepalive_timeout  65;    

  16.    #gzip  on;    

  17.    #反向代理配置 ,向内网6台jboss转发    

  18.    upstream jboss {    

  19.        server 192.168.162.35:8080 weight=10;  

  20.        server 192.168.162.11:8080 weight=8;  

  21.        server 192.168.162.61:8080 weight=2;  

  22.    }    

  23.    server {    

  24.        listen       2011;    

  25.        server_name  localhost;    

  26.        location ~ ^/nginx_status/ {    

  27.            stub_status on;    

  28.            access_log off;    

  29.        }    

  30.        location / {    

  31.            proxy_pass http://jboss;    

  32.        }    

  33.        error_page   500 502 503 504  /50x.html;    

  34.        location = /50x.html {    

  35.            root   html;    

  36.        }    

  37.    }    

  38. }  



OK, 没什么大问题的话, 你的nginx已经具体负载均衡的功能了,



可能存在的问题

   1,  session复制问题


以前用apache做负载均衡的时候,是选择了用 session sticky的模式,这样的话,用户每次进来都会是同一个服务器中的session,不会被转发到其他的服务器上。在这样的情况下,tomcat即使不做session复制也不会影响用户访问。但是nginx并不支持sticky功能。所以必须要做session复制。否则很多地方就根本没法用。比如登录过程,先等到了第一个tomcat上,产生了一个session,在刷新页面,刷到另外一个tomcat的机器上,没有这个session,就会出现问题了。所以程序员在写jsp的时候也要注意这一点


举个简单的例子,比如我们在单机应用情况下修改SESSION中用户的某一个数据,那么通常就是:

User user = (User)request.getSession().getAttribute(“user”);

User.setName(“my name”);


这样我们就是直接存取出来,然后进行修改,虽然在单机情况下没有问题,但是在集群条件下,这样就导致了多台WEB服务器上的SESSION不同步的问题,因为SESSION并没有改变,Tomcat无法监视session中某个数据的值是否发生了变化。因此,我们还需要执行如下操作以保证SESSION的同步:

Request.getSession().setAttribute(“user”, user);

所以,我们在操作SESSION的时候要特别注意!另外的建议就是,我们应该尽可能的不要修改SESSION中的数据。

可能经常会遇到session复制不正常的情况。除了在服务端找原因再也程序上找下原因。都是有可能导致session复制不正常的


   2.页面同步


为确保后面tomcat的服务器上的页面程序是一致的,可以采用如下方式

a,rsync同步,或者做成页面按钮,提供给编辑,修改了程序即使点击同步

b,共享区域存储,或者采取drbd网络raid模式


   3,确认nginx可以转发成功


在nginx上wget一下后面转发的url(包过端口),如果可以打开,那就可以转发过去。如果不能打开,则无法转发


   关于nginx配置文件的详细说明及配置方法,会在后续博文中继续和大家一起探讨.