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 查看nginx的ID号
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
4、nginx的配置文件
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