- 浏览: 2551963 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
nation:
你好,在部署Mesos+Spark的运行环境时,出现一个现象, ...
Spark(4)Deal with Mesos -
sillycat:
AMAZON Relatedhttps://www.godad ...
AMAZON API Gateway(2)Client Side SSL with NGINX -
sillycat:
sudo usermod -aG docker ec2-use ...
Docker and VirtualBox(1)Set up Shared Disk for Virtual Box -
sillycat:
Every Half an Hour30 * * * * /u ...
Build Home NAS(3)Data Redundancy -
sillycat:
3 List the Cron Job I Have>c ...
Build Home NAS(3)Data Redundancy
nginx做负载均衡
1.nginx的安装
下载地址
http://sysoev.ru/en/
文件
nginx-0.6.35.tar.gz
为了确保能在 Nginx 中使用正则表达式进行更灵活的配置,安装之前需要确定系统是否安装有 PCRE(Perl Compatible Regular Expressions)包。
rpm -q pcre
本机系统显示:
[sillycat@dev1 tmp]$ rpm -q pcre
pcre-4.5-3.2.RHEL4
不知道版本会不会过低,等等再说
tar zxvf nginx-0.6.35.tar.gz
cd nginx-0.6.35
./configure --with-http_stub_status_module --prefix=/usr/local/nginx
make
make install
安装成功后 /usr/local/nginx 目录下有四个子目录分别是:
conf、html、logs、sbin 。
其中 Nginx 的配置文件存放于 conf/nginx.conf,Nginx 只有一个程序文件位于 sbin 目录下的 nginx 文件。
确保系统的 80 端口没被其他程序占用,
运行 sbin/nginx 命令来启动 Nginx,打开浏览器访问此机器的 IP,
如果浏览器出现 Welcome to nginx! 则表示 Nginx 已经安装并运行成功。
本机发现不行,需要修改配置文件中的
conf/nginx.conf
server {
listen 80;
server_name www.kiko.com;
原来server_name是localhost只监听了本机
程序运行参数
Nginx 安装后只有一个程序文件,本身并不提供各种管理程序,它是使用参数和系统信号机制对 Nginx 进程本身进行控制的。 Nginx 的参数包括有如下几个:
-c <path_to_config>:使用指定的配置文件而不是 conf 目录下的 nginx.conf 。
-t:测试配置文件是否正确,在运行时需要重新加载配置的时候,此命令非常重要,用来检测所修改的配置文件是否有语法错误。
-v:显示 nginx 版本号。
-V:显示 nginx 的版本号以及编译环境信息以及编译时的参数。
例如我们要测试某个配置文件是否书写正确,我们可以使用以下命令
sbin/nginx – t – c conf/nginx.conf
nginx启动脚本
通过信号对 Nginx 进行控制
Nginx 支持下表中的信号:
信号名 作用描述
TERM, INT 快速关闭程序,中止当前正在处理的请求
QUIT 处理完当前请求后,关闭程序
HUP 重新加载配置,并开启新的工作进程,关闭就的进程,此操作不会中断请求
USR1 重新打开日志文件,用于切换日志,例如每天生成一个新的日志文件
USR2 平滑升级可执行程序
WINCH 从容关闭工作进程
有两种方式来通过这些信号去控制 Nginx,第一是通过 logs 目录下的 nginx.pid 查看当前运行的 Nginx 的进程 ID,通过 kill – XXX <pid> 来控制 Nginx,其中 XXX 就是上表中列出的信号名。如果您的系统中只有一个 Nginx 进程,那您也可以通过 killall 命令来完成,例如运行 killall – s HUP nginx 来让 Nginx 重新加载配置。
nginx是超级稳定的服务器,一般不会因为超载问题而需要重启,重启的目的一般都是修改配置文件后需要加载一下。
最开始的时候,我是用最直接的重启方式
killall -9
如果机器比较慢,kill进程时一瞬间杀不完,再执行一次即可。这种重启方式不是特别安全,如果配置有误,则会重启失败,需要重新修改配置文件然后再启动,期间会消耗一点时间。不过对于目前普遍还是不怎么严格的http界而言,这点时间还不至于产生太大损失,只要不是在关键时刻搞出来就好。如果希望沿用这种重启办法,我提议还是先好好测试吧。
后来我在nginx.net上看到了一种更奇妙的重启
kill -HUP $pid($pid就是nginx master进程的进程号)
我一般这样用
kill -HUP `cat /data/nginx/logs/nginx.pid`
这种方式的好处是实现“平滑重启”,在ps -aux中可以看到,nginx首先启动新进程,旧的进程仍然提供服务,在一段时间后,旧的进程服务结束就自动关闭,剩下新进程继续服务。但是这种方式也是有缺点的,如果配置文件有误,或者资源冲突,则重启失效,但nginx并没有任何的提示!这就会时常发现改动的配置文件没有生效,又比较难找到问题。
所以,最后杂和了一下问题,弄了一个nginx.sh,这个版本的nginx.sh还是没有解决kill -HUP的资源冲突的问题,但解决了配置文件的问题。资源冲突的比如80端口被占用、日志文件目录没有创建这种的。
参考网上的做法,用如下脚本控制:
#!/bin/sh
BASE_DIR='/usr/local/'
${BASE_DIR}nginx/sbin/nginx -t -c ${BASE_DIR}nginx/conf/nginx.conf >& ${BASE_DIR}nginx/logs/nginx.start
info=`cat ${BASE_DIR}nginx/logs/nginx.start`
if [ `echo $info | grep -c "syntax is ok" ` -eq 1 ]; then
if [ `ps aux|grep "nginx"|grep -c "master"` == 1 ]; then
kill -HUP `cat ${BASE_DIR}nginx/logs/nginx.pid`
echo "ok"
else
killall -9 nginx
sleep 1
${BASE_DIR}nginx/sbin/nginx
fi
else
echo "######## error: ########"
cat ${BASE_DIR}nginx/logs/nginx.start
fi
2.nginx负载均衡配置
user nobody; #work user
worker_processes 1; #work process number, acording to you cpu number
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
use epoll; #linux best event mode
worker_connections 1024; # most connects of one work process
}
http {
include 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; # log file name
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream itsm {
ip_hash;
server localhost:8081;
server localhost:8082;
}
server {
listen 80;
server_name www.kiko.com;
charset utf-8;
access_log logs/host.access.log main;
location /nginxstatus {
stub_status on; #nginx status watch
access_log off;
}
location / {
proxy_pass http://itsm;
proxy_set_header X-Real-IP $remote_addr;
}
#location / {
# root html;
# index index.html index.htm;
#}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
3.Nginx状态监控
上面是一个实际网站的配置实例,其中灰色文字为配置说明。上述配置中,首先我们定义了一个 location ~ ^/nginxstatus/,这样通过
http://www.kiko.com/nginxstatus
就可以监控到 Nginx 的运行信息,显示的内容如下:
Active connections: 70
server accepts handled requests
14553819 14553819 19239266
Reading: 0 Writing: 3 Waiting: 67
NginxStatus 显示的内容意思如下:
active connections – 当前 Nginx 正处理的活动连接数。
server accepts handled requests -- 总共处理了 14553819 个连接 , 成功创建 14553819 次握手 ( 证明中间没有失败的 ), 总共处理了 19239266 个请求 ( 平均每次握手处理了 1.3 个数据请求 )。
reading -- nginx 读取到客户端的 Header 信息数。
writing -- nginx 返回给客户端的 Header 信息数。
waiting -- 开启 keep-alive 的情况下,这个值等于 active - (reading + writing),意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接。
4.问题
这个ip_hash模块是采用IP段来做负载均衡的,IP的前三位来做的hash,也就是说
192.168.1.2 --> server1
192.168.1.12 --> server1
192.168.1.13 --> server1
源文件
ngx_http_upstream_ip_hash_module.c
中
iphp->addr[0] = p[0];
iphp->addr[1] = p[1];
iphp->addr[2] = p[2];
好像确实只取了前三位,我C语言不好。看的不是很明白其算法。
1.nginx的安装
下载地址
http://sysoev.ru/en/
文件
nginx-0.6.35.tar.gz
为了确保能在 Nginx 中使用正则表达式进行更灵活的配置,安装之前需要确定系统是否安装有 PCRE(Perl Compatible Regular Expressions)包。
rpm -q pcre
本机系统显示:
[sillycat@dev1 tmp]$ rpm -q pcre
pcre-4.5-3.2.RHEL4
不知道版本会不会过低,等等再说
tar zxvf nginx-0.6.35.tar.gz
cd nginx-0.6.35
./configure --with-http_stub_status_module --prefix=/usr/local/nginx
make
make install
安装成功后 /usr/local/nginx 目录下有四个子目录分别是:
conf、html、logs、sbin 。
其中 Nginx 的配置文件存放于 conf/nginx.conf,Nginx 只有一个程序文件位于 sbin 目录下的 nginx 文件。
确保系统的 80 端口没被其他程序占用,
运行 sbin/nginx 命令来启动 Nginx,打开浏览器访问此机器的 IP,
如果浏览器出现 Welcome to nginx! 则表示 Nginx 已经安装并运行成功。
本机发现不行,需要修改配置文件中的
conf/nginx.conf
server {
listen 80;
server_name www.kiko.com;
原来server_name是localhost只监听了本机
程序运行参数
Nginx 安装后只有一个程序文件,本身并不提供各种管理程序,它是使用参数和系统信号机制对 Nginx 进程本身进行控制的。 Nginx 的参数包括有如下几个:
-c <path_to_config>:使用指定的配置文件而不是 conf 目录下的 nginx.conf 。
-t:测试配置文件是否正确,在运行时需要重新加载配置的时候,此命令非常重要,用来检测所修改的配置文件是否有语法错误。
-v:显示 nginx 版本号。
-V:显示 nginx 的版本号以及编译环境信息以及编译时的参数。
例如我们要测试某个配置文件是否书写正确,我们可以使用以下命令
sbin/nginx – t – c conf/nginx.conf
nginx启动脚本
通过信号对 Nginx 进行控制
Nginx 支持下表中的信号:
信号名 作用描述
TERM, INT 快速关闭程序,中止当前正在处理的请求
QUIT 处理完当前请求后,关闭程序
HUP 重新加载配置,并开启新的工作进程,关闭就的进程,此操作不会中断请求
USR1 重新打开日志文件,用于切换日志,例如每天生成一个新的日志文件
USR2 平滑升级可执行程序
WINCH 从容关闭工作进程
有两种方式来通过这些信号去控制 Nginx,第一是通过 logs 目录下的 nginx.pid 查看当前运行的 Nginx 的进程 ID,通过 kill – XXX <pid> 来控制 Nginx,其中 XXX 就是上表中列出的信号名。如果您的系统中只有一个 Nginx 进程,那您也可以通过 killall 命令来完成,例如运行 killall – s HUP nginx 来让 Nginx 重新加载配置。
nginx是超级稳定的服务器,一般不会因为超载问题而需要重启,重启的目的一般都是修改配置文件后需要加载一下。
最开始的时候,我是用最直接的重启方式
killall -9
如果机器比较慢,kill进程时一瞬间杀不完,再执行一次即可。这种重启方式不是特别安全,如果配置有误,则会重启失败,需要重新修改配置文件然后再启动,期间会消耗一点时间。不过对于目前普遍还是不怎么严格的http界而言,这点时间还不至于产生太大损失,只要不是在关键时刻搞出来就好。如果希望沿用这种重启办法,我提议还是先好好测试吧。
后来我在nginx.net上看到了一种更奇妙的重启
kill -HUP $pid($pid就是nginx master进程的进程号)
我一般这样用
kill -HUP `cat /data/nginx/logs/nginx.pid`
这种方式的好处是实现“平滑重启”,在ps -aux中可以看到,nginx首先启动新进程,旧的进程仍然提供服务,在一段时间后,旧的进程服务结束就自动关闭,剩下新进程继续服务。但是这种方式也是有缺点的,如果配置文件有误,或者资源冲突,则重启失效,但nginx并没有任何的提示!这就会时常发现改动的配置文件没有生效,又比较难找到问题。
所以,最后杂和了一下问题,弄了一个nginx.sh,这个版本的nginx.sh还是没有解决kill -HUP的资源冲突的问题,但解决了配置文件的问题。资源冲突的比如80端口被占用、日志文件目录没有创建这种的。
参考网上的做法,用如下脚本控制:
#!/bin/sh
BASE_DIR='/usr/local/'
${BASE_DIR}nginx/sbin/nginx -t -c ${BASE_DIR}nginx/conf/nginx.conf >& ${BASE_DIR}nginx/logs/nginx.start
info=`cat ${BASE_DIR}nginx/logs/nginx.start`
if [ `echo $info | grep -c "syntax is ok" ` -eq 1 ]; then
if [ `ps aux|grep "nginx"|grep -c "master"` == 1 ]; then
kill -HUP `cat ${BASE_DIR}nginx/logs/nginx.pid`
echo "ok"
else
killall -9 nginx
sleep 1
${BASE_DIR}nginx/sbin/nginx
fi
else
echo "######## error: ########"
cat ${BASE_DIR}nginx/logs/nginx.start
fi
2.nginx负载均衡配置
user nobody; #work user
worker_processes 1; #work process number, acording to you cpu number
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
use epoll; #linux best event mode
worker_connections 1024; # most connects of one work process
}
http {
include 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; # log file name
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream itsm {
ip_hash;
server localhost:8081;
server localhost:8082;
}
server {
listen 80;
server_name www.kiko.com;
charset utf-8;
access_log logs/host.access.log main;
location /nginxstatus {
stub_status on; #nginx status watch
access_log off;
}
location / {
proxy_pass http://itsm;
proxy_set_header X-Real-IP $remote_addr;
}
#location / {
# root html;
# index index.html index.htm;
#}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
3.Nginx状态监控
上面是一个实际网站的配置实例,其中灰色文字为配置说明。上述配置中,首先我们定义了一个 location ~ ^/nginxstatus/,这样通过
http://www.kiko.com/nginxstatus
就可以监控到 Nginx 的运行信息,显示的内容如下:
Active connections: 70
server accepts handled requests
14553819 14553819 19239266
Reading: 0 Writing: 3 Waiting: 67
NginxStatus 显示的内容意思如下:
active connections – 当前 Nginx 正处理的活动连接数。
server accepts handled requests -- 总共处理了 14553819 个连接 , 成功创建 14553819 次握手 ( 证明中间没有失败的 ), 总共处理了 19239266 个请求 ( 平均每次握手处理了 1.3 个数据请求 )。
reading -- nginx 读取到客户端的 Header 信息数。
writing -- nginx 返回给客户端的 Header 信息数。
waiting -- 开启 keep-alive 的情况下,这个值等于 active - (reading + writing),意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接。
4.问题
这个ip_hash模块是采用IP段来做负载均衡的,IP的前三位来做的hash,也就是说
192.168.1.2 --> server1
192.168.1.12 --> server1
192.168.1.13 --> server1
源文件
ngx_http_upstream_ip_hash_module.c
中
iphp->addr[0] = p[0];
iphp->addr[1] = p[1];
iphp->addr[2] = p[2];
好像确实只取了前三位,我C语言不好。看的不是很明白其算法。
发表评论
-
Docker(4)Docker on Raspberry
2015-07-15 13:25 1105Docker(4)Docker on Raspberry I ... -
VirtualBox Network
2015-06-10 11:48 781VirtualBox Network Last one ye ... -
Debian System(1)Java and NodeJS Env
2015-03-29 06:27 1032Debian System(1)Java and NodeJS ... -
VirtualBox Importing OVA
2014-05-14 03:35 1231VirtualBox Importing OVAJust im ... -
Data Import Process
2012-09-05 11:21 1259Data Import Process 1. prepare ... -
Artifactory on Linux(1)
2011-12-13 22:41 1388Artifactory on Linux(1) Downlo ... -
Hudson/Jenkins Installation on Redhat4
2011-12-13 22:40 1357Hudson/Jenkins Installation on ... -
Archiva In Linux(1)
2011-12-13 13:56 1579Archiva In Linux(1) 1. install ... -
kingate(1)Install on redhat4
2011-11-02 23:02 1350kingate(1)Install on redhat4 1 ... -
JBOSS Performance Tuning
2011-09-22 16:20 1831JBOSS Performance Tuning 2. JV ... -
Linux Deploy Rails3 with Ruby1.9.2(5)Fix the Error Messages
2011-09-03 11:12 755Linux Deploy Rails3 with Ruby1. ... -
Linux Deploy Rails3 with Ruby1.9.2(4)Configure the rails in Apache2
2011-09-03 11:11 1610Linux Deploy Rails3 with Ruby1. ... -
Yum Problem after Python Upgrade
2011-08-23 17:09 4125Yum Problem after Python Upgrad ... -
Linux Deploy Rails3 with Ruby1.9.2(3)
2011-08-23 14:27 2219Linux Deploy Rails3 with Ruby1. ... -
Linux Deploy Rails3 with Ruby1.9.2(2)
2011-08-21 17:00 1677Linux Deploy Rails3 with Ruby1. ... -
Deploy Rails with Ruby1.9.2 on Redhat4(1)
2011-08-21 10:37 2217Deploy Rails with Ruby1.9.2 on ... -
Yum on Linux System
2011-08-20 14:00 1247Yum on Linux System download t ... -
Understand the Linux Version
2011-08-20 10:35 1435Understand the Linux Version 1 ... -
Linux Commands(I) scp
2011-06-21 23:54 1273Linux Commands(I) scp 1. scp i ... -
Linux Server Deployment(II)apache and SSH-CVS
2011-06-08 22:04 1616Linux Server Deployment(II)apac ...
相关推荐
Nginx实现负载均衡 web均衡负载 webservice负载均衡 Nginx实现负载均衡配制全说明 为了多台后台的web、webservice服务能均衡负载,可以使用nginx进行处理 1)配置文件全配制ok 2)有两个完整的web服务做例子,可以...
它因为轻量级、高性能和稳定性而被广泛使用,尤其适用于高并发、负载高的网络环境下。在实现负载均衡方面,Nginx...对于不同业务场景和负载特征,选择合适的调度算法和参数配置,是发挥Nginx负载均衡能力的关键所在。
基于lua的nginx自定义负载均衡基于lua的nginx自定义负载均衡
nginx版本目前使用的是最新的,负载均衡的架构采用的类似于新浪的架构体系,但不全是
在 Nginx 1.8 版本中,我们可以利用其强大的负载均衡功能来优化服务架构。 一、Nginx 负载均衡的基本原理 Nginx 作为前端服务器,接收来自客户端的请求,然后根据预设的策略将这些请求分发到后端的一组服务器上。...
nginx经常用到的负载均衡的5种策略,注意细节,部分属性不能一起使用。
基于nginx tcp负载均衡 + redis的集群聊天服务器,网络层使用muduo库搭建,数据库使用MySQL 基于nginx tcp负载均衡 + redis的集群聊天服务器,网络层使用muduo库搭建,数据库使用MySQL 基于nginx tcp负载均衡 + ...
Spring Boot+Nginx 实现负载均衡 在本文中,我们将介绍如何使用 Spring Boot 和 Nginx 实现负载均衡。负载均衡是指将 Incoming requests 分配到多个服务器,以提高系统的可扩展性和可靠性。使用 Spring Boot 和 ...
在构建高性能、高可用的Web服务时,"nginx+redis负载均衡、session共享"是一个常见的解决方案。这个方案结合了Nginx的反向代理和负载均衡能力,以及Redis的内存数据存储和分布式特性,用于处理高并发场景下的HTTP...
**Nginx负载均衡的实现方式** Nginx支持多种负载均衡策略,常见的有: 1. **轮询(round-robin)**:每个请求按时间顺序逐一分配到不同的服务器,如果服务器临时不可用,将跳过该服务器。 2. **最少连接数(least...
- 对于负载均衡,可以通过在Nginx配置文件中定义多个后端服务器,并使用`proxy_pass`指令来实现。 ```nginx upstream backend { server backend1.example.com; server backend2.example.com; } server { ...
【Windows环境下配置Nginx实现负载均衡集群】 在IT领域,负载均衡是一种常见的技术,用于在多台服务器间分配网络流量,以提高系统的可用性和响应速度。通常,Linux是实现负载均衡的主流平台,但Windows环境下的配置...
动态管理nginx负载均衡.zip动态管理nginx负载均衡.zip动态管理nginx负载均衡.zip动态管理nginx负载均衡.zip动态管理nginx负载均衡.zip动态管理nginx负载均衡.zip动态管理nginx负载均衡.zip动态管理nginx负载均衡.zip...
使用 Nginx 做七层负载均衡的理由包括: 1. 高并发连接:官方测试能够支撑 5 万并发连接,在实际生产环境中跑到 2 ~ 3 万并发连接数。 2. 内存消耗少:在 3 万并发连接下,开启的 10 个 Nginx 进程才消耗 150M ...
通过上述步骤,您可以在SUSE 11系统下成功安装并配置Nginx负载均衡,有效提升网站的访问速度和服务稳定性。需要注意的是,在实际部署过程中,可能还需要根据具体情况进行一些额外的配置调整,例如SSL证书的安装等。...
"Nginx+Tomcat 负载均衡 3分钟搞定" 本文将从以下几个方面详细介绍 Nginx+Tomcat 实现负载均衡的知识点: 一、负载均衡的概念和优势 负载均衡(Load Balancing)是指在多台服务器之间分配工作负载,以提高响应...
在传统的nginx负载均衡配置中,并未直接提供后端服务器健康检查的功能,但nginx提供了几个重要的指令来帮助我们设置超时和重试机制,来间接保障服务的可用性。例如,proxy_connect_timeout指令用于设置nginx尝试连接...
### Nginx负载均衡实现 #### 一、负载均衡概念及必要性 负载均衡是一种用于在网络环境中分散工作负载的技术,通常用于改善网络性能、提高可用性和最大化资源利用。当单台服务器难以应对高流量和并发请求时,负载...
### HAProxy与Nginx实现负载均衡的关键知识点 #### 一、HAProxy简介与特性 HAProxy是一款开源的、高效且可靠的负载均衡器,专为处理大规模Web流量设计。其核心功能包括: - **高可用性**:HAProxy能够确保在主...
### Nginx负载均衡教程详解 #### 一、Nginx与负载均衡概念介绍 - **Nginx简介**:Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like协议下发行。其特点是占有内存少,...