重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
博文大綱:
成都創新互聯專注為客戶提供全方位的互聯網綜合服務,包含不限于網站建設、成都網站建設、響水網絡推廣、成都小程序開發、響水網絡營銷、響水企業策劃、響水品牌公關、搜索引擎seo、人物專訪、企業宣傳片、企業代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;成都創新互聯為所有大學生創業者提供響水建站搭建服務,24小時服務熱線:13518219792,官方網址:www.cdcxhl.com
- 一、Nginx介紹
- 二、搭建Nginx服務器
- 三、Nginx服務的版本升級至1.2
- 四、修改Nginx服務頭部信息
- 五、nginx主配置文件中 location選項的詳解
- 六、配置https訪問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 實現由進程循環處理多個準備好的事件,從而實現高并發和輕量級。
環境準備:
- centos 7.3,IP地址為192.168.20.5
- 下載我提供的軟件包,無需都下載,后面用到什么下載什么即可。
注:Nginx官方下載地址:http://nginx.org/download/
[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
至此,就安裝成功了
[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服務器的版本等信息,如下:
[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[] = #注意,有一段配置和這段內容非常相似,主要區分這一行即可
#如果改錯了,在后面將會報錯
"
ljz " CRLF #將此行中間的nginx更改為ljz。
"
" CRLF "