Nginx反向代理+负载均衡

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx反向代理+负载均衡相关的知识,希望对你有一定的参考价值。

nginx反向代理+负载均衡

1     环境

1.centos 6.5

2.nginx-1.9.2.tar.gz

3.pcre-8.32.tar.gz 

2     安装Nginx

三台服务器都做进行的操作:

 

2.1   安装pcre

 

1.tar zxf pcre-8.32.tar.gz

2.cd pcre-8.30/

3../configure

4.make && make install

5.cd ../

6.安装pcre库是为了兼容nginx rewrite当时我安装的时候没有安装pcre,在做nginx重定向的时候死活出不来,我还以为是我的重定向的问题,最后才想起了是pcre没有安装,你们要注意哦!!

 

2.2    安装nginx

 

1、解压

tar xf  nginx-1.9.2.tar.gz

2、新建nginx用户与组

groupadd-g 108  -r nginx

useradd-u 108 -r -g 108 nginx

idnginx   查看nginxID

3、备编译配置文件

yuminstall -y pcre-devel openssl-devel

 

./configure   --prefix=/usr   --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   --pid-path=/var/run/nginx/nginx.pid    --lock-path=/var/lock/nginx.lock   --user=nginx  --group=nginx  --with-http_ssl_module  --with-http_flv_module  --with-http_stub_status_module  --with-http_gzip_static_module  --http-client-body-temp-path=/var/tmp/nginx/client/  --http-proxy-temp-path=/var/tmp/nginx/proxy/   --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/  --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi  --http-scgi-temp-path=/var/tmp/nginx/scgi   --with-pcre

 

4nginx的配置文件

vim/etc/init.d/nginx

#!/bin/sh
#
# nginx- this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15
#description:  Nginx is an HTTP(S) server,HTTP(S) reverse #               proxy and IMAP/POP3 proxy server
#processname: nginx
#config:      /etc/nginx/nginx.conf
#config:      /etc/sysconfig/nginx
#pidfile:     /var/run/nginx.pid
# Sourcefunction library.
./etc/rc.d/init.d/functions
# Sourcenetworking configuration.
./etc/sysconfig/network
# Checkthat networking is up.
["$NETWORKING" = "no" ] && exit 0
nginx="/usr/sbin/nginx"
prog=$(basename$nginx)
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f/etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs(){
   # make required directories
   user=`nginx -V 2>&1 | grep"configure arguments:" | sed ‘s/[^*]*--user=\([^ ]*\).*/\1/g‘ -`
   options=`$nginx -V 2>&1 | grep‘configure arguments:‘`
   for opt in $options; do
       if [ `echo $opt | grep ‘.*-temp-path‘`]; then
           value=`echo $opt | cut -d"=" -f 2`
           if [ ! -d "$value" ]; then
               # echo "creating"$value
               mkdir -p $value && chown-R $user $value
           fi
       fi
   done
}
start(){
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    make_dirs
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch$lockfile
    return $retval
}
stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f$lockfile
    return $retval
}
restart(){
    configtest || return $?
    stop
    sleep 1
    start
}
reload(){
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}
force_reload(){
    restart
}
configtest(){
  $nginx -t -c $NGINX_CONF_FILE
}
rh_status(){
    status $prog
}
rh_status_q(){
    rh_status >/dev/null 2>&1
}
case"$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0{start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

 

5、为此脚本赋予执行权限

chmod +x/etc/init.d/nginx

6、添加至服务管理列表,并让其开机自动启动

chkconfig--add nginx

chkconfignginx on

chkconfignginx --list

 

mkdir -p/var/tmp/nginx/client

servicenginx restart

 

7、查看一下端口

netstat-anput |grep :80

 

至此,nginx安装完成,

3     配置nginx

3.1    nginx配置文件的说明

cat /etc/nginx/nginx.conf

#运行用户
usernobody;
 
#启动进程,通常设置成和cpu的数量相等
worker_processes  1;
 
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
 
#进程文件
pidar/runinx.pid;
 
#工作模式与连接数上限
events
{
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
   #epoll是多路复用IO(I/O Multiplexing)中的一种方式,
    #仅用于linux2.6以上内核,可以大大提高nginx的性能
 
   #单个后台worker process进程的最大并发链接数   
    worker_connections  1024;
 # 并发总数是 worker_processes 和 worker_connections 的乘积
    # 即 max_clients = worker_processes *worker_connections
    # 在设置了反向代理的情况下,max_clients = worker_processes *worker_connections / 4  为什么
    # 为什么上面反向代理要除以4,应该说是一个经验值
    # 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000
    # worker_connections 值的设置跟物理内存大小有关
    # 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数
    # 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右
    # 我们来看看360M内存的VPS可以打开的文件句柄数是多少:
    # $ cat /proc/sys/fs/file-max
    # 输出 34336
    # 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内
    # 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置
    # 使得并发总数小于操作系统可以打开的最大文件数目
    # 其实质也就是根据主机的物理CPU和内存进行配置
    # 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。
    # ulimit -SHn 65535
 
http {
         nclude mime.types; #文件扩展名与文件类型映射表
         default_type application/octet-stream;#默认文件类型
 
          #设定日志格式
    log_format main  ‘$remote_addr - $remote_user[$time_local] "$request" ‘
                      ‘$status $body_bytes_sent"$http_referer" ‘
                     ‘"$http_user_agent" "$http_x_forwarded_for"‘;
 
    access_log logs/access.log  main;
 
         #charset utf-8; #默认编码
         server_names_hash_bucket_size 128; #服务器名字的hash表大小
         client_header_buffer_size 32k; #上传文件大小限制
         large_client_header_buffers 4 64k; #设定请求缓
         client_max_body_size 8m; #设定请求缓
 
         sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。     
 
         autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
         tcp_nopush on; #防止网络阻塞  
 
#连接超时时间
                  #keepalive_timeout  0;
                  keepalive_timeout  65;#长连接超时时间,单位是秒
                  tcp_nodelay     on;
 
#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
         fastcgi_connect_timeout 300;
         fastcgi_send_timeout 300;
         fastcgi_read_timeout 300;
         fastcgi_buffer_size 64k;
         fastcgi_buffers 4 64k;
         fastcgi_busy_buffers_size 128k;
         fastcgi_temp_file_write_size 128k;
 
#gzip模块设置
         gzip on; #开启gzip压缩输出
         gzip_min_length 1k; #最小压缩文件大小
         gzip_buffers 4 16k; #压缩缓冲区
         gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
         gzip_comp_level 2; #压缩等级
         gzip_types text/plainapplication/x-javascript text/css application/xml;
         #压缩类型,默认就已经包含textml,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
         gzip_vary on;
         #limit_zone crawler $binary_remote_addr10m; #开启限制IP连接数的时候需要使用
 
#设定负载均衡的服务器列表
upstreamblog.ha97.com {
         #upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
         #本机上的Squid开启3128端口
    server 192.168.8.1:3128 weight=5;
         server 192.168.80.121:80 weight=3;
         server 192.168.80.122:80 weight=2;
         server 192.168.80.123:80 weight=3;
}
 
#设定请求缓冲
    client_header_buffer_size    1k;
    large_client_header_buffers  4 4k;
 
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
 
 
#设定虚拟主机配置
    server {
        #侦听80端口
        listen    80;
        #定义使用 www.nginx.cn访问
        server_name  www.nginx.cn;
 
        #定义服务器的默认网站根目录位置
        root html;
 
        #设定本虚拟主机的访问日志
        access_log  logs/nginx.access.log  main;
    #默认请求
    location / {
          root  /root;      #定义服务器的默认网站根目录位置
          index index.php index.htmlindex.htm;   #定义首页索引文件的名称
 
          fastcgi_pass  www.xx.com;
         fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
         include /etc/nginx/fastcgi_params;
        }
   # 定义错误提示页面
    error_page  500 502 503 504 /50x.html; 
        location = /50x.html {
        root  /root;
    }
 
    #静态文件,nginx自己处理
    location ~^/(images|javascript|js|css|flash|media|static)/ {
        root /var/www/virtual/htdocs;
        #过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。
        expires 30d;
 
         PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.      
         location ~ .*.(php|php5)?${
                  fastcgi_pass 127.0.0.1:9000;
                  fastcgi_index index.php;                 fastcgi_param  SCRIPT_FILENAME 
                  $document_root$fastcgi_script_name
                  include fastcgi.conf;
         }
         }
         #图片缓存时间设置
         location ~.*.(gif|jpg|jpeg|png|bmp|swf)$
         {
         expires 10d;
         }
         #JS和CSS缓存时间设置
         location ~ .*.(js|css)?$
         {
         expires 1h;
         }
 
#日志格式设定
         log_format access ‘$remote_addr -$remote_user [$time_local] "$request" ‘
                                            ‘$status$body_bytes_sent "$http_referer" ‘
                                            ‘"$http_user_agent"$http_x_forwarded_for‘;
         #定义本虚拟主机的访问日志
         access_log ar/loginx/ha97access.logaccess;
 
#对 "/" 启用反向代理
         location / {
                  proxy_passhttp://127.0.0.1:88;
                  proxy_redirect off;
                  proxy_set_header X-Real-IP$remote_addr;
         #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
                  proxy_set_headerX-Forwarded-For $proxy_add_x_forwarded_for;
         #以下是一些反向代理的配置,可选。
                  proxy_set_header Host $host;
                  client_max_body_size 10m; #允许客户端请求的最大单文件字节数
                  client_body_buffer_size 128k;#缓冲区代理缓冲用户端请求的最大字节数,
                  proxy_connect_timeout 90;#nginx跟后端服务器连接超时时间(代理连接超时)
                  proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
                  proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
                  proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
                  proxy_buffers 4 32k;#proxy_buffers缓冲区,网页平均在32k以下的设置
                  proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
                  proxy_temp_file_write_size64k;
         #设定缓存文件夹大小,大于这个值,将从upstream服务器传
         }
 
#设定查看Nginx状态的地址
         location /NginxStatus {
         stub_status on;
         access_log on;
         auth_basic "NginxStatus";
         auth_basic_user_file confpasswd;
         #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
         }
 
 #禁止访问 .htxxx 文件
            location ~ /.ht {
            deny all;
        }
#本地动静分离反向代理配置
#所有jsp的页面均交由tomcat或resin处理
location~ .(jsp|jspx|do)?$ {
proxy_set_headerHost $host;
proxy_set_headerX-Real-IP $remote_addr;
proxy_set_headerX-Forwarded-For $proxy_add_x_forwarded_for;
proxy_passhttp://127.0.0.1:8080;
}
#所有静态文件由nginx直接读取不经过tomcat或resin
location~.*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{expires 15d; }
location~ .*.(js|css)?$
{expires 1h; }
}
}

 

3.2    配置nginx反代服务器

 

cp/etc/nginx/nginx.conf /etc/nginx/nginc.conf.bak

vim nginx.conf

 

    upstream test{
        server 10.10.115.115:8080 weight=5;
        server 10.10.115.114:8080 weight=5;
 
    }
 
    server {
        listen       80;
        server_name  test.test.com;
 
        location = / {
            rewrite ^(.*)$ http://$host/test/permanent;
        }
        location / {
            root   html;
            index  index.html index.htm;
        }
        location /test {
            index  index.jsp;
            proxy_pass      http://test/third-party-payment/;
            #limit_conn one 200;
            proxy_redirect          off;
            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;
            client_max_body_size    50m;
            client_body_buffer_size 256k;
            proxy_connect_timeout   90;
            proxy_send_timeout      90;
            proxy_read_timeout      90;
            proxy_buffer_size       256k;
            proxy_buffers           4 256k;
            proxy_busy_buffers_size 256k;
            proxy_temp_file_write_size 256k;
        }
}

 

重新启动nginx

/etc/init.d/nginx restart

如果nginx正在使用的话就不能重新启动,就进行重新载入。

servicenginx  reload

 

 


以上是关于Nginx反向代理+负载均衡的主要内容,如果未能解决你的问题,请参考以下文章

nginx--❤️图解及代码实现正向代理反向代理及负载均衡(非常实用,建议收藏❤️)

nginx做反向代理负载均衡 Java怎么获取后端服务器获取用户IP

nginx做反向代理负载均衡 Java怎么获取后端服务器获取用户IP

Nginx反向代理负载均衡, keepalived高可用

Nginx实现反向代理负载均衡功能

Nginx代理——正向反向代理,动静分离和负载均衡