博文大綱:
1.Nginx簡介
2.Nginx的核心特色
3.Nginx平滑升級
4.修改Nginx版本信息
5.Nginx虛擬主機配置
6.nginx配置文件location選項的做用
7.配置https訪問nginx
8.開啓Nginx訪問認證css
Nginx是一款輕量級的網頁服務器、反向代理服務器以及電子郵件代理服務器。因它的穩定性、豐富的功能集、實例配置文件和低系統資源消耗而聞名。html
Nginx已經在俄羅斯最大的門戶網站上運行,同時俄羅斯有超過20%的虛擬主機平臺採用Nginx做爲反向代理服務器;在國內,Nginx已經運行在淘寶、新浪、網易等多家網站使用Nginx做爲Web服務器或反向代理服務器。前端
- (1)跨平臺:Nginx能夠在大多數OS編譯運行,並且也有Windows版本;
- (2)配置異常簡單、很是容易上手;
- (3)非阻塞、高併發鏈接;官方測試可以支撐5萬的併發鏈接,在實際環境中能夠達到2~3萬併發鏈接數。(這得益於Nginx使用了最新的epoll模型);
- (4)事件驅動:採用epoll模型,支持更大的併發鏈接;
非阻塞經過不斷檢查事件的狀態來判斷是否進行讀寫操做,這樣帶來的開銷很大,所以就有了異步非阻塞的事件處理機制。這種機制讓你能夠同時監控多個事件,調用他們是非阻塞的,但能夠設置超時時間,在超時時間以內,若是有事件準備好了,就返回。這種機制解決了上面阻塞調用與非阻塞調用的兩個問題。
以 epoll 模型爲例:當事件沒有準備好時,就放入 epoll(隊列)裏面。若是有事件準備好了,那麼就去處理;當事件沒有準備好時,纔在 epoll 裏面等待。這樣,咱們就能夠併發處理大量的併發請求了,固然,這裏的併發請求,是指未處理完的請求。線程只有一個,因此同時能處理的請求固然只有一個了,只是在請求之間進行不斷地切換而已,切換也是由於異步事件未準備好,而主動讓出的。這裏的切換是沒有任何代價,你能夠理解爲循環處理多個準備好的事件。
多線程方式相比,這種事件處理方式是有很大的優點的,不須要建立線程,每一個請求佔用的內存也不多,沒有上下文切換, 事件處理很是的輕量級,併發數再多也不會致使無謂的資源浪費(上下文切換)。對於 apache 服務器,每一個請求會獨佔一個工做線程,當併發數上到幾千時,就同時有幾千的線程在處理請求了。這對操做系統來講,是個不小的挑戰:由於線程帶來的內存佔用很是大,線程的上下文切換帶來的 cpu 開銷很大,天然性能就上不去,從而致使在高併發場景下性能降低嚴重。
總結:經過異步非阻塞的事件處理機制,Nginx 實現由進程循環處理多個準備好的事件,從而實現高併發和輕量級。- (5)Master/Worker 結構:一個 master 進程,生成一個或多個worker 進程,如圖:
Master-Worker設計模式主要包含兩個主要組件Master和Work,Master維護者Worker隊列,將請求下發到多個Worker並行執行,Worker主要進行實際邏輯計算,並將結果返回給Master。
採用獨立的進程,可讓互相之間不會影響,一個進程退出後,其餘進程還在工做,服務不會中斷,Master進程則很快從新啓動新的Worker進程。固然,Worker進程的異常退出,確定是程序中有bug了,異常退出,會致使當前Worker上的全部請求失敗,不過不會影響到全部的請求,因此下降了風險;- (6)內存消耗小:處理高併發的請求內存消耗很是小。在3萬併發鏈接下,開啓的10個Nginx進程才消耗150M內存;
- (7)內置的健康檢查工做:若是Nginx代理的後端某臺Web服務器宕機了,不會影響前端的訪問;
- (8)節省帶寬:支持GZIP壓縮,能夠添加到瀏覽器本地緩存的Header頭;
- (9)穩定性高:用於反向代理,宕機的機率微乎其微;
本篇博文中所需使用的軟件包都已經打包了,能夠直接下載Nginx軟件包nginx
所謂Nginx平滑升級就是當前服務器正在運行Nginx服務,想將當前運行的Nginx服務的版本進行升級,且在服務不中止的前提進行升級。web
實現思路:正則表達式
- 在不中止老進程的狀況下,啓動新進程;
- 老進程負責處理仍然沒有處理完成的請求,但再也不接收處理請求;
- 新進程接收新請求;
- 老進程處理完全部請求,關閉全部鏈接後,中止;
實現步驟:apache
[root@localhost ~]# yum -y install pcre-devel openssl-devel //安裝nginx所需依賴 [root@localhost ~]# tar zxf nginx-1.14.0.tar.gz -C /usr/src [root@localhost ~]# cd /usr/src/nginx-1.14.0/ [root@localhost nginx-1.14.0]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module && make && make install //編譯安裝nginx1.14版本,因爲實驗環境,配置項較少 [root@localhost ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin //建立符號連接 [root@localhost ~]# nginx //啓動nginx服務 [root@localhost ~]# nginx -v //查看Nginx服務的版本信息 nginx version: nginx/1.14.0 [root@localhost ~]# tar zxf nginx-1.2.4.tar.gz -C /usr/src [root@localhost ~]# cd /usr/src/nginx-1.2.4/ [root@localhost nginx-1.2.4]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module && make //配置、編譯nginx1.2.4版本,注意不要進行安裝,能夠根據須要添加配置項,可是本來的配置必須存在 [root@localhost ~]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old //備份舊版本的nginx的執行程序 [root@localhost ~]# cp /usr/src/nginx-1.2.4/objs/nginx /usr/local/nginx/sbin/ //替換舊的Nginx的執行程序 [root@localhost ~]# netstat -anpt | grep 80 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4655/nginx: master [root@localhost ~]# kill -USR2 4655 //建議針對nginx的進程號進行操做,不建議針對nginx的pid文件進行操做 //生成新的進程去接收客戶端請求,執行完成後nginx安裝目錄下logs目錄會出現一個nginx.pid.old文件,用來存放舊版的pid信息 [root@localhost ~]# nginx -s reload //從新加載新版的nginx配置 [root@localhost ~]# kill -HUP 4655 //平滑的重啓新版的nginx進程 [root@localhost ~]# nginx -v //查看nginx版本信息 nginx version: nginx/1.2.4 [root@localhost ~]# curl -I 127.0.0.1 HTTP/1.1 200 OK Server: nginx/1.14.0 //頭部信息版本還未更改 Date: Sun, 01 Dec 2019 06:04:10 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Sun, 01 Dec 2019 05:59:29 GMT Connection: keep-alive ETag: "5de356c1-264" Accept-Ranges: bytes [root@localhost ~]# kill -QUIT 4655 ////平滑的關閉舊版的nginx進程 [root@localhost ~]# nginx -v //查看nginx版本信息 nginx version: nginx/1.2.4 [root@localhost sbin]# curl -I 127.0.0.1 HTTP/1.1 200 OK Server: nginx/1.2.4 //注意版本信息,已經成功發生改變 Date: Sat, 30 Nov 2019 14:47:53 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Sat, 30 Nov 2019 14:42:09 GMT Connection: keep-alive Accept-Ranges: bytes
注意:整個過程當中,建議針對進程號進行平滑升級、重啓、關閉等操做!vim
關於nginx使用kill命令經常使用的參數:後端
- QUIT 平滑關閉
- HUP 平滑重啓,從新加載配置文件
- USR1 從新打開日誌文件
- USR2 平滑升級可執行程序
- WINCH 平滑關閉工做進程
[root@localhost ~]# vim /usr/src/nginx-1.2.4/src/core//nginx.h ……………… //省略部份內容 #define nginx_version 1002004 #define NGINX_VERSION "8.8.8.8" //根據實際狀況修改成本身想要的信息 #define NGINX_VER "lzj/" NGINX_VERSION //同上,注意修改完的lzj [root@localhost ~]# vim /usr/src/nginx-1.2.4/src/http/ngx_http_header_filter_module.c ……………… //省略部份內容 static char ngx_http_server_string[] = "Server: lzj" CRLF; //與上一個文件中修改的名稱同樣(lzj) static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF; [root@localhost ~]# vim /usr/src/nginx-1.2.4/src/http/ngx_http_special_response.c ……………… //省略部份內容 static u_char ngx_http_error_tail[] = "<hr><center>lzj</center>" CRLF //注意與上兩個文件中修改的lzj要一致 "</body>" CRLF "</html>" CRLF ; [root@localhost ~]# cd /usr/src/nginx-1.2.4/ [root@localhost nginx-1.2.4]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module && make [root@localhost ~]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak [root@localhost ~]# cp /usr/src/nginx-1.2.4/objs/nginx /usr/local/nginx/sbin/ [root@localhost ~]# nginx -s stop //中止nginx服務 [root@localhost ~]# nginx //開啓nginx服務 [root@localhost ~]# curl -I 127.0.0.1 HTTP/1.1 200 OK Server: lzj/8.8.8.8 //查看版本信息 Date: Sat, 30 Nov 2019 15:06:32 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Sat, 30 Nov 2019 14:42:09 GMT Connection: keep-alive Accept-Ranges: bytes
注意:修改nginx版本信息,就須要重啓服務,因此若是想要修改則儘可能在安裝以前就進行修改!設計模式
在nginx的配置文件中,有一個http{}的段落,在http{}中還包含了server{},其中一個server{}則表明一個虛擬主機,實現方法以下:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf //編輯Nginx的主配置文件,實現相同IP,不一樣域名進行訪問 …………………………………… //省略部份內容 server { listen 80; server_name www.lzj.com; location / { root /lzj; index index.html index.htm; } } server { listen 80; server_name www.zhj.com; location / { root /zhj; index index.html index.htm; } } [root@localhost ~]# mkdir /lzj //自行建立各自的首頁文件 [root@localhost ~]# echo "www.lzj.com" >> /lzj/index.html [root@localhost ~]# mkdir /zhj [root@localhost ~]# echo "www.zhj.com" >> /zhj/index.html [root@localhost ~]# echo "192.168.1.8 www.lzj.com" >> /etc/hosts //在本地hosts文件添加相應的域名 [root@localhost ~]# echo "192.168.1.8 www.zhj.com" >> /etc/hosts [root@localhost ~]# nginx -t //檢查nginx配置文件有無語法錯誤 nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [root@localhost ~]# nginx -s reload //從新加載nginx配置文件 [root@localhost ~]# curl www.lzj.com //驗證效果 www.lzj.com [root@localhost ~]# curl www.zhj.com www.zhj.com
主要介紹一下nginx配置文件server{}段落中的location的詳細配置
「=」號表示絕對匹配,訪問網頁的根目錄能夠,可是訪問後面天啊及參數就不能夠了,好比:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf //編輯Nginx主配置文件 ……………………………… //省略部份內容 server { listen 80; server_name localhost; location = /test { //尋找網頁根目錄下的test目錄中的內容 root test; //尋找的路徑爲/usr/lcoal/nginx/html/test/目錄中的首頁文件 index index.html index.htm; } [root@localhost ~]# mkdir /usr/local/nginx/html/test [root@localhost ~]# echo "test" >> /usr/local/nginx/html/test/index.html //建立測試文件 [root@localhost ~]# nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [root@localhost ~]# nginx -s reload
客戶端訪問效果:
root:實際訪問的文件會被拼接URL的路徑;
alias:實際訪問的文件路徑不會拼接URL的路徑;
使用root路徑:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf location ^~ /www { //^表示以什麼開頭,~表示使用正則表達式 root html; //root:實際訪問的文件路徑會拼接URL的路徑,這裏的html是相對路徑 index index.html index.htm; //那麼訪問的路徑就是/usr/lcoal/nginx/html/www } [root@localhost ~]# mkdir /usr/local/nginx/html/www [root@localhost ~]# echo "www" >> /usr/local/nginx/html/www/index.html //建立測試文件 [root@localhost ~]# nginx -s reload //從新加載nginx的配置文件
訪問效果以下:
使用alias路徑:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf location ^~ /www { alias html; //alias:實際訪問的路徑不會拼接URL的路徑 index index.html index.htm; } [root@localhost ~]# nginx -s reload //從新加載nginx的配置文件
訪問效果以下:
實例一:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf ............... //省略部份內容 location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ { root /www; //當用戶訪問的是gif、jpg等文件時,去/www目錄下尋找 index index.html index.htm; } location / { root html; index index.html index.htm; } [root@localhost ~]# ls /www a.jpg [root@localhost ~]# nginx -s reload //從新加載配置文件
客戶端訪問:
實例二:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf ............... //省略部份內容 location ~* .(gif|jpg|jpeg|png|css|js|ico)$ { rewrite .(gif|jpg) /error.png; //當客戶端訪問的是jpg等結尾的文件時,自動跳轉到error.png } //error.png的存在位置就是網頁根目錄,由於是「/error.png」 [root@localhost ~]# ls /usr/local/nginx/html/ 50x.html error.png index.html [root@localhost ~]# nginx -s reload
客戶端訪問測試:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf ............... //省略部份內容 if ($request_method = BDQN) { return 666; //當客戶端訪問BDQN的方式訪問時,返回狀態碼爲666 } [root@localhost ~]# nginx -s reload //從新加載配置文件
訪問效果以下:
curl命令經常使用參數:
- -X:請求的方式;
- -I:返回服務器響應頭部報文
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf ............... //省略部份內容 if ($host != 'www.test.com') { rewrite ^/(.*)$ https://www.baidu.com/$1; } //當客戶端不是經過www.test.com 方式訪問就會跳轉到百度的頁面 [root@localhost ~]# nginx -s reload //從新加載配置文件
訪問效果以下:
咱們都知道http是80端口,https是443端口,因爲https更加安全,因此如今大多數web服務都是經過https方式進行訪問的,接下來,就配置一下https訪問nginx服務器。
因爲互聯網認證的CA證書須要付費購買,實驗環境因此這裏就本身作一個,沒有通過互聯網認證的CA證書。方法以下:
[root@localhost ~]# mkdir /usr/local/nginx/ca //建立一個目錄用於存放ca證書、祕鑰 [root@localhost ~]# cd /usr/local/nginx/ca/ [root@localhost ca]# openssl genrsa -out ca.key 4096 //生成祕鑰文件 Generating RSA private key, 4096 bit long modulus ..............................++ .....................................................................................................++ e is 65537 (0x10001) [root@localhost ca]# openssl req -new -x509 -days 7304 -key ca.key -out ca.crt //經過密鑰生成證書文件,如下內容隨意填寫 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:zh State or Province Name (full name) []:beijing Locality Name (eg, city) [Default City]:beijing Organization Name (eg, company) [Default Company Ltd]:beijing Organizational Unit Name (eg, section) []:beijing Common Name (eg, your name or your server's hostname) []:beijing Email Address []:beijing [root@localhost ca]# ls //確認目錄下有這兩個文件 ca.crt ca.key [root@localhost ca]# vim /usr/local/nginx/conf/nginx.conf ............... //省略部份內容 server { listen 443 ssl; //使用ssl加密 server_name localhost; ssl on; //啓用ssl ssl_certificate /usr/local/nginx/ca/ca.crt; //證書存放路徑 ssl_certificate_key /usr/local/nginx/ca/ca.key; //祕鑰存放路徑 ssl_session_timeout 5m; //session會話超時時間 ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } } //配置文件末尾存放,啓用便可! [root@localhost ~]# nginx -s reload //重載nginx配置文件
訪問效果:
有些時候,咱們web服務的一些頁面,不方便對全部人開放,這事,能夠開啓該網頁的訪問認證,開啓後,就須要使用用戶名密碼進行登陸,纔可看到相應的頁面。
若是不開啓認證方式的話,用戶就能夠直接訪問網站內容,以下:
開啓認證,方法以下:
[root@localhost ~]# yum -y install httpd-tools //安裝htpassword工具 [root@localhost ~]# htpasswd -c /usr/local/nginx/.passwd lzj New password: Re-type new password: Adding password for user lzj //用戶認證信息存放路徑是/usr/local/nginx/.passwd //若要向.passwd中添加第二個用戶,須要省略「-c」選項,不然會覆蓋以前的全部用戶。 [root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf ............... //省略部份內容 location / { root html; index index.html index.htm; auth_basic "請輸入登陸帳號"; //添加提示語句 auth_basic_user_file /usr/local/nginx/.passwd; //認證信息存放路徑 } [root@localhost ~]# nginx -s reload //重載nginx配置文件
訪問測試:
———————— 本文至此結束,感謝閱讀 ————————