一篇文章教你瞭解和如何使用nginx

1.什麼是Nginx

Nginx是一個高性能的HTTP和反向代理web服務器,同時也提供IMAP/POP3/SMTP服務 --引用百度百科

主要功能:反向代理,通過配置文件可以實現集羣和負載均衡,靜態資源虛擬化

2.正向代理與反向代理
2.1 正向代理

客戶端請求目標服務器之間的一個代理服務器
請求會先經過代理服務器,然後在請求轉發到目標服務器,獲得內容後在返回給相應到客戶端
舉例:去網吧上網,網吧就是一個正向代理服務器,我們開機上網後訪問的網站都是通過網吧的服務器,然後請求到目標服務器

2.2 反向代理

用戶請求目標服務器,由代理服務器決定訪問哪個ip
舉例:去學校報到,提交報名表,由教務處決定分到哪個班級,教務處就相當於反向代理服務器

3.Nginx的安裝
3.1 Window版本安裝

windows版本比較簡單,直接下載啓動就好了

3.2 Linux版本安裝

我這邊linux版本是CentOS7版本
安裝步驟:

  1. 安裝Nginx
    去官網http://nginx.org/下載對應的nginx包,
    推薦使用穩定版本上傳nginx到linux系統
    在這裏插入圖片描述

  2. 安裝依賴環境
    (1)安裝gcc環境
    yum install gcc-c++
    (2)安裝PCRE庫,用於解析正則表達式
    yum install -y pcre pcre-devel
    (3)zlib壓縮和解壓縮依賴,
    yum install -y zlib zlib-devel
    (4)SSL 安全的加密的套接字協議層,用於HTTP安全傳輸,也就是https
    yum install -y openssl openssl-devel
    3.解壓,需要注意,解壓後得到的是源碼,源碼需要編譯後才能安裝
    tar -zxvf nginx-1.16.1.tar.gz
    4.編譯之前,先創建nginx臨時目錄,如果不創建,在啓動nginx的過程中會報錯
    mkdir /var/temp/nginx -p
    在nginx目錄,輸入如下命令進行配置,目的是爲了創建makefile文件

./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi  \
--with-http_ssl_module

注:\ 代表在命令行中換行,用於提高可讀性配置命令:命令解釋

命令 解釋
–prefix 指定nginx安裝目錄
–pid-path 指向nginx的pid
–lock-path 鎖定安裝文件,防止被惡意篡改或誤操作
–error-log 錯誤日誌
–http-log-path http日誌
–with-http_gzip_static_module 啓用gzip模塊,在線實時壓縮輸出數據流
–http-client-body-temp-path 設定客戶端請求的臨時目錄
–http-proxy-temp-path 設定http代理臨時目錄
–http-fastcgi-temp-path 設定fastcgi臨時目錄
–http-uwsgi-temp-path 設定uwsgi臨時目錄
–http-scgi-temp-path 設定scgi臨時目錄

make編譯
make
安裝
make install
進入sbin目錄啓動
nginx./nginx
停止:
./nginx -s stop
重新加載:
./nginx -s reload
打開瀏覽器,訪問虛擬機所處內網ip即可打開nginx默認頁面,顯示如下便表示安裝成功:
注意事項:
1.如果在雲服務器安裝,需要開啓默認的nginx端口:80
2.如果在虛擬機安裝,需要關閉防火牆
3.本地win或mac需要關閉防火牆

查看防火牆狀態
firewall-cmd --state
停止firewall
systemctl stop firewalld.service
禁止firewall開機啓動
systemctl disable firewalld.service

4.Nginx的常用命令

./nginx -s stop 強制關閉,無論有沒有客戶在使用
./nginx -s quit 關閉,如果有客戶在使用,等客戶使用完在關閉
./nginx -t 校驗配置文件
./nginx -v 查看版本號
./nginx -V 詳細信息
./nginx -h 幫助文檔
./nginx -c 指定特定的配置文件

5.Nginx進程模型解析

Nginx有兩個進程:
一個是master進程,是Nginx的主進程,只有一個
一個是work進程,是Nginx的工作進程,可以有多個,可以在配置文件裏面配置多個
Nginx進程之間的關係:
在這裏插入圖片描述
由master下發指令給worker,由worker去鏈接客戶端處理,兩者的管理類似於老闆於員工之間的關係

6.Nginx處理web機制
6.1 Worker搶佔機制

要了解worker搶佔機制就要先明白一個名詞‘驚羣問題’

驚羣問題是指在多線程(或多進程)場景下,有多個線程在等待某一資源可用,一旦這個資源可用,那麼所有等待這個資源的線程都會被喚醒,但是資源只有一份,那麼只有一個線程獲得這個資源,其它線程都獲取失敗
驚羣問題導致了不必要的線程喚醒,實際上只有一個線程能獲取這份資源,那麼理想情況下只喚醒一個線程就行了。而喚醒多個線程導致了不必要的線程調度,造成系統開銷

而Nginx爲了避免驚羣問題,就有了accept_mutex這個鎖,在Nginx默認下是開啓的,當accept_mutex開啓後,任意時刻只有一個進程能獲得accept_mutex鎖,獲得accept_mutex鎖的進程能監聽web端口;無法獲得accept_mutex鎖的進程會把監聽套接字從其epoll中刪除
在這裏插入圖片描述

也就是鎖master會fork出多個worker,當一個請求過來之後,多個worker會搶佔的accept_mutex這個鎖,只有有這個鎖的worker纔有資格處理這個請求

6.2 Nginx服務器事件處理

在Linux環境下用的是epoll模型,當一個請求進入到worker中如果他阻塞了,那麼worker會去處理其他的請求,這樣一個worker就可以‘同時’處理一百上千個請求。
在這裏插入圖片描述

6.3 同步與異步,阻塞與非阻塞

這四個概念兩兩組合,會形成4個新的概念,如下:

  1. 同步阻塞: 客戶端發送請求給服務端,此時服務端處理任務時間很久,則客戶端則被服務端堵塞了,所以客戶端會一直等待服務端的響應,此時客戶端不能做其他任何事,服務端也不會接受其他客戶端的請求。這種通信機制比較簡單粗暴,但是效率不高。
  2. 同步非阻塞: 客戶端發送請求給服務端,此時服務端處理任務時間很久,這個時候雖然客戶端會一直等待響應,但是服務端可以處理其他的請求,過一會回來處理原先的。這種方式很高效,一個服務端可以處理很多請求,不會在因爲任務沒有處理完而堵着,所以這是非阻塞的。
  3. 異步阻塞(不存在,只是舉個例子): 客戶端發送請求給服務端,此時服務端處理任務時間很久,但是客戶端不會等待服務器響應,它可以做其他的任務,等服務器處理完畢後再把結果響應給客戶端,客戶端得到回調後再處理服務端的響應。這種方式可以避免客戶端一直處於等待的狀態,優化了用戶體驗,其實就是類似於網頁裏發起的ajax異步請求。
  4. 異步非阻塞: 客戶端發送請求給服務端,此時服務端處理任務時間很久,這個時候的任務雖然處理時間會很久,但是客戶端可以做其他的任務,因爲他是異步的,可以在回調函數裏處理響應;同時服務端是非阻塞的,所以服務端可以去處理其他的任務,如此,這個模式就顯得非常的高效了。
    以上四點,除了第三點,其餘的分別爲BIO/NIO/AIO,面試官如果問你“請簡述一下BIO/NIO/AIO之間的概念與區別”,那麼你就可以組織一下語言來回答,或者通過如下生活實例來闡述也是可以的:
  5. BIO: 我去上廁所,這個時候坑位都滿了,我必須等待坑位釋放了,我才能上吧?!此時我啥都不幹,站在廁所裏盯着,過了一會有人出來了,我就趕緊蹲上去。
  6. NIO: 我去上廁所,這個時候坑位都滿了,沒關係,哥不急,我出去抽根菸,過會回來看看有沒有空位,如果有我就蹲,如果沒有我出去接着抽菸或者玩會手機。
  7. 異步阻塞: 我去上廁所,這個時候坑位都滿了,沒事我等着,等有了新的空位,讓他通知我就行,通知了我,我就蹲上去。
  8. AIO: 我去上廁所,這個時候坑位都滿了,沒事,我一點也不急,我去廁所外面抽根菸再玩玩手機,等有新的坑位釋放了,會有人通知我的,通知我了,我就可以進去蹲了。
    從這個生活實例中能可以看得出來:
    同步就是我需要自己每隔一段時間,以輪訓的方式去看看有沒有空的坑位;
    異步則是有人拉完茅坑會通知你,通知你後你再回去蹲;阻塞就是在等待的過程中,你不去做其他任何事情,乾等着;非阻塞就是你再等待的過程中可以去做其他的事,比如抽菸、喝酒、燙頭、玩手機。
    小結:異步的優勢顯而易見,大大優化用戶體驗,非阻塞使得系統資源開銷遠遠小於阻塞模式,因爲系統不需要創建新的進程(或線程),大大地節省了系統的資源,如此多出來的系統資源可以給其他的中間件去服務了。
7.nginx.conf配置文件詳解
7.1 nginx.conf結構

在這裏插入圖片描述

7.2 nginx.conf 核心配置文件說明

設置worker進程的用戶,指的linux中的用戶,會涉及到nginx操作目錄或文件的一些權限,默認爲nobody
user root;
worker進程工作數設置,一般來說CPU有幾個,就設置幾個,或者設置爲N-1也行
worker_processes 1;
nginx 日誌級別debug | info | notice | warn | error | crit | alert | emerg,錯誤級別從左到右越來越大
設置nginx進程
pidpid logs/nginx.pid;
設置工作模式

events {
    # 默認使用epoll
    use epoll;
    # 每個worker允許連接的客戶端最大連接數
    worker_connections  10240;
}

http 是指令塊,針對http網絡傳輸的一些指令配置

http {
}

include 引入外部配置,提高可讀性,避免單個配置文件過大
include mime.types;
設定日誌格式,main爲定義的格式名稱,如此 access_log 就可以直接使用這個變量了
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ufp2OnC5-1586509226566)(en-resource://database/1286:1)]

參數名 參數意義
$remote_addr 客戶端ip
$remote_user 遠程客戶端用戶名,一般爲:’-’
$time_local 時間和時區
$request 請求的url以及method
$status 響應狀態碼
$body_bytes_send 響應客戶端內容字節數
$http_referer 記錄用戶從哪個鏈接跳轉過來的
$http_user_agent 用戶所使用的代理,一般來時都是瀏覽器
$http_x_forwarded_for 通過代理服務器來記錄客戶端的ip

sendfile使用高效文件傳輸,提升傳輸性能。啓用後才能使用tcp_nopush,是指當數據表累積一定大小後才發送,提高了效率。

sendfile        on;
tcp_nopush      on;

keepalive_timeout設置客戶端與服務端請求的超時時間,保證客戶端多次請求的時候不會重複建立新的連接,節約資源損耗。

#keepalive_timeout  0;
keepalive_timeout  65;

gzip啓用壓縮,html/js/css壓縮後傳輸會更快
gzip on;
server可以在http指令塊中設置多個虛擬主機

  • listen 監聽端口
  • server_name localhost、ip、域名
  • location 請求路由映射,匹配攔截
  • root 請求位置
  • index 首頁設置
server {
            listen       88;
            server_name  localhost;
    
            location / {
                root   html;
                index  index.html index.htm;
            }
    }
8.使用Nginx爲靜態資源提供服務
8.1 靜態網頁的配置
server {
        # 訪問的端口
        listen       90;
        # 訪問的路徑
        server_name  localhost;
        # 路由的配置
        location / {
            # 資源的存放路徑
            root   /home/software/foodie-shop;
            # 默認打開界面
            index  index.html index.htm;
        }
    }
8.2 靜態資源的配置
server {
        # 訪問的端口
        listen       90;
        # 訪問的路徑
        server_name  localhost;
        # 路由的配置
       location /test {
            root    /home;
        }
    }

文件存放路徑
在這裏插入圖片描述
網站訪問路徑
在這裏插入圖片描述

8.3 location的匹配規則解析
#正則表達式。*代表不區分大小寫
location ~* \.(GIF|png|bmp|jpg|jpeg){
root /home;
}

#精確匹配
location  = /{
root /home;
}

#^~ 以某個字符路徑開頭請求
location ^~ /imooc/img{
root /home;
}

#^~ 以某個字符路徑開頭請求
location ^~ /imooc/img{
root /home;
}

#默認匹配規則
location / {
root /home;
}

注:本篇文章一些圖片來自於網絡

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