為了簡單就在windows 上介紹一下了
nginx
steam 子產品 轉發tcp 對socket做負載均衡
配置如下:
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;
}
stream{
log_format proxy '$remote_addr [$time_local] '
'$protocol $status $bytes_sent $bytes_received '
'$session_time "$upstream_addr" '
'"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
open_log_file_cache off;
access_log logs/tcp-access.log proxy ;
upstream test{
server xxx.xxx.xxx.xxx:443 weight=1 max_fails=1 fail_timeout=30s;
server xxx.xxx.xxx.xxx:443 weight=1 max_fails=1 fail_timeout=30s;
}
server{
listen 4438;
proxy_pass test;
proxy_connect_timeout 8s;
proxy_timeout 7d;
}
}
upstream 子產品 轉發web socket做負載均衡
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
upstream wsbackend {
server 127.0.0.1:9123;
}
upstream service {
server 127.0.0.1:8080 weight=1 max_fails=3 fail_timeout=30s;
}
server {
listen 443 ssl;
server_name localhost;
ssl_certificate ../ssl/icetech.com.cn.pem;
ssl_certificate_key ../ssl/icetech.com.cn.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location /service {
proxy_pass http://service;# 反向代理
proxy_set_header X-Real-IP $remote_addr;
proxy_next_upstream http_502 http_504 error timeout invalid_header;
}
location / {
proxy_pass http://wsbackend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
}
常用的配置
#user nobody; #使用者
worker_processes 1; #工作程序,根據硬體調整,大于等于CPU核數
#error_log logs/error.log; #錯誤日志配置
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid; #pid放置位置
events {
#use epoll;
#使用epoll的I/O 模型
# 補充說明:
#與apache相類,nginx針對不同的作業系統,有不同的事件模型
#A)标準事件模型
#Select、poll屬于标準事件模型,如果目前系統不存在更有效的方法,nginx會選擇select或poll
#B)高效事件模型
#Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用雙處理器的MacOS #X系統使用kqueue可能會造成核心崩潰。
#Epoll:使用于Linux核心2.6版本及以後的系統。
#/dev/poll:使用于Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。
#Eventport:使用于Solaris 10. 為了防止出現核心崩潰的問題, 有必要安裝安全更新檔
worker_connections 1024;
#工作程序的最大連接配接數量,根據硬體調整,和前面工作程序配合起來用,盡量大,但是别把cpu跑到100%就行
#每個程序允許的最多連接配接數, 理論上每台nginx伺服器的最大連接配接數為worker_processes*worker_connections
keepalive_timeout 60;
}
#設定http伺服器,利用它的反向代理功能提供負載均衡支援
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
#配置兩台Tomcat真實伺服器
upstream B2C_WEB {
#ip_hash; #目的保證用戶端的ip位址不變,請求就隻送到固定的一個Tomcat處理
server 192.168.126.1:8080 weight=1 max_fails=3 fail_timeout=30s;
server 192.168.126.15:8080 weight=1 max_fails=3 fail_timeout=30s;
#weight=1表示
#這表示,如果伺服器192.168.126.1 | 15在30秒内出現了3次錯誤,
#那麼就認為這個伺服器工作不正常,進而在接下來的30秒内nginx不再去通路這個伺服器。
}
server {
listen 80; #監聽端口
server_name localhost;
charset UTF-8;
index index.html index.htm index.jsp index.do;
root E:\\JavaEE\\Apache-Tomcat-7.0.41\\wtpwebapps; #WEB服務的主目錄
location ~ ^/(WEB-INF)/ {
deny all; #禁止通路WEB-INF目錄
}
# 動态資料由代理伺服器Tomcat處理
location ~ .*\.(jsp|jspx|do)?$ {
proxy_pass http://B2C;# 反向代理
proxy_set_header X-Real-IP $remote_addr;
proxy_next_upstream http_502 http_504 error timeout invalid_header;
}
# 靜态資料直接讀取不經過Tomcat伺服器
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d; #在用戶端儲存時間
}
location ~ .*\.(js|css)?$
{
expires 1h;
}
# 監控Nginx服務狀态
location /Nginxstatus {
stub_status on;
access_log off;
}
#charset koi8-r;
#access_log logs/host.access.log main;
#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;
}
}
}
什麼是nginx
Nginx是一款高性能的http 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器。由俄羅斯的程式設計師Igor Sysoev所開發,官方測試nginx能夠支支撐5萬并發連結,并且cpu、記憶體等資源消耗卻非常低,運作非常穩定。
應用場景
1、http伺服器。Nginx是一個http服務可以獨立提供http服務。可以做網頁靜态伺服器。
2、虛拟主機。可以實作在一台伺服器虛拟出多個網站。例如個人網站使用的虛拟主機。
3、反向代理,負載均衡。當網站的通路量達到一定程度後,單台伺服器不能滿足使用者的請求時,需要用多台伺服器叢集可以使用nginx做反向代理。并且多台伺服器可以平均分擔負載,不會因為某台伺服器負載高當機而某台伺服器閑置的情況。
nginx安裝
下載下傳nginx:
官方網站:
http://nginx.org/
要求的安裝環境
1、需要安裝gcc的環境。yum install gcc-c++
2、第三方的開發包。
PCRE
PCRE(Perl Compatible Regular Expressions)是一個Perl庫,包括 perl 相容的正規表達式庫。nginx的http子產品使用pcre來解析正規表達式,是以需要在linux上安裝pcre庫。
yum install -y pcre pcre-devel
注:pcre-devel是使用pcre開發的一個二次開發庫。nginx也需要此庫。
zlib
zlib庫提供了很多種壓縮和解壓縮的方式,nginx使用zlib對http包的内容進行gzip,是以需要在linux上安裝zlib庫。
yum install -y zlib zlib-devel
openssl
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
啟動nginx
進入sbin目錄
[root@localhost sbin]# ./nginx
關閉nginx:
[root@localhost sbin]# ./nginx -s stop
推薦使用:
[root@localhost sbin]# ./nginx -s quit
重新開機nginx:
1、先關閉後啟動。
2、重新整理配置檔案:
[root@localhost sbin]# ./nginx -s reload
配置虛拟主機
就是在一台伺服器啟動多個網站。
如何區分不同的網站:
1、域名不同
2、端口不同
通過端口區分不同虛拟機
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,配置了多個虛拟主機。
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;
}
}
}
添加虛拟主機:
#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;
}
}
}
通過域名區分虛拟主機
什麼是域名
域名就是網站。
www.baidu.com
www.taobao.com
www.jd.com
Tcp/ip
Dns伺服器:把域名解析為ip位址。儲存的就是域名和ip的映射關系。
一級域名:
Baidu.com
Taobao.com
Jd.com
二級域名:
www.baidu.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伺服器。
Nginx的配置
#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實作反向代理
兩個域名指向同一台nginx伺服器,使用者通路不同的域名顯示不同的網頁内容。
兩個域名是www.sian.com.cn和www.sohu.com
nginx伺服器使用虛拟機192.168.101.3
第一步:安裝兩個tomcat,分别運作在8080和8081端口。
第二步:啟動兩個tomcat。
第三步:反向代理伺服器的配置
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作為負載均衡器,所有請求都到了nginx,可見nginx處于非常重點的位置,如果nginx伺服器當機後端web服務将無法提供服務,影響嚴重。
為了屏蔽負載均衡伺服器的當機,需要建立一個備份機。主伺服器和備份機上都運作高可用(High Availability)監控程式,通過傳送諸如“I am alive”這樣的資訊來監控對方的運作狀況。當備份機不能在一定的時間内收到這樣的資訊時,它就接管主伺服器的服務IP并繼續提供負載均衡服務;當備份管理器又從主管理器收到“I am alive”這樣的資訊時,它就釋放服務IP位址,這樣的主伺服器就開始再次提供負載均衡服務。
什麼是keepalived
keepalived是叢集管理中保證叢集高可用的一個服務軟體,用來防止單點故障。
Keepalived的作用是檢測web伺服器的狀态,如果有一台web伺服器當機,或工作出現故障,Keepalived将檢測到,并将有故障的web伺服器從系統中剔除,當web伺服器工作正常後Keepalived自動将web伺服器加入到伺服器群中,這些工作全部自動完成,不需要人工幹涉,需要人工做的隻是修複故障的web伺服器。
keepalived工作原理
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+nginx實作主備過程
初始狀态:
user
|(0)
|
vip 192.168.101.100
/
/
/(1)
/
/
/
nginx nginx
負載均衡伺服器(主) 負載均衡伺服器(備)
192.168.101.3 <--心跳--> 192.168.101.3
keepalived keepalived
\
\
\ (2)
\
\
tomcat 叢集
0 使用者通路虛拟ip
1 導入nginx 主
2 nginx 導入tomcat叢集
主機當機:
user
|(2)
|
vip 192.168.101.100
\
\
(1) \(3)
\
\
\
nginx nginx
負載均衡伺服器(主) 負載均衡伺服器(備)
192.168.101.3 (0) <--心跳--> 192.168.101.3
keepalived keepalived
/
/
/
/(4)
/
tomcat 叢集
0 心跳檢查 主挂了
1 切換到備線路
2 使用者通路虛拟ip
3 導入nginx 備
4 nginx 導入tomcat叢集
主機恢複:
user
|(0)
|
vip 192.168.101.100
/
/
/(1)
/
/
/
nginx nginx
負載均衡伺服器(主) 負載均衡伺服器(備)
192.168.101.3 <--心跳--> 192.168.101.3
keepalived keepalived
\
\
\ (2)
\
\
tomcat 叢集
0 心跳檢查 主活了
1 切換到主線路
2 使用者通路虛拟ip
3 導入nginx 備
4 nginx 導入tomcat叢集
高可用環境
兩台nginx,一主一備:192.168.101.3和192.168.101.4
兩台tomcat伺服器:192.168.101.5、192.168.101.6
安裝keepalived
分别在主備nginx上安裝keepalived,參考keepalived.txt進行安裝: