Rewrite規則含義就是某個URL重寫成特定的URL(相似於Redirect),從某種意義上說爲了美觀或者對搜索引擎友好,提升收錄量及排名等。javascript
語法:php
rewrite | <regex> | <replacement> | [flag] |
關鍵字 | 正則 | 替代內容 | flag標記 |
Rewrite規則的flag標記主要有如下幾種:
1) last : 至關於Apache裏的(L)標記,表示完成rewrite;
2) break: 本條規則匹配完成後,終止匹配,再也不匹配後面的規則
3) redirect: 返回302臨時重定向,瀏覽器地址會顯示跳轉後的URL地址
4) permanent:返回301永久重定向,瀏覽器地址欄會顯示跳轉後的URL地址
last和break用來實現URL重寫,瀏覽器地址欄URL地址不變css
a) 例如用戶訪問www.dbspread.com,想直接跳轉到網站下面的某個頁面,www.dbspread.com/new.index.html如何來實現呢? 咱們可使用Nginx Rewrite 來實現這個需求,具體以下:在server中加入以下語句便可:html
server { listen 80; #監聽80端口 server_name www.dbspread.com; #域名 #rewrite規則 index index.jsp index.html index.htm; root /usr/local/nginx/html; #定義服務器的默認網站根目錄位置 #監聽完成之後經過斜杆(/)攔截請求轉發到後端的tomcat服務器 location / { #若是後端的服務器返回50二、50四、執行超時等錯誤,自動將請求轉發到upstream負載均衡池中的另外一臺服務器,實現故障轉移。 proxy_next_upstream http_502 http_504 error timeout invalid_header; proxy_set_header Host $host; #獲取客戶端的主機名存到變量Host裏面,從而讓tomcat取到客戶端機器的信息 proxy_set_header X-Real-IP $remote_addr; #獲取客戶端的主機名存到變量X-Real-IP裏面,從而讓tomcat取到客戶端機器的信息 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; rewrite ^/$ http://www.dbspread.com/new.index.html permanent; proxy_pass http://web1; #跳轉到對應的應用web1 } }
效果圖以下:java
rewrite ^/$ http://www.dbspread.com/new.index.html permanent; 對應以下語法: rewrite <regex> <replacement> [flag]; 關鍵字 正則 替代內容 flag標記
正則表達式說明:node
*表明前面0或更多個字符 +表明前面1或更多個字符 ?表明前面0或1個字符 ^表明字符串的開始位置 $表明字符串結束的位置 。爲通配符,表明任何字符
b)例如多個域名跳轉到同一個域名,nginx rewrite規則寫法以下:nginx
server { listen 80; #監聽80端口 server_name www.dbspread.com; #域名 #rewrite規則 index index.jsp index.html index.htm; root /usr/local/nginx/html; #定義服務器的默認網站根目錄位置 if ($host != 'www.dbspread.com' ){ rewrite ^/(.*)$ http://www.dbspread.com/$1 permanent; } }
格式:
rewrite <regex> <replacement> [flag];
關鍵字 正則 替代內容 flag標記
說明:
rewrite爲固定關鍵字,表示開始進行rewrite匹配規則、
regex部分是 ^/(.*) ,這是一個正則表達式,匹配完整的域名和後面的路徑地址
replacement部分是http://www.dbspread.com/$1,$1是取自regex部分( )裏的內容。匹配成功後跳轉到的URL。
flag部分 permanent表示永久301重定向標記,即跳轉到新的 http://www.dbspread.com/$1 地址上web
好比http://www.dbspread.com/download/av123.rmvb 這個視頻下載地址被其餘網站引用,好比在www.test.com的index.html引用download/av123.rmvb就叫盜鏈,咱們要禁止這種引用就叫作防盜鏈正則表達式
在nginx的nginx.conf的server裏面配置以下代碼redis
server { listen 80; server_name www.dbspread.com *.dbspread.com; location ~* \.(rmvb|jpg|png|swf|flv)$ { #rmvb|jpg|png|swf|flv表示對rmvb|jpg|png|swf|flv後綴的文件實行防盜鏈 valid_referers none blocked www.dbspread.com; #表示對www.dbspread.com此域名開通白名單,好比在www.test.com的index.html引用download/av123.rmvb,無效 root html/b; if ($invalid_referer) { #若是請求不是從www.dbspread.com白名單發出來的請求,直接重定向到403.html這個頁面或者返回403 #rewrite ^/ http://www.dbspread.com/403.html; return 403; } } }
Nginx動靜分離是讓動態網站裏的動態網頁根據必定規則把不變的資源和常常變的資源區分開來,動靜資源作好了拆分之後,咱們就能夠根據靜態資源的特色將其作緩存操做,這就是網站靜態化處理的核心思路。
1). WEB項目開發時要注意,將靜態資源儘可能放在一個static文件夾
2). 將static靜態資源文件夾放到Nginx能夠取到的位置
3). 頁面要創建全局變量路徑,方便修改路徑
4). 修改nginx.conf的location, 匹配靜態資源請求
body { margin: 10px 20px; text-align: center; font-family: Arial, sans-serif; background-color: red; }
<html> <head> <link rel="stylesheet" type="text/css" href="http://www.static.com/button.css" /> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="renderer" content="webkit"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> <title>test</title> </head> <body> 歡迎來到8080端口tomcat </body> </html>
server { listen 80; #監聽80端口 server_name www.dbspread.com; #域名 #rewrite規則 index index.jsp index.html index.htm; root /usr/local/nginx/html; #定義服務器的默認網站根目錄位置 #重定向 if ($host != 'www.dbspread.com' ){ rewrite ^/(.*)$ http://www.dbspread.com/$1 permanent; } #防盜鏈 location ~* \.(rmvb|jpg|png|swf|flv)$ { #rmvb|jpg|png|swf|flv表示對rmvb|jpg|png|swf|flv後綴的文件實行防盜鏈 valid_referers none blocked www.dbspread.com; #表示對www.dbspread.com此域名開通白名單,好比在www.test.com的index.html引用download/av123.rmvb,無效 root html/b; if ($invalid_referer) { #若是請求不是從www.dbspread.com白名單發出來的請求,直接重定向到403.html這個頁面或者返回403 #rewrite ^/ http://www.dbspread.com/403.html; return 403; } } #監聽完成之後經過斜杆(/)攔截請求轉發到後端的tomcat服務器 location / { #若是後端的服務器返回50二、50四、執行超時等錯誤,自動將請求轉發到upstream負載均衡池中的另外一臺服務器,實現故障轉移。 proxy_next_upstream http_502 http_504 error timeout invalid_header; proxy_set_header Host $host; #獲取客戶端的主機名存到變量Host裏面,從而讓tomcat取到客戶端機器的信息 proxy_set_header X-Real-IP $remote_addr; #獲取客戶端的主機名存到變量X-Real-IP裏面,從而讓tomcat取到客戶端機器的信息 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #rewrite ^/$ http://www.dbspread.com/new.index.html permanent;#用戶訪問www.dbspread.com,想直接跳轉到網站下面的某個頁面:www.dbspread.com/new.index.html proxy_pass http://web1; #跳轉到對應的應用web1 } # location ~ .*\.(php|jsp|cgi|shtml)?$ #動態分離 ~匹配 以.*結尾(以PHP JSP結尾走這段) # { # proxy_set_header Host $host; # proxy_set_header X-Real-IP $remote_addr; # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # proxy_pass http://jvm_web2; # } #靜態分離 ~匹配 以.*結尾(以html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css結尾走這段),固然不是越久越好,若是有10000個用戶在線,都保存幾個月,系統託跨 location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ { root /var/local/static; #靜態資源存放在nginx的安裝機器上 #proxy_pass http://www.static.com; #靜態資源也可存放在遠程服務器上 expires 30d; #30天以內只要訪問過一次就從緩存拿 } #日誌級別有[debug|info|notice|warn|error|crit] error_log 級別分爲 debug, info, notice, warn, error, crit 默認爲crit, 生產環境用error #crit 記錄的日誌最少,而debug記錄的日誌最多 access_log /usr/local/logs/web2/access.log main; error_log /usr/local/logs/web2/error.log crit; }
Keepalived軟件起初是專爲LVS負載均衡軟件設計的,用來管理並監控LVS集羣系統中各個服務節點的狀態,後來又加入了能夠實現高可用的VRRP (Virtual Router Redundancy Protocol ,虛擬路由器冗餘協議)功能。所以,Keepalived除了可以管理LVS軟件外,還能夠做爲其餘服務(例如:Nginx、Haproxy、MySQL等)的高可用解決方案軟件
管理LVS負載均衡軟件
實現LVS集羣節點的健康檢查
做爲系統網絡服務的高可用性(failover)
Keepalived高可用服務之間的故障切換轉移,是經過 VRRP 來實現的。
在 Keepalived服務正常工做時,主 Master節點會不斷地向備節點發送(多播的方式)心跳消息,用以告訴備Backup節點本身還活着,當主 Master節點發生故障時,就沒法發送心跳消息,備節點也就所以沒法繼續檢測到來自主 Master節點的心跳了,因而調用自身的接管程序,接管主Master節點的 IP資源及服務。而當主 Master節點恢復時,備Backup節點又會釋放主節點故障時自身接管的IP資源及服務,恢復到原來的備用角色。
說明:keepalived的主從切換和redis的主從切換是不同的,keepalived的主節點掛了之後,從節點變爲主節點,以前的主節點恢復之後繼續作主節點。redis的主節點掛了之後,從新恢復之後變爲從節點
說明:
虛擬ip(VIP):192.168.152.200,對外提供服務的ip,也可稱做浮動ip
192.168.152.130:nginx + keepalived master 主
192.168.152.129:nginx + keepalived backup 從
192.168.152.129:tomcat-8080
192.168.152.129:tomcat-8081
環境準備:
centos六、jdk
虛擬ip(VIP):192.168.152.200,對外提供服務的ip,也可稱做浮動ip
192.168.152.130:nginx + keepalived master 主
192.168.152.129:nginx + keepalived backup 從
192.168.152.129:tomcat-8080
192.168.152.129:tomcat-8081
nginx和tomca的環境準備請查看個人前一篇關於nginx的文章
注:192.168.152.129(keepalived從節點) 與 192.168.152.130(keepalived主節點)先安裝好nginx + keepalived
下載壓縮包:
wget www.keepalived.org/software/keepalived-1.3.5.tar.gz
解壓縮:
tar -zxvf keepalived-1.3.5.tar.gz
進入解壓縮之後的文件目錄:
cd keepalived-1.3.5
編譯安裝:
./configure --prefix=/usr/local/keepalived
系統提示警告 *** WARNING - this build will not support IPVS with IPv6. Please install libnl/libnl-3 dev libraries to support IPv6 with IPVS.
yum -y install libnl libnl-devel
再次執行
./configure --prefix=/usr/local/keepalived
系統提示錯誤 configure: error: libnfnetlink headers missing
yum install -y libnfnetlink-devel
再次執行
./configure --prefix=/usr/local/keepalived
make && make install
到此keepalived安裝完成,可是接下來還有最關鍵的一步,若是這一步沒有作後面啓動keepalived的時候會報找不到配置文件的錯誤
Configuration file '/etc/keepalived/keepalived.conf' is not a regular non-executable file
安裝完成後,進入安裝目錄的etc目錄下,將keepalived相應的配置文件拷貝到系統相應的目錄當中。keepalived啓動時會從/etc/keepalived目錄下查找keepalived.conf配置文件
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived
#全局配置 global_defs { notification_email { leeSmall@qq.com #設置報警郵件地址,能夠設置多個,每行一個。須要開啓sendmail服務。 } notification_email_from sns-lvs@gmail.com smtp_server smtp.hysec.com #設置SMTP Server地址 smtp_connection_timeout 30 #設置SMTP Server的超時時間 router_id nginx_master #表示運行Keepalived服務器的一個標識,惟一的 } #檢測腳本 vrrp_script chk_http_port { script "/usr/local/src/check_nginx_pid.sh" #心跳執行的腳本,檢測nginx是否啓動 interval 2 #(檢測腳本執行的間隔,單位是秒) weight 2 #權重 } #vrrp 實例定義部分 vrrp_instance VI_1 { state MASTER # 指定keepalived的角色,MASTER爲主,BACKUP爲備 interface eth0 # 當前進行vrrp通信的網絡接口卡(當前centos的網卡) 用ifconfig查看你具體的網卡 virtual_router_id 66 # 虛擬路由編號,主從要一直 priority 100 # 優先級,數值越大,獲取處理請求的優先級越高 advert_int 1 # 檢查間隔,默認爲1s(vrrp組播週期秒數) #受權訪問 authentication { auth_type PASS #設置驗證類型和密碼,MASTER和BACKUP必須使用相同的密碼才能正常通訊 auth_pass 1111 } track_script { chk_http_port #(調用檢測腳本) } virtual_ipaddress { 192.168.152.200 # 定義虛擬ip(VIP),可多設,每行一個 } }
#全局配置 global_defs { notification_email { leeSmall@qq.com #設置報警郵件地址,能夠設置多個,每行一個。須要開啓sendmail服務。 } notification_email_from sns-lvs@gmail.com smtp_server smtp.hysec.com #設置SMTP Server地址 smtp_connection_timeout 30 #設置SMTP Server的超時時間 router_id nginx_backup # 設置nginx backup的id,在一個網絡應該是惟一的 } #檢測腳本 vrrp_script chk_http_port { script "/usr/local/src/check_nginx_pid.sh" #心跳執行的腳本,檢測nginx是否啓動 interval 2 #(檢測腳本執行的間隔) weight 2 #權重 } #vrrp 實例定義部分 vrrp_instance VI_1 { state BACKUP # 指定keepalived的角色,MASTER爲主,BACKUP爲備 interface eth0 # 當前進行vrrp通信的網絡接口卡(當前centos的網卡) 用ifconfig查看你具體的網卡 virtual_router_id 66 # 虛擬路由編號,主從要一直 priority 99 # 優先級,數值越大,獲取處理請求的優先級越高 advert_int 1 # 檢查間隔,默認爲1s(vrrp組播週期秒數) #受權訪問 authentication { auth_type PASS #設置驗證類型和密碼,MASTER和BACKUP必須使用相同的密碼才能正常通訊 auth_pass 1111 } track_script { chk_http_port #(調用檢測腳本) } virtual_ipaddress { 192.168.152.200 # 定義虛擬ip(VIP),可多設,每行一個 } }
/usr/local/src/check_nginx_pid.sh
#!/bin/bash #檢測nginx是否啓動了 A=`ps -C nginx --no-header |wc -l` if [ $A -eq 0 ];then #若是nginx沒有啓動就啓動nginx /usr/local/nginx/sbin/nginx #重啓nginx if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #nginx重啓失敗,則停掉keepalived服務,進行VIP轉移 killall keepalived fi fi
user root root; #使用什麼用戶啓動NGINX 在運行時使用哪一個用戶哪一個組 worker_processes 4; #啓動進程數,通常是1或8個,根據你的電腦CPU數,通常8個 worker_cpu_affinity 00000001 00000010 00000100 00001000; #CPU邏輯數——把每一個進程分別綁在CPU上面,爲每一個進程分配一個CPU #pid /usr/local/nginx/logs/nginx.pid worker_rlimit_nofile 102400; #一個進程打開的最大文件數目,與NGINX併發鏈接有關係 #工做模式及鏈接數上限 events { use epoll; #多路複用IO 基於LINUX2.6以上內核,能夠大大提升NGINX的性能 uname -a查看內核版本號 worker_connections 102400; #單個worker process最大鏈接數,其中NGINX最大鏈接數=鏈接數*進程數,通常1GB內存的機器上能夠打開的最大數大約是10萬左右 multi_accept on; #儘量多的接受請求,默認是關閉狀態 } #處理http請求的一個應用配置段 http { #引用mime.types,這個類型定義了不少,當web服務器收到靜態的資源文件請求時,依據請求文件的後綴名在服務器的MIME配置文件中找到對應的MIME #Type,根據MIMETYPE設置並response響應類型(Content-type) include mime.types; default_type application/octet-stream; #定義的數據流,有的時候默認類型能夠指定爲text,這跟咱們的網頁發佈仍是資源下載是有關係的 fastcgi_intercept_errors on; #表示接收fastcgi輸出的http 1.0 response code charset utf-8; server_names_hash_bucket_size 128; #保存服務器名字的hash表 #用來緩存請求頭信息的,容量4K,若是header頭信息請求超過了,nginx會直接返回400錯誤,先根據client_header_buffer_size配置的值分配一個buffer,若是##分配的buffer沒法容納request_line/request_header,那麼就會##再次根據large_client_header_buffers配置的參數分配large_buffer,若是large_buffer仍是無#法容納,那麼就會返回414(處理request_line)/400(處理request_header)錯誤。 client_header_buffer_size 4k; large_client_header_buffers 4 32k; client_max_body_size 300m; #容許客戶端請求的最大單文件字節數 上傳文件時根據需求設置這個參數 #指定NGINX是否調用這個函數來輸出文件,對於普通的文件咱們必須設置爲ON,若是NGINX專門作爲一個下載端的話能夠關掉,好處是下降磁盤與網絡的IO處理數及#系統的UPTIME sendfile on; #autoindex on;開啓目錄列表訪問,適合下載服務器 tcp_nopush on; #防止網絡阻塞 #很是重要,根據實際狀況設置值,超時時間,客戶端到服務端的鏈接持續有效時間,60秒內可避免從新創建鏈接,時間也不能設太長,太長的話,若請求數10000##,都佔用鏈接會把服務託死 keepalive_timeout 60; tcp_nodelay on; #提升數據的實時響應性 client_body_buffer_size 512k; #緩衝區代理緩衝用戶端請求的最大字節數(請求多) proxy_connect_timeout 5; #nginx跟後端服務器鏈接超時時間(代理鏈接超時) proxy_read_timeout 60; #鏈接成功後,後端服務器響應時間(代理接收超時) proxy_send_timeout 5; #後端服務器數據回傳時間(代理髮送超時) proxy_buffer_size 16k; #設置代理服務器(nginx)保存用戶頭信息的緩衝區大小 proxy_buffers 4 64k; #proxy_buffers緩衝區,網頁平均在32k如下的話,這樣設置 proxy_busy_buffers_size 128k; #高負荷下緩衝大小 proxy_temp_file_write_size 128k; #設定緩存文件夾大小,大於這個值,將從upstream服務器傳 gzip on; #NGINX能夠壓縮靜態資源,好比個人靜態資源有10M,壓縮後只有2M,那麼瀏覽器下載的就少了 gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; #壓縮級別大小,最小1,最大9.值越小,壓縮後比例越小,CPU處理更快,爲1時,原10M壓縮完後8M,但設爲9時,壓縮完可能只有2M了。通常設置爲2 gzip_types text/plain application/x-javascript text/css application/xml; #壓縮類型:text,js css xml 都會被壓縮 gzip_vary on; #做用是在http響應中增長一行目的是改變反向代理服務器的緩存策略 #日誌格式 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' #ip 遠程用戶 當地時間 請求URL '$status $body_bytes_sent "$http_referer" ' #狀態 發送的大小 響應的頭 '"$http_user_agent" $request_time'; #客戶端使用的瀏覽器 頁面響應的時間 #動態轉發 upstream web1 { #每一個請求按訪問ip的hash結果分配,這樣每一個訪客固定訪問一個後端服務器,能夠解決session的問題。配置了ip_hash就沒有負載均衡的效果了,每次訪問的都是同一個tomcat #ip_hash; #轉發的後端的tomcat服務器,weight表示轉發的權重,越大轉發的次數越多,機器性能不同配置的weight值不同 server 192.168.152.129:8080 weight=1 max_fails=2 fail_timeout=30s; server 192.168.152.129:8081 weight=1 max_fails=2 fail_timeout=30s; } upstream web2 { server 192.168.152.129:8090 weight=1 max_fails=2 fail_timeout=30s; server 192.168.152.129:8091 weight=1 max_fails=2 fail_timeout=30s; } server { listen 80; #監聽80端口 server_name www.dbspread.com; #域名 #rewrite規則 index index.jsp index.html index.htm; root /usr/local/nginx/html; #定義服務器的默認網站根目錄位置 #重定向 if ($host != 'www.dbspread.com' ){ rewrite ^/(.*)$ http://www.dbspread.com/$1 permanent; } #防盜鏈 location ~* \.(rmvb|jpg|png|swf|flv)$ { #rmvb|jpg|png|swf|flv表示對rmvb|jpg|png|swf|flv後綴的文件實行防盜鏈 valid_referers none blocked www.dbspread.com; #表示對www.dbspread.com此域名開通白名單,好比在www.test.com的index.html引用download/av123.rmvb,無效 root html/b; if ($invalid_referer) { #若是請求不是從www.dbspread.com白名單發出來的請求,直接重定向到403.html這個頁面或者返回403 #rewrite ^/ http://www.dbspread.com/403.html; return 403; } } #監聽完成之後經過斜杆(/)攔截請求轉發到後端的tomcat服務器 location / { #若是後端的服務器返回50二、50四、執行超時等錯誤,自動將請求轉發到upstream負載均衡池中的另外一臺服務器,實現故障轉移。 proxy_next_upstream http_502 http_504 error timeout invalid_header; proxy_set_header Host $host; #獲取客戶端的主機名存到變量Host裏面,從而讓tomcat取到客戶端機器的信息 proxy_set_header X-Real-IP $remote_addr; #獲取客戶端的主機名存到變量X-Real-IP裏面,從而讓tomcat取到客戶端機器的信息 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #rewrite ^/$ http://www.dbspread.com/new.index.html permanent;#用戶訪問www.dbspread.com,想直接跳轉到網站下面的某個頁面:www.dbspread.com/new.index.html proxy_pass http://web1; #跳轉到對應的應用web1 } # location ~ .*\.(php|jsp|cgi|shtml)?$ #動態分離 ~匹配 以.*結尾(以PHP JSP結尾走這段) # { # proxy_set_header Host $host; # proxy_set_header X-Real-IP $remote_addr; # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # proxy_pass http://jvm_web2; # } #靜態分離 ~匹配 以.*結尾(以html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css結尾走這段),固然不是越久越好,若是有10000個用戶在線,都保存幾個月,系統託跨 location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ { root /var/local/static; #靜態資源存放在nginx的安裝機器上 #proxy_pass http://www.static.com; #靜態資源也可存放在遠程服務器上 expires 30d; } #日誌級別有[debug|info|notice|warn|error|crit] error_log 級別分爲 debug, info, notice, warn, error, crit 默認爲crit, 生產環境用error #crit 記錄的日誌最少,而debug記錄的日誌最多 access_log /usr/local/logs/web2/access.log main; error_log /usr/local/logs/web2/error.log crit; } }
到這一步環境準備已完成,相關的配置也修改完成,下面咱們來查看效果
192.168.152.129 www.dbspread.com
192.168.152.130 www.dbspread.com
注意:這裏必定要配置域名www.dbspread.com映射到129和130兩個虛擬機的ip,由於nginx.conf裏面配置了rewrite重定向,若是不配置就看不到效果
到這一步環境準備已完成,相關的配置也修改完成,下面咱們來查看效果
啓動命令:/usr/local/keepalived/sbin/keepalived
能夠看到keepalived和nginx都啓動了
在瀏覽器輸入www.dpspread.com域名訪問
能夠看到從節點變爲主節點了
在瀏覽器輸入地址www.dpspread.com訪問,能夠看到訪問正常
能夠看到主節點從新啓動之後變爲主節點了
以前變爲主節點的從節點又變回從節點了