跨域問題
問題:瀏覽器拒絕執行其他域名下的 ajax 請求
由來:如果瀏覽器可以在某域名下訪問其他域名的內容 來填充自己的頁面,那麼互聯網秩序將混亂。爲了防止這種混亂,W3C 組織制定了瀏覽器安全規範,即 html 頁面發起的 ajax 請求僅 限於同域名後段範圍,跨域 域名的 ajax 請求不得執行,此謂之 跨域問題。
解決方法:
Jsonp
w3c 指定的規則不允許ajax跨域請求,但是允許 script 標籤發起跨域請求。
所以,可以通過 擴展 script標籤 src 源的方法 來跨域,這就是 Jsnop 解決方法。
不足:
- jsonp 只能解決Get類的請求
- 使用此方法,對應的後臺程序必須對結果進行改造。將返回值做一個函數式包裝。這對業務有較大侵入性,增加開發人員負擔。
cors 方案
如果B公司同意將自己的內容分享給A公司,跨域限制可以放開,此即 CORS 解決方案
nginx 配置跨域操作
- 對於比較簡單的http請求(GET,POST,HEAD類型),無需瀏覽器來問,nginx 服務器直接在響應頭部,加入同意跨域的信號即可。
add_header Access-Control-Allow-Origin http://xxx.xxx.com;
防盜鏈
目標:讓資源只能在自己的頁面顯示,不能被其他頁面引用
解決辦法:
瀏覽器發起的任何請求,在請求頭中,都會標註請求發起的URL,如下:
Refer: http://xxx.xxx.xxx.com
因此,在nginx 服務器上,只要校驗此發起地 URL,就可以對應的拒絕響應它
location /mall {
valid_referers *.test.com;
if ($invalid_referer) {
return 404;
}
root /etc/nginx/html/gzip;
}
壓縮
我們都知道,服務器的帶寬資源很昂貴,對於一些靜態資源,如果能壓縮一下再傳輸,通常可以減少50%的體積。
瀏覽器在發送請求時,會附帶自己支持的壓縮方式,在請求頭中:
Accept-Encoding:gzip,deflate
在nginx 服務器中,配置:
location ~ /(.*)\.(html|js|css|jsg|jpeg|png|gig)$ {
gzip on; #啓用gzip 壓縮,默認是off,不啓用
# 對js,css,jpg,png,gif格式對文件啓用gzip 壓縮功能
gzip_type application/javascript text/css image/jpeg image/png image/gif;
gzip_min_length 1024; # 所壓縮文件對最小值,小於這個之不會壓縮
gzip_buffer 4 1k; # 設置壓縮響應塊的個數和大小,默認是內存一個頁的大小
gzip_comp_level 1; # 壓縮水平,默認1.取值範圍1-9,取值越大壓縮比率越大,單耗cpu時間
root /html/gzip;
}
https
採用加密方式:非對稱加密 和 對稱加密
對稱加密
服務器和客戶端的加密密鑰是相同的。加密效率高於非對稱加密
存在問題:密鑰傳輸的過程,泄露風險較大
非對稱加密
加密安全。服務器和客戶端是兩個不同的密鑰。
問題:非對稱加密算法開銷大,大批量應用於業務,會導致性能成本太高
https 加密方案
1、業務數據的加密使用對稱加密,降低性能消耗
2、對稱加密需要的密鑰,通過非對稱加密的方式 傳輸
具體步驟:
1、客戶端和服務器建立連接
2、服務器下發證書到客戶端,證書中保護非對稱加密的公鑰
3、客戶端生成對稱加密所需要的加密密鑰
4、客戶端使用證書中的公鑰加密 對稱加密密鑰,生成密文
5、客戶端將密鑰發送給服務器
6、服務器使用私鑰解密祕聞,得到對稱加密所需密鑰
7、客戶端使用密鑰加密要傳輸的內容,發送服務器
8、服務器使用密鑰解密密文,得到傳輸的內容
nginx 配置 https
查看nginx 安裝了https 模塊 (openresty 默認開啓 https 模塊的):nginx -V
nginx 配置 https 只需要兩個東西:
- 瀏覽器證書(內含公鑰,供瀏覽器加密使用)
- 私鑰
server.crt 和 server.key 可以自己去購買商業的。也可以使用自己生成的(瀏覽器會任務是不安全證書)。
自簽證書
前提是已經安裝了 openssl 程序,自簽證書過程:
生成私鑰:openssl genrsa -des3 -out server.key 4096 需要輸入密碼
生成csr: openssl req -new -key server.key -out server.csr
去除私鑰口令 cp server.key server.key.org
openssl rsa -in server.key.org -out server.key 需要輸入密碼
生成證書: openssl x509 -req -day 365 -in server.csr -signkey server.key -out server.crt
nginx 配置:
server {
listen 443 ssl;
server_name xxx.com;
ssl_certificate /etc/nginx/server.crt; #供瀏覽器下載證書
ssl_certificate_key /etc/nginx/server.key; #自己解密用的私鑰
location / {
root /etc/nginx/html;
index index.html index.htm;
}
}
nginx 的高可用
傳統的高可用思路:
tomcat的高可用,在tomcat 的集羣前面加一層 負載服務 nginx。
這樣可以解決tomcat的高可用問題。但是引起了 負載服務 nginx 的高可用問題。如果前面的 nginx 服務掛掉,服務就崩潰了。
如果nginx 也沿用此思路,總會有一個最前端的集羣是單機的,存在 宕機的風險。
lvs 思想解決高可用問題
使用服務器集羣虛擬出一個 虛擬網管,因爲是虛擬的,不存在的,所以不存在 宕機的問題。
此網關由兩臺機器 共同協商生成。當一臺機器宕機了,另一臺集羣一樣能維持這個網關。這保證了兩臺機器只要不同時宕機,
就能保證服務正常。
keepalived 配置lvs過程
前提:
1、關閉 selinux, 打開/etc/sysconfig/selinux, 設置 SELINUX=disabled
2、安裝必須的依賴包
yum -y install libnl libnl-dev libnfnetlink-devel
3、keepalived 安裝
下載源碼包--不能使用 yum 方式安裝(有bug)
wget https://www.keepalived.org/software/keepalived-1.3.4.tar.gz
配置(指定安裝目錄和配置文件)
./configure --prefix=/usr/local/keepalived --sysconf=/etc
make && make install
keepalived 主機配置
打開/etc/keepalived/keepalived.conf, 配置如下內容:
啓動keepalived, 查看機器ip,可以發現多了一個 244.200 的ip。使用原ip地址和新生成的ip地址都可以訪問服務。
keepalived 從機配置
配置過程與主機過程一致,只需要修改 標識id 和 優先級即可。
注意:優先級要小於主機配置的優先級,並且組名要保持一致。
啓動從機,發現ip並無變化。
keepalived 校驗LVS效果
- 殺死主機的keepalived,244.200的ip從主機消失,出現在從機ip中
- 再次啓動主機的keepalived,244.200 的ip被主機重新奪回
注意:此效果是單主單備方式。備機資源有一定的浪費。可以重複前面的動作,虛擬出第二個ip,將主從機優先級顛倒,從而利用起備機服務。
keepalived 監控服務軟件
使用keepalived 我們實現了LVS功能,即集羣間共同虛擬一個 vip(virtual ip),並實現了在集羣中的自動漂移。
如果物理機器狀況良好,並不能保障 其上允許的軟件服務 ok,因爲需要使用 keepalived 來監控服務。
1、使用 keepalived 來監控 nginx
編寫shell 腳本:
#! /bin/bash
# 統計nginx 進程是否存在
A=`ps -C nginx --no-header|wc -l`
# 爲0 表示nginx 停止來
if [$A -eq 0];then
# 嘗試重啓nginx
/usr/local/nginx/sbin/nginx
# nginx 重啓失敗,則keepalived自殺,進行vip轉移
if [`ps -C nginx --no-header|wc -l` -eq 0]; then
# 殺死keepalived,vip轉移到另一臺機器
killall keepalived
fi
fi
2、在配置文件中加入配置信息
重啓keepalived, 測試效果,發現 nginx 已變成不死鳥