博文大綱:css
- 1、Nginx介紹
- 2、搭建Nginx服務器
- 3、Nginx服務的版本升級至1.2
- 4、修改Nginx服務頭部信息
- 5、nginx主配置文件中 location選項的詳解
- 6、配置https訪問Nginx
- 7、開啓Nginx訪問認證
Nginx專爲性能優化而開發,其最大的優勢就是它的穩定性和低系統資源消耗,以及對http併發鏈接的高處理能力,單臺物理服務器可支持20000~50000個併發請求,正是如此,大量提供社交網絡、新聞資訊、電子商務及虛擬主機等服務的企業紛紛選擇Nginx來提供web服務,目前中國大陸使用nginx網站用戶有:新浪、網易、騰訊,另外知名的微網誌Plurk也使用nginx。html
Nginx是一個很牛的高性能Web和反向代理服務器,它具備有不少很是優越的特性:前端
- 高併發鏈接:官方測試能支撐5萬併發鏈接,在實際生產環境中跑到2,~3W併發鏈接。
- 內存消耗少:在3W併發鏈接下,開啓的10個NGINX進程才消耗150M內存(15M*10=150M)
- 配置文件很是簡單:風格跟程序同樣通俗易懂。
- 成本低廉:Nginx做爲開源軟件,能夠無償使用,而購買F5 BIG-IP、NetScaler等硬件負載均衡交換機則須要十多萬至幾十萬人民幣。
- 支持rewrite重寫規則:可以根據域名、URL的不一樣,將HTTP請求分發到不一樣的後端服務器羣組。
內置的健康檢查功能:若是Nginx Proxy後端的後臺web服務器宕機了,不會影響前端訪問。- 節省帶寬:支持GZIP壓縮,能夠添加瀏覽器本地緩存的Header頭。
- 穩定性高:用於反向代理,宕機的機率微乎其微。
對於一個 Web 服務器來講,一個請求的基本過程是:創建鏈接—接收數據—發送數據,在系統底層看來 :上述過程(創建鏈接—接收數據—發送數據)在系統底層就是讀寫事件。
若是採用阻塞調用的方式,當讀寫事件沒有準備好時,那麼就只能等待,當前線程被掛起,等事件準備好了,才能進行讀寫事件。
若是採用非阻塞調用的方式:事件立刻返回,告訴你事件還沒準備好呢,過會再來吧。過一會,再來檢查一下事件,直到事件準備好了爲止,在這期間,你就能夠先去作其它事情,而後再來看看事件好了沒。雖然不阻塞了,但你得不時地過來檢查一下事件的狀態,你能夠作更多的事情了,但帶來的開銷也是不小的。非阻塞調用指在不能馬上獲得結果以前,該調用不會阻塞當前線程nginx
非阻塞經過不斷檢查事件的狀態來判斷是否進行讀寫操做,這樣帶來的開銷很大,所以就有了異步非阻塞的事件處理機制。這種機制讓你能夠同時監控多個事件,調用他們是非阻塞的,但能夠設置超時時間,在超時時間以內,若是有事件準備好了,就返回。這種機制解決了上面阻塞調用與非阻塞調用的兩個問題。
以 epoll 模型爲例:當事件沒有準備好時,就放入 epoll(隊列)裏面。若是有事件準備好了,那麼就去處理;當事件沒有準備好時,纔在 epoll 裏面等着。這樣,咱們就能夠併發處理大量的併發了,固然,這裏的併發請求,是指未處理完的請求。線程只有一個,因此同時能處理的請求固然只有一個了,只是在請求之間進行不斷地切換而已,切換也是由於異步事件未準備好,而主動讓出的。這裏的切換是沒有任何代價,能夠理解爲循環處理多個準備好的事件。
多線程方式相比,這種事件處理方式是有很大的優點的,不須要建立線程,每一個請求佔用的內存也不多,沒有上下文切換, 事件處理很是的輕量級,併發數再多也不會致使無謂的資源浪費(上下文切換)。對於 apache 服務器,每一個請求會獨佔一個工做線程,當併發數上到幾千時,就同時有幾千的線程在處理請求了。這對操做系統來講,是個不小的挑戰:由於線程帶來的內存佔用很是大,線程的上下文切換帶來的 cpu 開銷很大,天然性能就上不 去,從而致使在高併發場景下性能降低嚴重。
總結:經過異步非阻塞的事件處理機制,Nginx 實現由進程循環處理多個準備好的事件,從而實現高併發和輕量級。web
環境準備:正則表達式
- centos 7.3,IP地址爲192.168.20.5
- 下載我提供的軟件包,無需都下載,後面用到什麼下載什麼便可。
注:Nginx官方下載地址:http://nginx.org/download/shell
[root@nginx ~]# rz #在xshell中上傳所需源碼包 [root@nginx ~]# tar zxf nginx-1.14.0.tar.gz -C /usr/src #解包 [root@nginx ~]# cd /usr/src/nginx-1.14.0/ #切換至解壓後的目錄 [root@nginx nginx-1.14.0]# useradd -M -s /sbin/nologin nginx #建立運行Nginx的用戶 [root@nginx nginx-1.14.0]# yum -y erase httpd #卸載系統自帶的httpd服務,以避免衝突 [root@nginx nginx-1.14.0]# yum -y install openssl-devel pcre-devel [root@nginx nginx-1.14.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module && make && make install
至此,就安裝成功了apache
[root@nginx nginx-1.14.0]# /usr/local/nginx/sbin/nginx #啓動Nginx服務 [root@nginx nginx-1.2.4]# /usr/local/nginx/sbin/nginx -V nginx version: nginx/1.14.0 #注意,如今版本爲nginx/1.14.0 .......................#省略部分信息 [root@nginx ~]# rz #在xshell中上傳所需源碼包 [root@nginx ~]# tar zxf nginx-1.2.4.tar.gz -C /usr/src #解壓 [root@nginx ~]# cd /usr/src/nginx-1.2.4/ #切換至解壓後的路徑 [root@nginx nginx-1.2.4]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module && make #注意,升級時,不要執行make install 命令,不然會覆蓋原有的低版本配置文件 [root@nginx nginx-1.2.4]# pwd #確認當前路徑 /usr/src/nginx-1.2.4 [root@nginx nginx-1.2.4]# mv /usr/local/nginx/sbin/nginx nginx.bak #將舊版本的服務控制命令進行改名 [root@nginx nginx-1.2.4]# cp objs/nginx /usr/local/nginx/sbin/ #複製新生成的控制命令至指定目錄 [root@nginx nginx-1.2.4]# kill -USR2 `cat /usr/local/nginx/logs/nginx.pid` #生成新的PID號 [root@nginx nginx-1.2.4]# kill -HUP `cat /usr/local/nginx/logs/nginx.pid` #重啓Nginx服務 [root@nginx nginx-1.2.4]# /usr/local/nginx/sbin/nginx -V #查看是否已經升級 nginx version: nginx/1.2.4 #版本爲1.2.4,升級成功
通常是爲了提升安全性,咱們會對客戶端進行隱藏Nginx的版本信息,具體操做以下:vim
#修改前,客戶端訪問,能夠看到咱們Nginx服務器的版本等信息,以下: [root@nginx nginx-1.2.4]# curl -I 127.0.0.1 #獲取頭部信息 HTTP/1.1 200 OK Server: nginx/1.2.4 #版本信息顯示的很詳細 Date: Thu, 17 Oct 2019 14:40:50 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Thu, 17 Oct 2019 14:20:40 GMT Connection: keep-alive Accept-Ranges: bytes #如今進行修改以下: [root@nginx nginx-1.2.4]# pwd #肯定當前工做路徑在源碼包中 /usr/src/nginx-1.2.4 [root@nginx nginx-1.2.4]# vim src/core/nginx.h #修改該文件,隨便修改便可 #define nginx_version 1002004 #define NGINX_VERSION "666" #這裏爲版本號信息 #define NGINX_VER "ljz/" NGINX_VERSION #這裏原來爲Nginx,現更改成ljz #注意,上述配置項前面的註釋符號不用刪除 #更改完成後,保存退出便可 [root@nginx nginx-1.2.4]# vim src/http/ngx_http_header_filter_module.c #編輯該配置文件 static char ngx_http_server_string[] = "Server: ljz" CRLF; #搜索「nginx」,定位到該行,而後更改其中原來的nginx爲ljz,注意,這裏必須和前一個配置文件中指定的名字同樣 #更改完成後,保存退出便可 [root@nginx nginx-1.2.4]# vim src/http/ngx_http_special_response.c #編輯此配置文件 static u_char ngx_http_error_tail[] = #注意,有一段配置和這段內容很是類似,主要區分這一行便可 #若是改錯了,在後面將會報錯 "<hr><center>ljz</center>" CRLF #將此行中間的nginx更改成ljz。 "</body>" CRLF "</html>" CRLF #更改完成後,保存退出便可 [root@nginx nginx-1.2.4]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module && make #從新配置及編譯 [root@nginx nginx-1.2.4]# mv /usr/local/nginx/sbin/nginx nginx2.bak #將原有的nginx命令更名 [root@nginx nginx-1.2.4]# cp objs/nginx /usr/local/nginx/sbin/ #複製新生成的nginx命令到指定目錄 [root@nginx nginx-1.2.4]# /usr/local/nginx/sbin/nginx -s stop #中止nginx服務 [root@nginx nginx-1.2.4]# /usr/local/nginx/sbin/nginx #啓動nginx [root@nginx nginx-1.2.4]# curl -I 127.0.0.1 #查看其頭部信息 HTTP/1.1 200 OK Server: ljz/666 #已經更改爲功 ...............#省略部份內容
在nginx的主配置文件中,有一個http{ }的段落,在http{ }中還包含了server { },其中一個server { }就表明一個虛擬主機,能夠在其中針對某個web服務配置不一樣的參數,這裏說一下location { }的詳細配置。後端
「=」號表示絕對匹配,訪問網頁的根目錄能夠可是訪問後面帶參數就不能夠了,好比 127.0.0.1能夠訪問成功,可是127.0.0.1/html就訪問不成功了。
[root@nginx ~]# cd /usr/local/nginx/conf/ #切換至指定目錄 [root@nginx conf]# vim nginx.conf #編輯主配置文件 http { ...............#省略部份內容 server { listen 80; location = / { #這裏設置爲「= /」 root test; index index.html index.htm; } ...............#省略部份內容 } } [root@nginx nginx]# ln -sf /usr/local/nginx/sbin/nginx /usr/local/sbin/ [root@nginx nginx]# nginx -t [root@nginx nginx]# nginx -s reload #多重載兩次服務,不然可能不生效 [root@nginx nginx]# nginx -s reload [root@nginx nginx]# mkdir test [root@nginx nginx]# echo "`pwd`/test/index.html" > test/index.html [root@nginx nginx]# cat test/index.html /usr/local/nginx/test/index.html
客戶端訪問192.168.20.5進行測試:
在下面的配置中,「 ^ 」表示以什麼開頭,「 ~ 」表示使用正則匹配表達式
1)如今將配置文件中的location改成以下內容:
[root@nginx conf]# vim nginx.conf #編輯主配置文件 http { ...............#省略部份內容 server { listen 80; location ^~ /www { root /var/www/html; #當訪問127.0.0.1/www時,會尋找/var/www/html路徑下的www目錄 index index.html index.htm; } ...............#省略部份內容 } } [root@nginx nginx]# nginx -t [root@nginx nginx]# nginx -s reload #多重載兩次服務,不然可能不生效 [root@nginx nginx]# nginx -s reload [root@nginx conf]# mkdir -p /var/www/html/www [root@nginx conf]# echo "/var/www/html/www/index.html" > /var/www/html/www/index.html
客戶端訪問192.168.20.5/www進行測試:
2)如今將配置文件中的location改成以下內容:
[root@nginx conf]# vim nginx.conf #編輯主配置文件 http { ...............#省略部份內容 server { listen 80; location ^~ /test02 { alias /var/www/test02; #訪問127.0.0.1/test02會尋找/var/www/test02目錄下的網頁文件 index index.html index.htm; } ...............#省略部份內容 } } [root@nginx nginx]# nginx -t [root@nginx nginx]# nginx -s reload [root@nginx nginx]# nginx -s reload [root@nginx conf]# mkdir -p /var/www/test02 [root@nginx conf]# echo "/var/www/test02/index.html" > /var/www/test02/index.html
客戶端訪問192.168.20.5/test02進行測試:
示範一:
[root@nginx conf]# vim nginx.conf #編輯主配置文件 http { ...............#省略部份內容 server { listen 80; location ~* .(gif|jpg|png)$ { rewrite .(gif|jpg)$ /error.png; } #以上表示當訪問gif和jpg結尾的文件跳轉到/usr/local/nginx/html/error.png ...............#省略部份內容 } } [root@nginx nginx]# nginx -t [root@nginx nginx]# nginx -s reload [root@nginx nginx]# nginx -s reload [root@nginx html]# pwd #查看當前路徑 /usr/local/nginx/html [root@nginx html]# ls #error.png需存放在這個目錄下 50x.html error.png index.html
客戶端訪問192.168.20.5/bb.gif進行測試:
示範二:
[root@nginx res]# pwd /webroot/res [root@nginx res]# ls #該路徑下存放的圖片 test1.jpg [root@nginx html]# pwd #當前路徑 /usr/local/nginx/html [root@nginx html]# cat index.html #有一個首頁文件 /usr/local/nginx/html/index.html [root@nginx html]# vim ../conf/nginx.conf #編輯主配置文件 server { listen 80; server_name localhost; location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ { #「~」表示使用正則表達式,「 * 」表示不區分大小寫 root /webroot/res; #當訪問以以上gif、jpg等結尾的文件時,就去/webroot/res目錄下找 index index.html index.html; } location / { root html; index index.html index.htm; } [root@nginx html]# nginx -s reload #重啓服務,使更改生效
客戶端訪問Nginx的192.168.20.5進行測試:
看到的是html下的index.html文件的內容。如今訪問192.168.20.5/test1.jpg進行測試:
這樣,看到的就是/webroot/res/目錄下的test1.jpg圖片。
[root@nginx conf]# vim nginx.conf #編輯主配置文件 http { ...............#省略部份內容 server { listen 80; if ($request_method = TEST) { return 666; } #當客戶端以TEST的方式訪問時,返回狀態碼666 ...............#省略部份內容 } } [root@nginx nginx]# nginx -t [root@nginx nginx]# nginx -s reload [root@nginx nginx]# nginx -s reload
在本機執行命令 curl -X TEST -I 127.0.0.1 進行測試:
能夠看到返回了咱們指定的狀態碼
[root@nginx conf]# vim nginx.conf #編輯主配置文件 http { ...............#省略部份內容 server { listen 80; if ($host != 'www.test.com'){ rewrite ^/(.*)$ https://www.baidu.com/$1; } #以上表示當客戶端不是經過www.test.com域名訪問時,就跳轉到百度首頁 ...............#省略部份內容 } } [root@nginx nginx]# nginx -t [root@nginx nginx]# nginx -s reload [root@nginx nginx]# nginx -s reload
客戶端訪問192.168.20.5進行測試:
因爲我在截圖以前,就訪問了一次,因此,這裏輸入IP時,自動會和百度對應上。
咱們都知道http是80端口,https是443端口,因爲https更加安全,因此如今大多數web服務都是經過https方式進行訪問的,接下來,就配置一下https訪問nginx服務器。
因爲互聯網認證的CA證書須要付費購買,因此這裏就本身作一個,沒有通過互聯網認證的CA證書。
[root@nginx ca]# pwd #切換至指定目錄 /usr/local/nginx/ca [root@nginx ca]# openssl genrsa -out ca.key 4096 #生成祕鑰文件 [root@nginx ca]# openssl req -new -x509 -days 7304 -key ca.key -out ca.crt #如下全部填寫的內容,可直接按回車,接收默認值 ..................#省略部份內容 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]:test #公司名稱 Organizational Unit Name (eg, section) []:operation #所在部門 Common Name (eg, your name or your server's hostname) []:test.com #主機名 Email Address []:lv916551516@163.com #郵箱 [root@nginx ca]# ls #確保當前目錄下有下面兩個文件 ca.crt ca.key [root@nginx ca]# vim /usr/local/nginx/conf/nginx.conf #編輯主配置文件 ..................#省略部份內容,搜索「HTTPS」定位到下面的配置項,並刪除HTTPS下面server{ }全部的註釋符號 #更改後以下(共修改兩行便可): server { listen 443 ssl; server_name localhost; ssl_certificate /usr/local/nginx/ca/ca.crt; #就改這一行,指定ca.crt的絕對路徑 ssl_certificate_key /usr/local/nginx/ca/ca.key; #再改這一行,指定ca.key的絕對路徑 ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } } } #更改完成後,保存退出便可 [root@nginx ca]# nginx -s reload #重啓nginx [root@nginx ca]# nginx -s reload
客戶端使用https訪問測試(因爲證書沒有通過互聯網認證的,因此會出現下面的警告信息,單擊「高級」,選擇繼續訪問便可):
https訪問成功:
有些時候,咱們web服務的一些頁面,不方便對全部人開放,這事,能夠開啓該網頁的訪問認證,開啓後,就須要使用用戶名密碼進行登陸,纔可看到相應的頁面。
沒有開啓訪問認證的狀況下訪問咱們192.168.20.5/auth/的網頁文件,,能夠直接訪問,以下:
如今開啓認證:
[root@nginx ~]# yum -y install httpd-tools #安裝所需htpasswd工具 [root@nginx ~]# htpasswd -c /usr/local/nginx/.passwd admin #建立一個admin用戶 New password: #輸入用戶密碼 Re-type new password: #確認密碼 #注:若要向.passwd中添加第二個用戶,須要省略「-c」選項,不然會覆蓋以前的全部用戶。 Adding password for user admin [root@nginx ~]# vim /usr/local/nginx/conf/nginx.conf #編輯Nginx配置文件 ......................#省略部份內容,編輯須要開啓認證的server配置段 server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location /auth { #注意這裏實際的路徑至關於「/usr/local/nginx/html/auth」 root html; index index.html index.htm; auth_basic "請輸入登陸帳號"; #添加提示語句 auth_basic_user_file /usr/local/nginx/.passwd; #指定密碼文件的存放路徑 } #編輯完成後,保存退出便可 [root@nginx nginx]# nginx -s reload #重啓Nginx服務
客戶端進行訪問測試(會提示輸入用戶名及密碼,只要是.passwd文件中包含的用戶和密碼,都能進行登陸):
登陸成功後,就能夠看到了網頁文件:
注意:自行建立的網頁目錄及文件,我這裏並無寫下來建立網頁文件的配置。
———————— 本文至此結束,感謝閱讀 ————————