搭建Nginx服務器及深度優化(1)

博文大綱:

一、Nginx介紹
二、搭建Nginx服務器
三、Nginx服務的版本升級至1.2
四、修改Nginx服務頭部信息
五、nginx主配置文件中 location選項的詳解
六、配置https訪問Nginx
七、開啓Nginx訪問認證

一、Nginx介紹

Nginx專爲性能優化而開發,其最大的優點就是它的穩定性和低系統資源消耗,以及對http併發連接的高處理能力,單臺物理服務器可支持20000~50000個併發請求,正是如此,大量提供社交網絡、新聞資訊、電子商務及虛擬主機等服務的企業紛紛選擇Nginx來提供web服務,目前中國大陸使用nginx網站用戶有:新浪、網易、騰訊,另外知名的微網誌Plurk也使用nginx。

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 服務器來說,一個請求的基本過程是:建立連接—接收數據—發送數據,在系統底層看來 :上述過程(建立連接—接收數據—發送數據)在系統底層就是讀寫事件。
如果採用阻塞調用的方式,當讀寫事件沒有準備好時,那麼就只能等待,當前線程被掛起,等事件準備好了,才能進行讀寫事件。
如果採用非阻塞調用的方式:事件馬上返回,告訴你事件還沒準備好呢,過會再來吧。過一會,再來檢查一下事件,直到事件準備好了爲止,在這期間,你就可以先去做其它事情,然後再來看看事件好了沒。雖然不阻塞了,但你得不時地過來檢查一下事件的狀態,你可以做更多的事情了,但帶來的開銷也是不小的。非阻塞調用指在不能立刻得到結果之前,該調用不會阻塞當前線程

非阻塞通過不斷檢查事件的狀態來判斷是否進行讀寫操作,這樣帶來的開銷很大,因此就有了異步非阻塞的事件處理機制。這種機制讓你可以同時監控多個事件,調用他們是非阻塞的,但可以設置超時時間,在超時時間之內,如果有事件準備好了,就返回。這種機制解決了上面阻塞調用與非阻塞調用的兩個問題。
以 epoll 模型爲例:當事件沒有準備好時,就放入 epoll(隊列)裏面。如果有事件準備好了,那麼就去處理;當事件沒有準備好時,纔在 epoll 裏面等着。這樣,我們就可以併發處理大量的併發了,當然,這裏的併發請求,是指未處理完的請求。線程只有一個,所以同時能處理的請求當然只有一個了,只是在請求之間進行不斷地切換而已,切換也是因爲異步事件未準備好,而主動讓出的。這裏的切換是沒有任何代價,可以理解爲循環處理多個準備好的事件。
多線程方式相比,這種事件處理方式是有很大的優勢的,不需要創建線程,每個請求佔用的內存也很少,沒有上下文切換, 事件處理非常的輕量級,併發數再多也不會導致無謂的資源浪費(上下文切換)。對於 apache 服務器,每個請求會獨佔一個工作線程,當併發數上到幾千時,就同時有幾千的線程在處理請求了。這對操作系統來說,是個不小的挑戰:因爲線程帶來的內存佔用非常大,線程的上下文切換帶來的 cpu 開銷很大,自然性能就上不 去,從而導致在高併發場景下性能下降嚴重。
總結:通過異步非阻塞的事件處理機制,Nginx 實現由進程循環處理多個準備好的事件,從而實現高併發和輕量級。

二、搭建Nginx服務器

環境準備:

centos 7.3,IP地址爲192.168.20.5
下載我提供的軟件包,https://pan.baidu.com/s/1vdsCebv4_N0_mHx_Y0IXMA
注:Nginx官方下載地址:http://nginx.org/download/

1、將nginx-1.14.0.tar.gz上傳至服務器(由於後面有一個升級Nginx的操作,所以先安裝一個低版本的Nginx)

[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 

至此,就安裝成功了

三、Nginx服務的版本升級至1.2

[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服務頭部信息

一般是爲了提高安全性,我們會對客戶端進行隱藏Nginx的版本信息,具體操作如下:


#修改前,客戶端訪問,可以看到我們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主配置文件中 location選項的詳解

在nginx的主配置文件中,有一個http{ }的段落,在http{ }中還包含了server { },其中一個server { }就代表一個虛擬主機,可以在其中針對某個web服務配置不同的參數,這裏說一下location { }的詳細配置。

1、root和alias的區別

  • root:是實際訪問的文件路徑會被拼接成URL的路徑;
  • alias:實際訪問的文件路徑不會被拼接URL路徑
    在下面的配置中,“ ^ ”表示以什麼開頭,“ ~ ”表示使用正則匹配表達式

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進行測試:
搭建Nginx服務器及深度優化(1)

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進行測試:
搭建Nginx服務器及深度優化(1)

2、匹配指定的後綴時,就重定向到指定的文件

示範一:


[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進行測試:

搭建Nginx服務器及深度優化(1)

示範二:


[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進行測試:
搭建Nginx服務器及深度優化(1)

看到的是html下的index.html文件的內容。現在訪問192.168.20.5/test1.jpg進行測試:
搭建Nginx服務器及深度優化(1)

這樣,看到的就是/webroot/res/目錄下的test1.jpg圖片。

3、當匹配指定的請求方式,就返回特定的狀態碼

[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 進行測試:

可以看到返回了我們指定的狀態碼
搭建Nginx服務器及深度優化(1)

4、當客戶端不是以指定域名訪問時,就跳轉到指定的域名

[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時,自動會和百度對應上。
搭建Nginx服務器及深度優化(1)

六、配置https訪問Nginx

我們都知道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 []:[email protected]    #郵箱
[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訪問測試(由於證書沒有經過互聯網認證的,所以會出現下面的警告信息,單擊“高級”,選擇繼續訪問即可):

搭建Nginx服務器及深度優化(1)
https訪問成功:
搭建Nginx服務器及深度優化(1)

七、開啓Nginx訪問認證

有些時候,我們web服務的一些頁面,不方便對所有人開放,這事,可以開啓該網頁的訪問認證,開啓後,就需要使用用戶名密碼進行登錄,纔可看到相應的頁面。

沒有開啓訪問認證的情況下訪問我們192.168.20.5/auth/的網頁文件,,可以直接訪問,如下:

搭建Nginx服務器及深度優化(1)
現在開啓認證:


[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文件中包含的用戶和密碼,都能進行登錄):

搭建Nginx服務器及深度優化(1)
登錄成功後,就可以看到了網頁文件:

搭建Nginx服務器及深度優化(1)

注意:自行創建的網頁目錄及文件,我這裏並沒有寫下來創建網頁文件的配置。

———————— 本文至此結束,感謝閱讀 ————————

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章