1、高可用配置結構(畫圖說明)
2、KeepAlived的安裝和配置
1、安裝
yum install keepalived
2、keepalived.conf配置文件配置
global_defs {
notification_mail {
## 指定keepalived在發生切換時需要發送的郵箱
}
notification_mail_from xxx@xxx.com #發件人
#smtp_server xxx.smtp.com
#smtp_connect_timeout 30
router_id LVS_MAIN #運行keepalived機器的一個標識
}
vrrp_instance_VI_1 {
state MASTER # 標識為主為master,備為backup
interface ens33 #設置實例綁定的網卡
virtual_router_id 51 # 同一個實例下的virtual_router_id必須相同
priority 100 # master的權重必須大於backup
advert_int 1 # master與backup負載均衡器之間同步檢測的時間間隔,單位秒
authentication { #設置認證
auth_type PASS
auth_pass 123
}
virtual_ipaddress { #設置vip
192.168.3.111
192.168.3.112 #可以設置多個虛擬IP
}
}
3、啟動 /etc/init.d/keepalived start
Session共享問題解決方案: 由於請求先通過Nginx代理服務器,再有nginx服務器分配請求到具體的應用服務器中間就會遇到Session共享問題:
1.ip_hash 根據ip分配請求的應用服務器
2.不使用session,換cookie就不會存在此問題,但是網站安全度降低
3.使用cookie和redis緩存(建議此方案,方便擴展,緩存中速度高效)【會在后面項目中講】
例如:生成一個uuid作為用戶信息的key存放在redis緩存中,再將uuid作為cookie的值寫會客戶端,cookie的key可以用固定值(常量)
4、jwt
5.放到MySQL數據庫中,不推薦(增加數據庫的io)
Nginx的HTTPS配置
一、HTTPS簡介
1.https簡介
HTTPS其實是有兩部分組成:HTTP + SSL / TLS,也就是在HTTP上又加了一層處理加密信息的模塊。服務端和客戶端的信息傳輸都會通過TLS進行加密,所以傳輸的數據都是加密后的數據
2.https協議原理
首先,客戶端與服務器建立連接,各自生成私鑰和公鑰,是不同的。服務器返給客戶端一個公鑰,然后客戶端拿着這個公鑰把要搜索的東西加密,稱之為密文,並連並自己的公鑰一起返回給服務器,服務器拿着自己的私鑰解密密文,然后把響應到的數據用客戶端的公鑰加密,返回給客戶端,客戶端拿着自己的私鑰解密密文,把數據呈現出來
二、開啟nginx的ssl模塊
1.the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:37
原因是nginx缺少http_ssl_module模塊,編譯安裝時帶上--with-http_ssl_module配置就可以了
2.如果已經安裝過nginx,想要添加模塊看下面
1)切換到nginx源碼包
cd /usr/local/src/nginx-1.11.3
2)查看ngixn原有的模塊
/usr/local/nginx/sbin/nginx -V
3)重新配置
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
4)重新編譯,不需要make install安裝。否則會覆蓋
make
5)備份原有已經安裝好的nginx
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
6)將剛剛編譯好的nginx覆蓋掉原來的nginx(ngixn必須停止)
cp ./objs/nginx /usr/local/nginx/sbin/
這時,會提示是否覆蓋,請輸入yes,直接回車默認不覆蓋
7)啟動nginx,查看nginx模塊,發現已經添加
/usr/local/nginx/sbin/nginx -V
三、證書和私鑰的生成
注意:一般生成的目錄,應該放在nginx/conf/ssl目錄
1.創建服務器證書密鑰文件 server.key:
openssl genrsa -des3 -out server.key 1024
輸入密碼,確認密碼,自己隨便定義,但是要記住,后面會用到。
2.創建服務器證書的申請文件 server.csr
openssl req -new -key server.key -out server.csr
輸出內容為:
Enter pass phrase for root.key: ← 輸入前面創建的密碼
Country Name (2 letter code) [AU]:CN ← 國家代號,中國輸入CN
State or Province Name (full name) [Some-State]:BeiJing ← 省的全名,拼音
Locality Name (eg, city) []:BeiJing ← 市的全名,拼音
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany Corp. ← 公司英文名
Organizational Unit Name (eg, section) []: ← 可以不輸入
Common Name (eg, YOUR name) []: ← 此時不輸入
Email Address []:admin@mycompany.com ← 電子郵箱,可隨意填
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []: ← 可以不輸入
An optional company name []: ← 可以不輸入
4.備份一份服務器密鑰文件
cp server.key server.key.org
5.去除文件口令
openssl rsa -in server.key.org -out server.key
6.生成證書文件server.crt
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
四、配置文件
proxyPort=443
redirectPort=443
server{
#比起默認的80 使用了443 默認 是ssl方式 多出default之后的ssl
listen 443 default ssl;
#default 可省略
#開啟 如果把ssl on;這行去掉,ssl寫在443端口后面。這樣http和https的鏈接都可以用
ssl on;
#證書(公鑰.發送到客戶端的)
ssl_certificate ssl/server.crt;
#私鑰,
ssl_certificate_key ssl/server.key;
#下面是綁定域名
server_name www.daj.com;
location / {
#禁止跳轉
proxy_redirect off;
#代理淘寶
proxy_pass https://www.gerry.com;
}
}
重啟Nginx
Nginx進程模型
一、進程模型
Nginx是經典的多進程模型。Nginx啟動后以daemon的方式在后台運行,后台進程包含一個master進程和多個worker進程,具體如下圖:
圖1 Nginx多進程模型
master進程主要用來管理worker進程,具體包括如下4個主要功能: (1)接收來自外界的信號。 (2)向各worker進程發送信號。 (3)監控woker進程的運行狀態。 (4)當woker進程退出后(異常情況下),會自動重新啟動新的woker進程。 woker進程主要用來處理網絡事件,各個woker進程之間是對等且相互獨立的,它們同等競爭來自客戶端的請求,一個請求只可能在一個woker進程中處理,woker進程個數一般設置為機器CPU核數。
二、進程控制
對Nginx進程的控制主要是通過master進程來做到的,主要有兩種方式: (1)手動發送信號 從圖1可以看出,master接收信號以管理眾woker進程,那么,可以通過kill向master進程發送信號,比如kill -HUP pid用以通知Nginx從容重啟。所謂從容重啟就是不中斷服務:master進程在接收到信號后,會先重新加載配置,然后再啟動新進程開始接收新請求,並向所有老進程發送信號告知不再接收新請求並在處理完所有未處理完的請求后自動退出。 (2)自動發送信號 可以通過帶命令行參數啟動新進程來發送信號給master進程,比如./nginx -s reload用以啟動一個新的Nginx進程,而新進程在解析到reload參數后會向master進程發送信號(新進程會幫我們把手動發送信號中的動作自動完成)。當然也可以這樣./nginx -s stop來停止Nginx。
三、網絡事件 Nginx采用異步非阻塞的方式來處理網絡事件
master進程先建好需要listen的socket后,然后再fork出多個woker進程,這樣每個work進程都可以去accept這個socket。當一個client連接到來時,所有accept的work進程都會受到通知,但只有一個進程可以accept成功,其它的則會accept失敗。Nginx提供了一把共享鎖accept_mutex來保證同一時刻只有一個work進程在accept連接,從而解決驚群問題。當一個worker進程accept這個連接后,就開始讀取請求,解析請求,處理請求,產生數據后,再返回給客戶端,最后才斷開連接,這樣一個完成的請求就結束了。
Nginx配置udp/tcp代理
1、安裝模塊
./configure --prefix=/usr/local/nginx --with-stream --with-http_stub_status_module
2、配置文件
#nginx.conf部分配置
# upd/tcp
stream {
upstream backend {
server 192.168.3.173:3306;
}
server {
listen 8686;
proxy_connect_timeout 8s;
proxy_timeout 24h; #代理超時
proxy_pass backend;
}
}
http {
}