Nginx是一個開源的,支持高性能,高併發的www服務和代理服務軟件,因具備高併發(特別是靜態資源),佔用系統資源少等特性,且功能豐富而逐漸流行起來。功能應用上,Nginx不可是一個優秀的web服務器軟件,還具備反向代理負載均衡功能和緩存服務功能。在反向代理負載均衡功能方面,它相似大名鼎鼎的LVS負載均衡及Haproxy等專業代理軟件,並且Ngxin部署起來更爲簡單,方便;在緩存服務功能方面,它又相似於squid等專業的緩存服務器軟件php
1. 做爲web服務軟件html
Nginx是一個支持高性能,高併發的web服務軟件,它具備不少優秀的特性,做爲web服務器,與apache相比,Nginx能支持更多的併發連接訪問,但佔用的資源卻更少,效率更高,在功能上也強大了不少,不遜色與apache。前端
2. 反向代理或負載均衡服務mysql
在反向代理或負載均衡服務方面,Nginx能夠做爲web服務,php等動態服務及Memcached緩存的代理服務器,它具備相似專業反向代理軟件(如Haproxy)的功能,同時也是一個優秀的郵件代理服務軟件(最先開發增額產品的目的之一就是做爲郵件代理服務),可是Nginx的代理功能仍是相對簡單了些,特別是不支持TCP的代理,不過新版本的nginx1.9.0以後的版本,已經開始慢慢支持TCP代理了。nginx
反向代理 外網用戶 -- 經過反向代理proxy -- 訪問咱們內網的web 代理去請求 正向代理 內網用戶 -- 經過正向代理 -- 訪問外網web 通常是瀏覽器
3. 前端業務數據緩存服務web
在Web緩存服務方面,Nginx可經過自身的proxy_cache模塊實現類Squid等專業緩存軟件的功能正則表達式
Nginx安裝簡單,配置文件簡潔,並且配置靈活sql
Nginx做爲Web服務器的主要的應用場景包括數據庫
1. 使用Nginx運行HTML,JS,CSS,小圖片等靜態數據(此功能相似Lighttpd軟件)apache
2. Nginx結合FastCGI運行PHP等動態程序(例如使用fastcgi_pass方式)
3. Nginx結合Tomcat/Resin等支持Java動態程序(經常使用proxy_pass方式)
nginx採用epoll模型(內核2.6以上)和kququ(freebsd)異步網絡i/o模型,而apache則使用傳統的select模型
epoll,我把花送到了就好,也無論你拿不拿
select,我把花送到了,我要確認是你拿早了,這件事才結束
1. 靜態業務:高併發場景,儘可能採用nginx或lighttpd,兩者首選nginx
2. 動態業務:理論上採用nginx和apache均可,建議選擇nginx,爲了不相同的業務的服務軟件多樣化,增長額外維護成本。動態業務能夠由nginx兼作前端代理,再根據頁面元素的類型或目錄,轉發到後端相應的服務器進行處理。
3. 既有靜態業務又有動態業務:採用nginx
靜態網站特色: 1. 靜態網站是最初的建站方式,瀏覽者所看到的每一個頁面是建站者上傳到服務器上的一個 html ( htm )文件,這種網站每增長、刪除、修改一個頁面,都必須從新對服務器的文件進行一次下載上傳。網頁內容一經發布到網站服務器上,不管是否有用戶訪問,每一個靜態網頁的內容都是保存在網站服務器上的,也就是說,靜態網頁是實實在在保存在服務器上的文件,每一個網頁都是一個獨立的文件; 2. 靜態網頁的內容相對穩定,所以容易被搜索引擎檢索; 3. 靜態網頁沒有數據庫的支持,在網站製做和維護方面工做量較大,所以當網站信息量很大時徹底依靠靜態網頁製做方式比較困難; 4. 靜態網頁的交互性較差,在功能方面有較大的限制。 那麼什麼是動態網站呢?所謂 「 動態 」 ,並非指網頁上簡單的 GIF 動態圖片或是 Flash 動畫,動態網站的概念如今尚未統一標準,但都具有如下幾個基本特徵: 1. 交互性:網頁會根據用戶的要求和選擇而動態地改變和響應,瀏覽器做爲客戶端,成爲一個動態交流的橋樑,動態網頁的交互性也是從此 Web 發展的潮流。 2. 自動更新:即無須手動更新 HTML 文檔,便會自動生成新頁面,能夠大大節省工做量。 3. 因時因人而變:即當不一樣時間、不一樣用戶訪問同一網址時會出現不一樣頁面。 動態網站在頁面裏嵌套了程序,這種網站對一些框架相同,更新較快的信息頁面進行內容與形式的分離,將信息內容以記錄的形式存入了網站的數據庫中,以便於網 站各處的調用。這樣,咱們看到的一個頁面,可能在服務器上不一一對應某個 html 的文件了,網頁框架裏套了不少數據庫裏的記錄中的內容。此外動態網頁是與靜態網頁相對應的,也就是說,網頁 URL 的後綴不是 .htm 、 .html 、 .shtml 、 .xml 等靜態網頁的常見形式,而是以 .asp 、 .jsp 、 .php 、 .perl 、 .cgi 等形式爲後綴。 這裏說的動態網頁,與網頁上的各類動畫、滾動字幕等視覺上的 「 動態效果 」 沒有直接關係,動態網頁也能夠是純文字內容的,也能夠是包含各類動畫的內容,這些只是網頁具體內容的表現形式,不管網頁是否具備動態效果,採用動態網站技術生成的網頁都稱爲動態網頁。 從網站瀏覽者的角度來看,不管是動態網頁仍是靜態網頁,均可以展現基本的文字和圖片信息,但從網站開發、管理、維護的角度來看就有很大的差異。網絡營銷教學網站將動態網頁的通常特色簡要概括以下 : (1) 動態網頁以數據庫技術爲基礎,能夠大大下降網站維護的工做量 ; (2) 採用動態網頁技術的網站能夠實現更多的功能,如用戶註冊、用戶登陸、在線調查、用戶管理、訂單管理等等 ; (3) 動態網頁實際上並非獨立存在於服務器上的網頁文件,只有當用戶請求時服務器才返回一個完整的網頁 ; (4) 動態網頁中的 「?」 對搜索引擎檢索存在必定的問題,搜索引擎通常不可能從一個網站的數據庫中訪問所有網頁,或者出於技術方面的考慮,搜索蜘蛛不去 抓取網址中 「?」 後面的內容,所以採用動態網頁的網站在進行搜索引擎推廣時須要作必定的技術處理才能適應搜索引擎的要求。 綜上所述,您應該會在這兩種建站方式中作選擇了吧?對於一個業務穩定,頁面變化頻率不大的公司來講,靜態網站是一個很好的選擇。由於不用開發後臺程序,報 價會便宜不少。對於一個公司規模比較大的公司來講,可能常常會有動態信息要發佈給瀏覽者,能夠考慮用動態網站的後臺來管理網站信息。 無論什麼樣的方式作的網站,不斷的更新網站是頗有必要的,不少企業網站訪問量很低,就是由於它好幾年一成不變。不斷更新網站對瀏覽者更有吸引力,也更受到搜索引擎的歡迎。 動態與靜態最根本的區別是在網頁在服務器端運行狀態不一樣。 下面是圖解: 靜態網頁服務器的運行狀態 動態網頁服務器運行狀態有如下幾各狀況: 1 沒有數據庫的狀況 2 有數據庫的狀況 3 有多個數據庫的狀況 4 服務器均衡 靜態客戶端解析 動態服務器解析
1,rpm -ivh page.rpm有依賴問題, 2,yum安裝自動解決rpm安裝的依賴問題,安裝更簡單化 優勢:簡單,易用,高效 缺點:不能定製 3,編譯安裝(C語言源碼-編譯二進制) .configure(配置),make(編譯),make install(安裝) 優勢:能夠定製,參數,路徑 缺點:複雜,效率低 中大型企業 1,定製化製做rpm包,搭建yum倉庫,把我定製的rpm包放到yum倉庫,運行yum安裝 優勢:結合了2和3的優勢 缺點:複雜
1. 安裝前提準備工做
安裝nginx前提 pcre庫 中文是perl兼容正則表達式 安裝pcre庫是爲了使nginx支持具有url重寫功能的rewrite模塊,這個模塊企業幾乎應用都必需要使用的 目錄規劃 軟件包通常放在本身的家目錄上,例如 /home/joker/service/tools 阿里yum源 http://mirrors.aliyun.com/repo/ http://mirrors.aliyun.com/repo/Centos-6.repo nginx官網,下載包 http://nginx.org/ nginx.org web軟件 三個月之前的穩定版本 mysql數據庫軟件 六個月之前 額外可安裝 centos7 沒有下面的2個,故而只安裝這2個版本庫,開發工具 yum groupinstall "Compatibility Libraries" "Development Tools" centos6 "Base" "Debugging Tools" 和上面的版本庫,開發工具
2. 安裝過程
yum install pcre pcre-devel -y yum install openssl openssl-devel -y 注意:通常安裝軟件-devel都是必須安裝的 useradd www -s /sbin/nologin -M cd /joker/ mkdir tools cd tools/ wget -q http://nginx.org/download/nginx-1.6.3.tar.gz cd nginx-1.6.3 ./configure --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --prefix=/application/nginx-1.6.3/ make make install cd /application/nginx-1.6.3/ ln -s /application/nginx-1.6.3/ /application/nginx /application/nginx/sbin/nginx -t # 檢 查語法 /application/nginx/sbin/nginx # 啓動 /application/nginx/sbin/nginx -V # 版本 /application/nginx/log/error.log # 錯誤日誌 netstat -ntlp # 查看啓動是否成功 訪問nginx地址ip的過程 瀏覽器輸入的ip地址,不會找localdns,根,受權dns都沒有這些過程 直接到請求服務器,三次握手,創建連接,發送報文,get方法,服務器默認監聽80端口,讀配置文件,按照你要的內容給你
nginx軟件之所爲強大,是由於它具備衆多的功能模塊
1. nginx核心功能模塊
nginx核心功能模塊負責nginx的全局應用,主要對應主配置文件的main區塊和events區塊區域
2. 標準的http功能模塊集合
這些標準的http功能模塊,雖然不是nginx軟件必須的,但都是很經常使用的,所以絕大部分默認狀況都會自動安裝到nginx軟件中
egrep -v "^$|#" conf/nginx.conf.default > conf/nginx.conf [root@Poppy conf]# cat nginx.conf 1 worker_processes 1; # 服務員,有幾個工做的,設置應該與服務器的cpu核同樣 2 events { # 事件區塊開始 3 worker_connections 1024; # 每一個worker最大支持的鏈接數,總的併發數就至關於worker*events 4 } # 事件區塊結束 5 http { # http區塊開始 6 include mime.types; # 包含的意思,媒體文件 7 default_type application/octet-stream; # 缺省,暫時不用管,默認的媒體類型 8 sendfile on; # 高效的傳輸模式 9 keepalive_timeout 65; # 連接超時時間 10 server { # 對應一個虛擬主機站點 11 listen 80; # 提供服務的端口 12 server_name www.joker.com; # 提供服務的域名主機 13 location / { # 沒有匹配到走默認的location 14 root html; # 站點的根目錄,至關於nginx的安裝目錄下的html目錄 15 index index.html index.htm; # 首頁,訪問默認展現的頁面,會按順序從左到右 16 } 17 error_page 500 502 503 504 /50x.html; # 若是錯誤了,狀態碼500,502等找50x.htm頁面,也便是匹配到下面的location 18 location = /50x.html { # location區塊開始,訪問50x.html 19 root html; # 指定站點目錄 20 } 21 } 22 } # http區塊結束 1 main區,還能夠包括error_log pid等全局匹配位置
2 - 4 events區 5,22 http區開始,結束
10 - 21 server區
12 -16 location區 我們改了server_name www.joker.com; /application/nginx/sbin/nginx -t /application/nginx/sbin/nginx -s reload 客戶端上hosts文件添加解析 訪問域名查看是否訪問正確
整個nginx配置文件的核心框架以下
[root@Poppy conf]# cat nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; server { listen 80; server_name www.joker.com; location / { root html/www; index index.html index.htm; } } }
本質就是一個server 標籤
1. 基於域名的虛擬主機
[root@Poppy conf]# cat nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name www.joker.com; location / { root html/www; index index.html index.htm; } } server { listen 80; server_name bbs.joker.com; location / { root html/bbs; index index.html index.htm; } } } 經過host解析成ip 和 端口 tcp創建連接 http 請求,根據請求頭處理,若是沒有請求頭就給第一個location 若是沒有找到index頁面就是403 若是加這句,就會在頁面顯示目錄下全部文件,而且可點擊就如下載,autoindex on
2. 基於端口的虛擬主機
[root@Poppy conf]# cat nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name www.joker.com; location / { root html/www; index index.html index.htm; } } server { listen 81; server_name www.joker.com; location / { root html/bbs; index index.html index.htm; } } }
3. 基於ip的虛擬主機
虛擬網卡標籤 ifconfig eth0:0 10.0.0.101/24 up/down 這是至關於給eth0網卡增長一個網卡標籤 ip addr add/del 10.10.10.2/24 dev eth0 label eth0:1 跟上面效果是同樣的 ifconfig 多出來 eth0:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.0.101 netmask 255.255.255.0 broadcast 10.0.0.255 ether 00:16:3e:10:d0:eb txqueuelen 1000 (Ethernet) eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.0.102 netmask 255.255.255.0 broadcast 0.0.0.0 ether 00:16:3e:10:d0:eb txqueuelen 1000 (Ethernet) [root@Poppy conf]# cat nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 10.0.0.101:80; server_name www.joker.com; location / { root html/www; index index.html index.htm; } } server { listen 10.0.0.102:80; server_name bbs.joker.com; location / { root html/bbs; index index.html index.htm; } } }
在conf目錄建立extra,經過include匹配extra下的conf文件 [root@Poppy conf]# cat nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; # 這裏可使用*代替,這樣你就不知道前後了 # include extra/*.conf include extra/www.conf; include extra/bbs.conf; } [root@Poppy conf]# cat extra/www.conf server { listen 80; server_name www.joker.com; location / { root html/www; index index.html index.htm; } } [root@Poppy conf]# cat extra/bbs.conf server { listen 80; server_name bbs.joker.com; location / { root html/bbs; index index.html index.htm; } }
[root@Poppy conf]# cat nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; # 這裏可使用*代替,這樣你就不知道前後了 # include extra/*.conf include extra/www.conf; include extra/bbs.conf; } [root@Poppy conf]# cat extra/www.conf server { listen 80; server_name www.joker.com joker.com; location / { root html/www; index index.html index.htm; } } 訪問joker.com與www.joker.com效果同樣 能夠經過別名來監控url是否正常
nginx功能模塊中有一個http_stub_status_module模塊,這個模塊主要功能是記錄nginx基本訪問狀態信息,讓使用者瞭解 nginx的工做狀態,例如:鏈接數等信息,在咱們編譯安裝的時候須要安裝此模塊,可經過../nginx -V 查看是否編譯安裝了此模塊 [root@Poppy conf]# cat nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; include extra/*.conf; } [root@Poppy conf]# cat extra/status.conf server{ listen 80; server_name status.joker.com; location / { stub_status on; # 狀態打開 access_log off; # 不寫日誌 allow 10.0.0.0/24; # 容許和禁止的ip段訪問 deny all; } } 併發定義:單位時間內服務器正在處理的鏈接數 [root@joker ~]# curl status.joker.com Active connections: 1 # 正在處理的活動連接數,併發鏈接數,主要關注這項 server accepts handled requests # server段 啓動到如今一共處理的連接 74個 74 74 74 # accepts段 啓動到如今成功建立多少次握手,與server段同樣的話,就是沒有失敗的訪問 # handled requests段 已經處理完畢的請求數 Reading: 0 Writing: 1 Waiting: 0 # Reading: 0 段,nginx讀取客戶端header的信息數量 # Writing: 1段,nginx返回給客戶端header的信息數量 # Waiting: 0段,已經處理完,正在等候下一次請求指令的連接
1. nginx錯誤日誌
配置記錄nginx的錯誤信息是調試nginx服務的重要手段,屬於核心功能模塊(ngx_core_module)的參數,該參數名字爲error_log,能夠放在Main區塊中全局配置,也能夠放置不一樣的虛擬主機中單獨記錄
爲nginx增長錯誤日誌(error_log)配置 可存放在 main(針對全部標籤) server(針對域名) location字段裏面,logs的位置是nginx安裝目錄下的logs目錄 [root@Poppy nginx]# cat conf/nginx.conf worker_processes 1; events { worker_connections 1024; } # 關鍵字,日誌文件,錯誤日誌級別 error_log logs/error.log error; http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; include extra/*.conf; } [root@Poppy nginx]# cat conf/extra/www.conf server { listen 80; server_name www.joker.com joker.com; # 關鍵字,日誌文件,錯誤日誌級別 # error_log logs/error.log error; location / { root html/www; index index.html index.htm; # 關鍵字,日誌文件,錯誤日誌級別 # error_log logs/error.log error; } } 錯誤日誌級別有,debug|info|notice|warn|error|crit|alert|emerg 默認就是error級別,不要設置info等較低級別,會帶來巨大i/o消耗
2. nginx訪問日誌(access_log)
nginx軟件會把每一個用戶訪問網站的日誌的日誌信息記錄到指定的日誌文件裏,供網站提供者分析用戶的瀏覽行爲等,此功能由ngx_http_log_module模塊負責
nginx記錄日誌的默認參數配置以下 [root@Poppy nginx]# cat conf/nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; # 日誌變量說明,即便不加,默認也是這個配置 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # 訪問日誌,main就是讀http裏面的main日誌變量,還能夠多定義main,自定義格式 access_log logs/www_access.log main;
# 規範配置文件 include extra/*.conf; } [root@Poppy nginx]# cat conf/extra/www.conf server { listen 80; server_name www.joker.com joker.com; # 關鍵字,日誌文件,錯誤日誌級別 # error_log logs/error.log error; location / { root html/www; index index.html index.htm; # 關鍵字,日誌文件,錯誤日誌級別 # error_log logs/error.log error; # 訪問日誌,main會,main就是讀http裏面的main日誌變量 # access_log logs/www_access.log main; } } 能夠在日誌參數中加上buffer和flush選項,這樣作會在高併發場景下提高網站訪問性能 buffer緩存區,flush是過多少時間將緩存區的內容壓寫到硬盤 access_log logs/www_access.log main gzip buffer=32k flush=5s; 客戶端訪問 [root@joker ~]# curl www.joker.com www 服務器查看 [root@Poppy nginx]# cat logs/www_access.log 10.0.0. 1 - - [08/Jun/2018:10:32:22 +0800] "GET / HTTP/1.1" 200 4 "-" "curl/7.29.0" "-" "$http_referer" 能夠經過a標籤來測試 和上面main對應的變量,查看下面的圖片參考
$request_body 記錄請求體
log_format escape=json
3. nginx輪詢切割
默認狀況nginx會把全部的訪問日誌生成到一個指定的訪問日誌文件access.log裏,但這樣一來,時間長了就會致使日誌個頭很大,不利於日誌的分析和處理,所以,有必要對nginx日誌,按天和按小時進行切割,使其分紅不一樣的文件保存
[root@Poppy joker]# crontab -l 00 00 * * * /bin/sh /joker/scripts/cut_nginx_log.sh > /dev/null 2>&1 [root@Poppy scripts]# cat cut_nginx_log.sh #!bin/bash # mv佔i/o資源少,-s reload,不會對用戶影響,會從新生成空的www_access.log cd /application/nginx/logs /bin/mv www_access.log www_access_$(date +%F -d '-1 day').log /application/nginx/sbin/nginx -s reload ## rsync 是否須要推送到備份服務器 ## finde del,是否須要查找多天前的刪除
location指令的做用是根據用戶請求的URL來執行不一樣的應用,其實就是根據用戶請求的網站地址URL進行匹配,匹配成功即進行相關的操做,語法格式以下
location [=|~|~*|^~|@] uri {..}
指令 匹配標識 匹配的網站地址 匹配uri後執行的配置段
[=|~|~*|^~|@] =:精確匹配 ~:區分大小 ~*:不區分大小 !:取反 ^~:不作正則匹配,匹配字符串 @:內部調用,不經常使用
1. location簡單匹配事例
好比客戶端訪問 http://www.joker.com/joker/ location匹配到了joker,就會執行下面 location /joker/ { # joker表明的就是uri do something } 若是上面沒有匹配到,就會執行下面,這是默認的 location / { do something }
2. 匹配順序
第一次訪問
[root@Poppy conf]# cat nginx.conf worker_processes 1; events { worker_connections 1024; } # 關鍵字,日誌文件,錯誤日誌級別 error_log logs/error.log error; http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # 訪問日誌,main就是讀http裏面的main日誌變量 access_log logs/www_access.log main; include extra/*.conf; } [root@Poppy conf]# cat extra/www.conf server { listen 80; server_name www.joker.com joker.com; location / { return 401; } location = / { return 402; } location /documents/ { return 403; } location ^~/images/ { return 404; } location ~* \.(gif|jpg|jpeg)$ { return 500; } access_log logs/www_access.log main; } 客戶端訪問 [root@joker ~]# curl -s -o /dev/null -w "%{http_code}\n" www.joker.com 402 =精確匹配,不管放置的順序如何都將優先被匹配並執行
第二次訪問,咱們把精確匹配=去除 [root@Poppy conf]# cat extra/www.conf server { listen 80; server_name www.joker.com joker.com; location / { return 401; } location /documents/ { return 403; } location ^~/images/ { return 404; } location ~* \.(gif|jpg|jpeg)$ { return 500; } access_log logs/www_access.log main; } 客戶端訪問 [root@joker ~]# curl -s -o /dev/null -w "%{http_code}\n" www.joker.com 401 /爲默認的匹配,即若是沒有匹配上其餘的location,則最後匹配「默認匹配」的部分
第三次訪問,路徑匹配 客戶端訪問 [root@joker ~]# curl -s -o /dev/null -w "%{http_code}\n" www.joker.com/documents/ 403 [root@joker ~]# curl -s -o /dev/null -w "%{http_code}\n" www.joker.com/documents/document.html 403 此部分爲路徑匹配,即匹配了路徑/documents/
路徑匹配須要目錄上有這個路徑 [root@Poppy www]# cat ../../conf/extra/www.conf server { listen 80; server_name www.joker.com joker.com; location /documents/ { root html/www; index index.html; } access_log logs/www_access.log main; } 就須要 html目錄下有www目錄,www目錄下有documents目錄,裏面有index.html 沒有找到目錄報404錯誤,沒有html文件報403錯誤
第四次訪問,擴展名匹配
[root@joker ~]# curl -s -o /dev/null -w "%{http_code}\n" www.joker.com/documents/1.gif 500 此部分爲擴展名匹配,注意後面的/documents/1.jpg,沒有匹配此處的/documents/1.jpg路徑,而是匹配告終尾的1.jpg 第五次訪問,特殊字符路徑匹配 客戶端訪問 [root@joker ~]# curl -s -o /dev/null -w "%{http_code}\n" www.joker.com/images/1.gif 404 此部分爲路徑匹配,可是前面增長了特殊字符^~,因此優先匹配路徑,而沒有匹配結尾的1.jpg
3. 匹配順序總結
location = / { # 精確匹配 精確匹配 location ^~/images/ # 匹配常規字符串,不作正則匹配 特殊路徑匹配 location ~* \.(gif|jpg|jpeg)$ # 正則匹配 擴展名匹配 location /documents/ # 匹配常規字符串,若是有正則則有限匹配正則 路徑匹配 location / { # 全部location都不能匹配後的默認匹配 默認匹配
nginx rewrite 的主要功能也是實現URL地址重寫,nginx的rewrite規則須要PCRE軟件的支持,即經過perl兼容正則表達式語法進行規則匹配
指令語法 rewrite regex replacement[flag] 應用位置: server,location,if rewrite是實現URL重寫的關鍵指令,根據regex(正則表達式)部份內容,重定向到replacement部份內容,結尾是flag標記 rewrite ^/(.*) http://blog.joker.com/$1 permanent 在上述指令中,rewrite爲固定關鍵字,表示開啓一條rewrite匹配規則,^/(.*)這是一個正則表達式,匹配全部,匹配成功後跳轉到 http://blog.joker.com/$1,這裏的$1是取前面regex部分()裏的內容,後項引用,即路徑匹配內容,結尾permanent,表示永久301重定向標記,即 跳轉到後面的http://blog.joker.com/$1地址上
1. rewrite簡單事例
[root@Poppy extra]# cat ../nginx.conf worker_processes 1; events { worker_connections 1024; } # 關鍵字,日誌文件,錯誤日誌級別 error_log logs/error.log error; http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # 訪問日誌,main就是讀http裏面的main日誌變量 # access_log logs/www_access.log main; include extra/*.conf; } [root@Poppy extra]# cat www.conf server { listen 80; server_name www.joker.com joker.com; location / { rewrite ^/(.*) http://blog.joker.com/$1 permanent; # 重寫語句 } access_log logs/www_access.log main; } 客戶端訪問 [root@joker ~]# curl www.joker.com <html> <head><title>301 Moved Permanently</title></head> <body bgcolor="white"> <center><h1>301 Moved Permanently</h1></center> <hr><center>nginx/1.6.3</center> </body> </html> [root@joker ~]# wget www.joker.com/index.html --2018-06-10 14:22:01-- http://www.joker.com/index.html Resolving www.joker.com (www.joker.com)... 60.205.188.107 Connecting to www.joker.com (www.joker.com)|60.205.188.107|:80... connected. HTTP request sent, awaiting response... 301 Moved Permanently #### 注意,從這裏開始跳轉重寫url地址下載頁面 Location: http://blog.joker.com/index.html [following] --2018-06-10 14:22:01-- http://blog.joker.com/index.html Resolving blog.joker.com (blog.joker.com)... 60.205.188.107 Reusing existing connection to www.joker.com:80. HTTP request sent, awaiting response... 200 OK Length: 5 [text/html] Saving to: ‘index.html’ 能夠和location的匹配順序來重寫地址 [root@Poppy extra]# cat ../nginx.conf worker_processes 1; events { worker_connections 1024; } # 關鍵字,日誌文件,錯誤日誌級別 error_log logs/error.log error; http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # 訪問日誌,main就是讀http裏面的main日誌變量 # access_log logs/www_access.log main; include extra/*.conf; } [root@Poppy conf]# cat extra/www.conf server { listen 80; server_name www.joker.com joker.com; location / { return 401; } location ^~/images/ { rewrite ^/(.*) http://blog.joker.com/$1 permanent; } access_log logs/www_access.log main; } 當訪問www.joker.com/images/...的時候301跳轉到blog.joker.com
2. regex經常使用正則表達式說明
3. rewrite指令結尾的flag標記說明
last 本條規則匹配完成後,繼續向下匹配新的location url規則 break 本條規則匹配完成即終止,再也不匹配後面的任何規則 redirect 返回302臨時重定向,瀏覽器地址欄會顯示跳轉後的url地址 permanent 返回301永久重定向,瀏覽器地址會顯示跳轉後的url地址 last和break用來實現url重寫,瀏覽器地址欄url地址不變,但在服務器端訪問的程序及路徑發生了變化。 redirect和permanent用來url跳轉,瀏覽器地址欄會顯示跳轉後的URL地址 nginx反向代理使用proxy_pass指令時要使用break標記
4. nginx rewrite的企業應用場景
舊域名到新域名,以前咱們是經過別名方式200,如今咱們經過重寫地址的方式301
[root@Poppy extra]# cat ../nginx.conf worker_processes 1; events { worker_connections 1024; } # 關鍵字,日誌文件,錯誤日誌級別 error_log logs/error.log error; http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # 訪問日誌,main就是讀http裏面的main日誌變量 # access_log logs/www_access.log main; include extra/*.conf; } [root@Poppy conf]# cat extra/www.conf server { listen 80; server_name qq.joker.com; location / { rewrite ^/(.*) http://www.joker.com/$1 permanent; } } server { listen 80; server_name www.joker.com; location / { root html/www; index index.html index.htm; } access_log logs/www_access.log main; } 跳轉的話就是看到新的域名,是301跳轉,就是得從新請求,原來一個併發,如今就是二個了 用別名200,效率高,,看不到改過的域名,就是當前域名 [root@Poppy conf]# cat extra/www.conf server { listen 80; server_name www.joker.com; location / { root html/www; index index.html index.htm; } rewrite ^(.*)/bbs/ http://bbs.joker.com/$1 break; } 若是訪問www.joker.com路徑裏面帶bbs就請求 http://bbs.joker.com/bbs/ 若是沒有,就請求默認的www.joker.com
爲網站設置訪問帳號和密碼權限,只有擁有帳號密碼的用戶才能夠訪問網站內容,這種使用帳號密碼才能夠訪問網站的功能主要應用在企業內部人員訪問的地址上,例如企業的網站後臺,mysql客戶端phpmyadmin,企業內容的crm,wiki等網站平臺
[root@Poppy extra]# cat www.conf server { listen 80; server_name www.joker.com; location / { auth_basic "info"; # 認證的消息 auth_basic_user_file conf/extra/htpasswd; # 認證文件位置,經過htpasswd建立 root html/www; index index.html index.htm; } access_log logs/www_access.log main; } 建立htpasswd認證文件 安裝htpassw命令 yum install httpd-tools [root@Poppy extra]# htpasswd -cb /application/nginx/conf/extra/htpasswd joker 123456 Adding password for user joker [root@Poppy extra]# cat htpasswd joker:$apr1$qhFfruO6$MbSlxwi.dOae5haOzuuiA1 -c 指定文件 -b 非交互式的輸入密碼 客戶端訪問須要401認證了 [root@joker ~]# curl www.joker.com <html> <head><title>401 Authorization Required</title></head> <body bgcolor="white"> <center><h1>401 Authorization Required</h1></center> <hr><center>nginx/1.6.3</center> </body> </html> 認證文件有可能會被其餘人看,因此咱們能夠chmod 400 /application/nginx/conf/extra/htpasswd 刪除歷史記錄等
404的緣由
沒有目錄
403的緣由
沒有index.html文件,沒有權限,沒有首頁配置
wget url下載文件 -q安靜的 -o指定輸出文件名,就是更改下載的文件名 curl -i webIP 查看響應頭 -s安靜的 不加參數與-s同樣返回網頁內容,能夠/dev/null -w "{http_code}" curl -s -o /dev/null -w "%{http_code}\n" www.joker.com http://qq.com http://jd.com lsof 命令用於查看你進程開打的文件,打開文件的進程 lsof -i :80 80端口使用狀況
能夠在阿里雲(沃通WoTrus SSL證書)申請ssl證書,而後保存下來,存放到ECS服務器上,注意nginx安裝了ssl模塊
############### server { listen 443; server_name localhost; ssl on; ssl_certificate sslkey/wosign.com.crt; #(證書公鑰) ssl_certificate_key sslkey/wosign.com.key; #(證書私鑰) ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } } ###### ######## server { listen 80; listen 443 ssl; server_name seven-i.herogames.cn; ssl_certificate /etc/nginx/ssl/ca.crt; ssl_certificate_key /etc/nginx/ssl/ca.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 10m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; access_log /var/log/nginx/seven-i.herogames.cn.access.log main; root /home/www/joker/seven_i; location / { rewrite ^/([^\.]*)$ /index.php?/$1; index index.html index.htm index.php; } location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /home/www/joker/seven_i$fastcgi_script_name; include /etc/nginx/fastcgi_params; } }