一、nginx的安装javascript
二、Nginx配置虚拟机php
三、Nginx实现反向代理css
四、Nginx实现负载均衡 html
Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。由俄罗斯的程序设计师Igor Sysoev所开发,官方测试nginx可以支支撑5万并发连接,而且cpu、内存等资源消耗却很是低,运行很是稳定。java
一、http服务器。Nginx是一个http服务能够独立提供http服务。能够作网页静态服务器。【root】node
二、虚拟主机。能够实如今一台服务器虚拟出多个网站。例如我的网站使用的虚拟主机。【一个server节点就是一个虚拟主机】linux
三、反向代理,负载均衡。当网站的访问量达到必定程度后,单台服务器不能知足用户的请求时,须要用多台服务器集群可使用nginx作反向代理。而且多台服务器能够平均分担负载,不会由于某台服务器负载高宕机而某台服务器闲置的状况。【upstream proxy_pass】nginx
下载nginx:c++
官方网站:web
使用的版本是1.8.0版本。
Nginx提供的源码。
一、须要安装gcc的环境。yum install gcc-c++
二、第三方的开发包。
PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,因此须要在linux上安装pcre库。
yum install -y pcre pcre-devel
注:pcre-devel是使用pcre开发的一个二次开发库。nginx也须要此库。
zlib库提供了不少种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,因此须要在linux上安装zlib库。
yum install -y zlib zlib-devel
OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、经常使用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
nginx不只支持http协议,还支持https(即在ssl协议上传输http),因此须要在linux安装openssl库。
yum install -y openssl openssl-devel
第一步:把nginx的源码包上传到linux系统
第二步:解压缩
[root@localhost ~]# tar zxf nginx-1.8.0.tar.gz
第三步:使用configure命令建立一makeFile文件。
./configure \ --prefix=/usr/local/nginx \ --pid-path=/var/run/nginx/nginx.pid \ --lock-path=/var/lock/nginx.lock \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/nginx/access.log \ --with-http_gzip_static_module \ --http-client-body-temp-path=/var/temp/nginx/client \ --http-proxy-temp-path=/var/temp/nginx/proxy \ --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \ --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \ --http-scgi-temp-path=/var/temp/nginx/scgi
注意:启动nginx以前,上边将临时文件目录指定为/var/temp/nginx,须要在/var下建立temp及nginx目录
[root@localhost sbin]# mkdir /var/temp/nginx/client -p
第四步:make
第五步:make install
进入sbin目录,nginx的启动能够直接执行nginx的bin文件, 当nginx启动后,能够经过-s 参数来控制nginx
[root@localhost sbin]# ./nginx
nginx -s reload #从新加载配置文件 nginx -s reopen #从新打开log文件 nginx -s stop #快速关闭nginx服务 nginx -s quit #优雅的关闭nginx服务,等待工做进程处理完全部的请求
[root@localhost sbin]# ./nginx -s stop
推荐使用:
[root@localhost sbin]# ./nginx -s quit
kill 进程号【正常关闭】
kill -9 进程号【暴力关闭】
一、先关闭后启动。
二、修改了Nginx的配置文件后,在不用重启Nginx的时候,能够用以下命令刷新配置文件:
[root@localhost sbin]# ./nginx -s reload
Nginx从新加载配置文件的过程:主进程接受到加载信号后:
在第二步,旧的工做进程收到终止信号后,会中止接收新的链接请求,知道全部现有的请求处理完,而后退出。
默认是80端口。
注意:是否关闭防火墙。
Nginx进程模型:1个主进程,n个工做进程,主进程负责配置和工做进程的管理,实际的请求由工做进程进行处理。Nginx是基于事件驱动和多路复用的工做模型。
nginx conf文件结构介绍以及相关配置:
https://blog.csdn.net/anonymalias/article/details/50950910
nginx的配置由特定的标识符(指令符)分为多个不一样的模块。
指令符分为简单指令和块指令。
conf文件中,全部不属于块指令的简单指令都属于main上下文的,http块指令属于main上下文,server块指令http上下文。
... #全局块 events { #events块 ... } http #http块 { ... #http全局块 server #server块 { ... #server全局块 location [PATTERN] #location块 { ... } location [PATTERN] { ... } } server { ... } ... #http全局块 }
一、全局块:配置影响nginx全局的指令。通常有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,容许生成worker process数等。
二、events块:配置影响nginx服务器或与用户的网络链接。有每一个进程的最大链接数,选取哪一种事件驱动模型处理链接请求,是否容许同时接受多个网路链接,开启多个网络链接序列化等。
三、http块:能够嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,链接超时时间,单链接请求数等。
四、server块:配置虚拟主机的相关参数,一个http中能够有多个server。
五、location块:配置请求的路由,以及各类页面的处理状况。
一个例子:
########### 每一个指令必须有分号结束。################# #user administrator administrators; #配置用户或者组,默认为nobody nobody。 #worker_processes 2; #容许生成的进程数,默认为1 #pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址 error_log log/error.log debug; #制定日志路径,级别。这个设置能够放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg events { accept_mutex on; #设置网路链接序列化,防止惊群现象发生,默认为on multi_accept on; #设置一个进程是否同时接受多个网络链接,默认为off #use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport worker_connections 1024; #最大链接数,默认为512 } http { include mime.types; #文件扩展名与文件类型映射表 default_type application/octet-stream; #默认文件类型,默认为text/plain #access_log off; #取消服务日志 log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式 access_log log/access.log myFormat; #combined为日志格式的默认值 sendfile on; #容许sendfile方式传输文件,默认为off,能够在http块,server块,location块。 sendfile_max_chunk 100k; #每一个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。 keepalive_timeout 65; #链接超时时间,默认为75s,能够在http,server,location块。 upstream mysvr { server 127.0.0.1:7878; server 192.168.10.121:3333 backup; #热备 } error_page 404 https://www.baidu.com; #错误页 server { keepalive_requests 120; #单链接请求上限次数。 listen 4545; #监听端口 server_name 127.0.0.1; #监听地址 location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。 #root path; #根目录 #index vv.txt; #设置默认页 proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表 deny 127.0.0.1; #拒绝的ip allow 172.18.5.54; #容许的ip } } }
Nginx配置详解 http://www.javashuo.com/article/p-xkijqyyb-hr.html
完整的基本配置文件以下:
#运行用户 user www-data; #启动进程,一般设置成和cpu的数量相等 worker_processes 1; #全局错误日志及PID文件 error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; #工做模式及链接数上限 events { use epoll; #epoll是多路复用IO(I/O Multiplexing)中的一种方式,可是仅用于linux2.6以上内核,能够大大提升nginx的性能 worker_connections 1024;#单个后台worker process进程的最大并发连接数 # multi_accept on; } #设定http服务器,利用它的反向代理功能提供负载均衡支持 http { #设定mime类型,类型由mime.type文件定义 include /etc/nginx/mime.types; default_type application/octet-stream; #设定日志格式 access_log /var/log/nginx/access.log; #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用, #必须设为 on,若是用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,下降系统的uptime. sendfile on; #tcp_nopush on; #链接超时时间 #keepalive_timeout 0; keepalive_timeout 65; tcp_nodelay on; #开启gzip压缩 gzip on; gzip_disable "MSIE [1-6]\.(?!.*SV1)"; #设定请求缓冲 client_header_buffer_size 1k; large_client_header_buffers 4 4k; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; #设定负载均衡的服务器列表 upstream mysvr { #weigth参数表示权值,权值越高被分配到的概率越大 #本机上的Squid开启3128端口 server 192.168.8.1:3128 weight=5; server 192.168.8.2:80 weight=1; server 192.168.8.3:80 weight=6; } server { #侦听80端口 listen 80; #定义使用www.xx.com访问 server_name www.xx.com; #设定本虚拟主机的访问日志 access_log logs/www.xx.com.access.log main; #默认请求 location / { root /root; #定义服务器的默认网站根目录位置 index index.php index.html index.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$ { root /root; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name; include fastcgi_params; } #设定查看Nginx状态的地址 location /NginxStatus { stub_status on; access_log on; auth_basic "NginxStatus"; auth_basic_user_file conf/htpasswd; } #禁止访问 .htxxx 文件 location ~ /\.ht { deny all; } } }
以上是一些基本的配置,使用Nginx最大的好处就是负载均衡
若是要使用负载均衡的话,能够修改配置http节点以下:
#设定http服务器,利用它的反向代理功能提供负载均衡支持 http { #设定mime类型,类型由mime.type文件定义 include /etc/nginx/mime.types; default_type application/octet-stream; #设定日志格式 access_log /var/log/nginx/access.log; #省略上文有的一些配置节点 #。。。。。。。。。。 #设定负载均衡的服务器列表 upstream mysvr { #weigth参数表示权值,权值越高被分配到的概率越大 server 192.168.8.1x:3128 weight=5;#本机上的Squid开启3128端口 server 192.168.8.2x:80 weight=1; server 192.168.8.3x:80 weight=6; } upstream mysvr2 { #weigth参数表示权值,权值越高被分配到的概率越大 server 192.168.8.x:80 weight=1; server 192.168.8.x:80 weight=6; } #第一个虚拟服务器 server { #侦听192.168.8.x的80端口 listen 80; server_name 192.168.8.x; #对aspx后缀的进行负载均衡请求 location ~ .*\.aspx$ { root /root; #定义服务器的默认网站根目录位置 index index.php index.html index.htm; #定义首页索引文件的名称 proxy_pass http://mysvr ;#请求转向mysvr 定义的服务器列表 #如下是一些反向代理的配置可删除. proxy_redirect off; #后端的Web服务器能够经过X-Forwarded-For获取用户真实IP proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 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_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传 } } }
一般状况下,conf文件存在多个server块,一个server就是一个虚拟主机,经过listen的端口(默认是80端口)和server_name进行区分, 对不一样的请求提供不一样的服务,以下:
server { listen 80; server_name a.example.org; ... }
listen指令的参数:能够是ip, hostname, ip/hostname:port, port, UNIX-domain socket.例如:
listen 127.0.0.1:8000;listen 127.0.0.1;listen 8000;listen *:8000;listen localhost:8000; listen unix:/var/run/nginx.sock;
server块内部的listen和server_name不能和其余server块的彻底相同,不然启动加载配置的时候会出错:
当nginx决定了哪个server处理客户端请求后,nginx会解析request header中URI(这里以及后面提到的大部分都是指相对URI),而后匹配server块中的location指令的参数,匹配规则下一节会介绍。例以下例:
server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } }
location块指令会用其参数与客户端请求的URI进行匹配,匹配的URI请求会被定向到root指令定义的特殊本地文件系统目录中,重定向规则为:将URI添加到root参数后面,生成一个本地文件路径,即:root参数 + URI请求。这里示例参数”/”会匹配全部的请求,通常都会默认存在。示例定位后的目录为html/,默认是定位到安装目录的路径下的html/(相对路径)。这里location块指令内部的两个简单指令的含义是:
默认的在nginx安装目录下都会存在一个html目标,在我电脑中为:/usr/local/nginx-1.8.0/html, 而后里面存在默认的nignx的欢迎界面,例如我安装nginx后直接启动nginx bin文件,而后访问对应的域名就获得了以下的页面:
若是有多个location指令块匹配到,nginx的选择策略是the longest prefix最长前缀匹配原则。
例如,当上述的server中再增长一个location块,匹配参数为”/htdocs/”,重定向的资源路径为以下配置,
server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } location /htdocs { root /home/anonymalias; index index.html; } }
当访问http://anonymalias.oicp.net:8008/htdocs/,就会匹配到/home/anonymalias/htdocs/index.html
nginx的location指令是配置的核心,用于匹配client请求uri的path部分,而后对不一样的请求提供不一样的静态内容,或者经过反向代理重定向到内部的server。
对于client的request, nginx会进行预处理,nginx首先对采用 ’%XX’(uri采用%+十六进制格式用于在浏览器和插件中显示非标准的字母和字符) 格式文本编码的uri进行解码。而后处理path中的相对路径符号’.’和‘..’,而后对于含有两个及以上的’/’压缩成一个’/’。 这样处理完后会获得一个干净的path,而后会用这个path会在server的location指令的参数进行匹配。
location 语法: location [ = | ~ | ~* | ^~ ] uri { ... } location @name { ... }
location指令的参数:
location ~* \.(gif|jpg|jpeg)$ { [ configuration A ] } location ~ \.(gif|jpg|jpeg)$ { [ configuration B ] }
若请求URI为/images/a.JPG,只能匹配A。
location匹配的过程:
1. 首先nginx会把request的uri在location正常字符串参数中匹配出符合的最长字符串,并保存这个结果;
2. 若是最长前缀匹配结果前面有 ”^~”修饰符,那么中止继续搜索;
3. 若是最长匹配结果前有”=”修饰符,也会中止继续搜索;
4. 接下来,去匹配参数为正则表达式的全部location,根据location的配置顺序,在匹配到第一个正则表达式时,即中止搜索其余的正则表达式;
因此如官网上的下例:
location = / { [ configuration A ] } location / { [ configuration B ] } location /documents/ { [ configuration C ] } location ^~ /images/ { [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { [ configuration E ] }
关键配置:root
Web server很重要一部分工做就是提供静态页面的访问(作http服务器,提供服务),例如images, html page。nginx能够经过不一样的配置,根据request请求,从本地的目录(有root指定,当配置了proxy_pass代理时候,nginx将再也不直接提供服务,而只作请求转发)提供不一样的文件返回给客户端。
打开安装目录下的nginx.conf文件,默认配置文件已经在http指令块中建立了一个空的server块,在nginx-1.8.0中的http块中已经建立了一个默认的server块。内容以下:
server {
listen 80; server_name localhost; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
就是在一台服务器启动多个网站。一个server就是一个虚拟主机。
如何区分不一样的网站:
一、域名不一样
二、端口不一样
Nginx的配置文件:
/usr/local/nginx/conf/nginx.conf
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } 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; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; #一个server节点就是一个虚拟主机 server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { #Html是nginx安装目录下的html目录(静态页面存放的位置,也可使用绝对路径) root html; index index.html index.htm; } } }
能够配置多个server,配置了多个虚拟主机。
添加虚拟主机:
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } 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; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost;(域名) #charset koi8-r; #access_log logs/host.access.log main; Location / { root html; index index.html index.htm; } } server { listen 81; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html-81; index index.html index.htm; } } }
从新加载配置文件
[root@localhost nginx]# sbin/nginx -s reload
域名就是网站。
Tcp/ip
Dns服务器:把域名解析为ip地址。保存的就是域名和ip的映射关系。
一级域名:
Baidu.com
Taobao.com
Jd.com
二级域名:
Image.baidu.com
Item.baidu.com
三级域名:
1.Image.baidu.com
Aaa.image.baidu.com
一个域名对应一个ip地址,一个ip地址能够被多个域名绑定。
本地测试能够修改hosts文件。
修改window的hosts文件:(C:\Windows\System32\drivers\etc)
能够配置域名和ip的映射关系,若是hosts文件中配置了域名和ip的对应关系,不须要走dns服务器。
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } 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; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } } server { listen 81; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html-81; index index.html index.htm; } } server { listen 80; server_name www.taobao.com; #charset koi8-r; #access_log logs/host.access.log main; location / { root html-taobao; index index.html index.htm; } } server { listen 80; server_name www.baidu.com; #charset koi8-r; #access_log logs/host.access.log main; location / { root html-baidu; index index.html index.htm; } } }
域名的配置:
192.168.25.148 www.taobao.com
192.168.25.148 www.baidu.com
Nginx代理功能与负载均衡详解:
http://www.javashuo.com/article/p-xkijqyyb-hr.html
http://www.cnblogs.com/knowledgesea/p/5199046.html
正向代理
(代理客户端)接收到客户端,替代客户端去完成上网,将得到的结果返回给客户端。
反向代理:(代理服务端)
反向代理服务器决定哪台服务器提供服务。
返回代理服务器不提供服务器。只是请求的转发。
Nginx在作反向代理时,提供性能稳定,而且可以提供配置灵活的转发功能。Nginx能够根据不一样的正则匹配,采起不一样的转发策略,好比图片文件结尾的走文件服务器,动态页面走web服务器,只要你正则写的没问题,又有相对应的服务器解决方案,你就能够为所欲为的玩。而且Nginx对返回结果进行错误页跳转,异常判断等。若是被分发的服务器存在异常,他能够将请求从新转发给另一台服务器,而后自动去除异常服务器。
下面是nginx官方最简单的一个proxy server的配置示例:
server { location / { proxy_pass http://localhost:8080/; } location ~ \.(gif|jpg|png)$ { root /data/images; } }
配置的含义:全部URI中以.gif, .jpg, .png结尾的请求都会被映射到/data/images本地磁盘目录,把全部其余的URI请求都传给配置的被代理的server: http://localhost:8080/。
该指令是反向代理的基本指令,用于设置代理服务器的协议和地址;对于一个client的请求,proxy_pass指令经过如下方式进行uri的转发:
语法:proxy_pass_header field
field参数是http全部的header名字,具体能够参考: [HTTP/1.1协议][1] P100 chapter14关于HTTP协议全部header field的定义。
语法:proxy_set_header field value;
该指令用于将client传递给proxy server的request header从新定义或者添加字段。Value能够是文本,变量和二者结合。
若是set 的header field的值为空,那么这个header是不会传递给proxy server的
两个域名指向同一台nginx服务器,用户访问不一样的域名显示不一样的网页内容。
两个域名是www.sian.com.cn和www.sohu.com
nginx服务器使用虚拟机192.168.25.148
第一步:安装两个tomcat,分别运行在8080和8081端口。
第二步:启动两个tomcat。
第三步:反向代理服务器的配置
复制一个server节点,将root改为proxy_pass,配置了proxy_pass以后服务器不提供服务器,只是请求的转发。
配置upstream
upstream tomcat1 { server 192.168.25.148:8080; } server { listen 80; server_name www.sina.com.cn;
#charset koi8-r;
#access_log logs/host.access.log main;
location / { proxy_pass http://tomcat1; index index.html index.htm; } } upstream tomcat2 { server 192.168.25.148:8081; } server { listen 80; server_name www.sohu.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / { proxy_pass http://tomcat2; index index.html index.htm; } } |
第四步:nginx从新加载配置文件
第五步:配置域名
在hosts文件中添加域名和ip的映射关系
192.168.25.148 www.sina.com.cn
192.168.25.148 www.sohu.com
若是一个服务由多台服务器提供,须要把负载分配到不一样的服务器处理,须要负载均衡。
Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash。扩展策略,就天马行空,只有你想不到的没有他作不到的。
upstream tomcat2 {
server 192.168.25.148:8081;
server 192.168.25.148:8082;
}
能够根据服务器的实际状况调整服务器权重weight。权重越高分配的请求越多,权重越低,请求越少。默认是都是1,是轮询机制。
upstream tomcat2 { server 192.168.25.148:8081; server 192.168.25.148:8082 weight=2; } |
要实现nginx的高可用,须要实现备份机。
nginx做为负载均衡器,全部请求都到了nginx(对外服务的惟一入口,惟一公网IP),可见nginx处于很是重点的位置,若是nginx服务器宕机后端web服务将没法提供服务,影响严重。
为了屏蔽负载均衡服务器的宕机,须要创建一个备份机。主服务器和备份机上都运行高可用(High Availability)监控程序,经过传送诸如“I am alive”这样的信息来监控对方的运行情况。当备份机不能在必定的时间内收到这样的信息时,它就接管主服务器的服务IP并继续提供负载均衡服务;当备份管理器又从主管理器收到“I am alive”这样的信息时,它就释放服务IP地址,这样的主服务器就开始再次提供负载均衡服务。
一般说的双机热备是指两台机器都在运行,但并非两台机器都同时在提供服务。
当提供服务的一台出现故障的时候,另一台会立刻自动接管而且提供服务,并且切换的时间很是短。
keepalived是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。
Keepalived的做用是检测web服务器的状态(健康监测),若是有一台web服务器死机,或工做出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工做正常后Keepalived自动将web服务器加入到服务器群中,这些工做所有自动完成,不须要人工干涉,须要人工作的只是修复故障的web服务器。
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
虚拟路由冗余协议,能够认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(VIP = Virtual IP Address,虚拟IP地址,该路由器所在局域网内其余机器的默认路由为该vip),master会发组播,当backup收不到VRRP包时就认为master宕掉了,这时就须要根据VRRP的优先级来选举一个backup当master。这样的话就能够保证路由器的高可用了。
keepalived主要有三个模块,分别是core、check和VRRP。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各类检查方式。VRRP模块是来实现VRRP协议的。
详细参考:Keepalived权威指南中文.pdf
nginx和keepalived实现nginx高可用:
https://blog.csdn.net/u012453843/article/details/69668663
初始时候,nginx主服务器正常,将vip绑定到自身,对外提供服务,从服务器始终与主服务器保持通讯,监测主服务器的健康状态。
当nginx主服务器宕机或发生异常,总之以任何理由形成服务器上的健康监测程序发生异常,没法和从服务器上的健康监测程序通讯,此时从服务器上的健康监测机制就会认为主服务器挂了,从而将vip绑定到自身,成功上位,充当主服务器的角色。
在keepalive机制中,主服务器终究是主服务器,一旦主服务器恢复,边重新绑定vip,继续充当主服务器,而从服务器又成为了热备。
两台nginx,一主一备:192.168.101.3和192.168.101.4
两台tomcat服务器:192.168.101.五、192.168.101.6
一、分别在主备nginx上安装keepalived,参考“安装笔记”进行安装:
二、Keepalived安装与配置:
https://blog.csdn.net/xyang81/article/details/52554398
修改主和备nginx服务器上的keepalived 配置文件 /etc/keepalived/keepalived.conf 文件
修改主nginx下/etc/keepalived/keepalived.conf文件
! Configuration File for keepalived #全局配置 global_defs { notification_email { #指定keepalived在发生切换时须要发送email到的对象,一行一个 XXX@XXX.com } notification_email_from XXX@XXX.com #指定发件人 #smtp_server XXX.smtp.com #指定smtp服务器地址 #smtp_connect_timeout 30 #指定smtp链接超时时间 router_id LVS_DEVEL #运行keepalived机器的一个标识 } vrrp_instance VI_1 { state MASTER #标示状态为MASTER 备份机为BACKUP interface eth0 #设置实例绑定的网卡 virtual_router_id 51 #同一实例下virtual_router_id必须相同 priority 100 #MASTER权重要高于BACKUP 好比BACKUP为99 advert_int 1 #MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒 authentication { #设置认证 auth_type PASS #主从服务器验证方式 auth_pass 8888 } virtual_ipaddress { #设置vip 192.168.101.100 #能够多个虚拟IP,换行便可 } }
修改备nginx下/etc/keepalived/keepalived.conf文件
配置备nginx时须要注意:须要修改state为BACKUP , priority比MASTER低,virtual_router_id和master的值一致
! Configuration File for keepalived #全局配置 global_defs { notification_email { #指定keepalived在发生切换时须要发送email到的对象,一行一个 XXX@XXX.com } notification_email_from XXX@XXX.com #指定发件人 #smtp_server XXX.smtp.com #指定smtp服务器地址 #smtp_connect_timeout 30 #指定smtp链接超时时间 router_id LVS_DEVEL #运行keepalived机器的一个标识 } vrrp_instance VI_1 { state BACKUP #标示状态为MASTER 备份机为BACKUP interface eth0 #设置实例绑定的网卡 virtual_router_id 51 #同一实例下virtual_router_id必须相同 priority 99 #MASTER权重要高于BACKUP 好比BACKUP为99 advert_int 1 #MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒 authentication { #设置认证 auth_type PASS #主从服务器验证方式 auth_pass 8888 } virtual_ipaddress { #设置vip 192.168.101.100 #能够多个虚拟IP,换行便可 } }
主备nginx都启动keepalived及nginx。
service keepalived start
./nginx
查看主nginx的eth0设置:
vip绑定在主nginx的eth0上。
查看备nginx的eth0设置:
vip没有绑定在备nginx的eth0上。
访问ccc.test.com,能够访问。
将主nginx的keepalived中止或将主nginx关机(至关于模拟宕机),查看主nginx的eth0:
eth0没有绑定vip
注意这里模拟的是中止 keepalived进程没有模拟宕机,因此还要将nginx进程也中止表示主nginx服务没法提供。
查看备nginx的eth0:
vip已经漂移到备nginx。
访问ccc.test.com,能够访问。
将主nginx的keepalived和nginx都启动。
查看主nginx的eth0:
查看备nginx的eth0:
vip漂移到主nginx。
查看备nginx的eth0:
eth0没有绑定vip
访问:ccc.test.com,正常访问。
注意:主nginx恢复时必定要将nginx也启动(一般nginx启动要加在开机启动中),不然即便vip漂移到主nginx也没法访问。
keepalived是经过检测keepalived进程是否存在判断服务器是否宕机,若是keepalived进程在可是nginx进程不在了那么keepalived是不会作主备切换,因此咱们须要写个脚原本监控nginx进程是否存在,若是nginx不存在就将keepalived进程杀掉。
在主nginx上须要编写nginx进程检测脚本(check_nginx.sh),判断nginx进程是否存在,若是nginx不存在就将keepalived进程杀掉,check_nginx.sh内容以下:
#!/bin/bash # 若是进程中没有nginx则将keepalived进程kill掉 A=`ps -C nginx --no-header |wc -l` ## 查看是否有 nginx进程 把值赋给变量A if [ $A -eq 0 ];then ## 若是没有进程值得为 零 service keepalived stop ## 则结束 keepalived 进程 fi
将check_nginx.sh拷贝至/etc/keepalived下,
脚本测试:
将nginx中止,将keepalived启动,执行脚本:sh /etc/keepalived/check_nginx.sh
从执行能够看出自动将keepalived进程kill掉了。
修改主nginx的keepalived.conf,添加脚本定义检测:
注意下边红色标识地方:
#全局配置 global_defs { notification_email { #指定keepalived在发生切换时须要发送email到的对象,一行一个 XXX@XXX.com } notification_email_from miaoruntu@itcast.cn #指定发件人 #smtp_server XXX.smtp.com #指定smtp服务器地址 #smtp_connect_timeout 30 #指定smtp链接超时时间 router_id LVS_DEVEL #运行keepalived机器的一个标识 } vrrp_script check_nginx { script "/etc/keepalived/check_nginx.sh" ##监控脚本 interval 2 ##时间间隔,2秒 weight 2 ##权重 } vrrp_instance VI_1 { state MASTER #标示状态为MASTER 备份机为BACKUP interface eth0 #设置实例绑定的网卡 virtual_router_id 51 #同一实例下virtual_router_id必须相同 priority 100 #MASTER权重要高于BACKUP 好比BACKUP为99 advert_int 1 #MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒 authentication { #设置认证 auth_type PASS #主从服务器验证方式 auth_pass 8888 } track_script { check_nginx #监控脚本 } virtual_ipaddress { #设置vip 192.168.101.100 #能够多个虚拟IP,换行便可 } }
修改后重启keepalived
回到负载均衡高可用的初始状态,保证主、备上的keepalived、nginx所有启动。
中止主nginx服务
观察keepalived日志:
tail -f /var/log/keepalived.log
查看keepalived进程已经不存在。
查看eth0已经没有绑定vip。