1. 程式人生 > 其它 >巧用外部表避免大量的insert (r4筆記第71天)

巧用外部表避免大量的insert (r4筆記第71天)

原文連結


1. 基本概念

Nginx 是一款輕量級的 Web 伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,在 BSD-like 協議下發行。其特點是佔有記憶體少,併發能力強,事實上 Nginx 的併發能力在同類型的網頁伺服器中表現較好。以上內容來自百度百科,由百度百科給出的介紹我們不難發現,Nginx 其實是一個反向代理伺服器,作用其實有很多,最突出的是其負載均衡能力,Nginx 的併發能力在同類型的網頁伺服器中是較為出色的。

2. 安裝

首先到官網下載 Nginx 的解壓包

下載完成後通過 rz 命令將其上傳至 Linux,然後進行解壓

 tar -zxvf nginx-1.21.6.tar.gz 

解壓完成後進入解壓後的目錄,在該目錄下有一個名為configure的指令碼,通過執行該指令碼即可安裝 Nginx

./configure

正常情況下終端會提示缺少一些環境

它提示缺少什麼,我們就安裝什麼就行。這裡的提示資訊說的是找不到C語言編譯器,所以來安裝一下C語言的編譯器

yum install -y gcc

安裝完成後,重新執行configure指令碼,該指令碼還可以攜帶引數,通過指定 prefix 引數即可將 Nginx 安裝在指定的目錄下。不出意外,此時終端會再一次提醒你缺少相應的依賴

./configure --prefix=/usr/local/nginx

同樣的,安裝上就好了

yum install -y pcre pcre-devel

安裝完成後再次執行configure指令碼,終端還是提示缺少相應的依賴

把它也安裝上

yum install -y zlib zlib-devel

再一次來執行configure指令碼,這應該是我們第四次執行該指令碼了,此時應該是能夠安裝成功了

接下來執行 make 指令

make

該指令是 Linux 提供的一個編譯指令,通過 make 指令即可對安裝後的 Nginx 進行編譯操作,編譯完成後進行安裝操作

make install

此時我們可以來到/usr/local目錄下檢視 nginx 是否安裝成功

可以看到在該目錄下多出了一個nginx

的目錄,這就是安裝好的 nginx 了,我們進入到 nginx 的 sbin 目錄下,通過執行 nginx 指令碼即可啟動 nginx

cd nginx/sbin
./nginx

 此時在瀏覽器上訪問 http:// + Linux 的 ip 地址(ip 地址可通過命令 ifconfig 檢視,ens33對應)

 

這個頁面說明 nginx 啟動成功!如果你訪問不到,可以先看看防火牆是不是關閉狀態,如果不是,那就把防火牆關閉再訪問試試

# 檢視防火牆狀態
systemctl status firewalld 
# 關閉防火牆
systemctl stop firewalld 

若是想停止 nginx,則執行./nginx -s quit./nginx -s stop指令,這兩種方式的結果都是一樣的,都會停止 nginx,但過程不同,./nginx -s stop是直接停止 nginx,而./nginx -s quit與之相比要柔和一些,它會等待已經接收的連線請求處理完畢後再結束。

一般情況下,我們都會製作一個 nginx 指令碼服務,然後使用指令碼來啟動它,這樣的好處是不用來到 nginx 的 sbin 目錄執行 nginx 指令碼了,當我們需要啟動 nginx 時,在任何位置都可以啟動。首先建立指令碼服務

touch /usr/lib/systemd/system/nginx.service

通過vi /usr/lib/systemd/system/nginx.service命令在該檔案中填入如下內容(需要注意的是如果你的 nginx 不是安裝在/usr/local/nginx下,則需要相應地修改下面的路徑)

[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
wantedBy=multi-user.target

將其寫入檔案後,需要重新載入一下系統服務

systemctl daemon-reload

現在嘗試使用系統服務啟動 nginx

systemctl start nginx.service
# 也可以簡寫成
systemctl start nginx

檢視服務是否啟動

systemctl status nginx

 

也可以通過檢視程序的方式驗證

ps -ef | grep nginx

 

3. 目錄結構

1. conf

conf 為配置檔案目錄,裡面存放的都是 nginx 的配置資訊,nginx.conf 為 nginx 的主要配置檔案,其它配置檔案都是被該檔案引用的

2. html

html 目錄存放的是靜態檔案,比如訪問 nginx 時出現的Welcome to nginx!頁面就是該目錄下的 index.html 檔案

3. logs

logs 目錄存放的是日誌檔案,access.log 是訪問日誌,當通過 nginx 訪問某個資源時就會在該檔案中被記錄;error.log 是錯誤日誌,當然就是用來記錄一些錯誤操作了,比如404

4. sbin

 該目錄下只有一個 nginx 主程序檔案,用來啟動 nginx。

 

4. 基礎配置

在 nginx 中,最為關鍵的就屬 conf 目錄下的 nginx.conf 配置檔案了,nginx 的所有功能都需要在該配置檔案中進行配置,nginx.conf 檔案中的內容較多,其中大部門配置都被註釋了,我們將這些被註釋的內容先刪掉,看看 nginx 究竟配置了些什麼

#其中位於第一行的配置 worker_processes  1 表示開始一個業務程序,在 nginx 中的工作模式是這樣的,
#nginx 會開啟一個 master 程序和多個 worker 程序,這裡的 worker 程序就是業務程序,master 程序並不處理業務,
#而是負責排程 worker 程序,業務由 worker 程序負責處理。所以這裡配置的就是 worker 程序數了
worker_processes  1;

events {
    worker_connections  1024;#表示每個 worker 程序可以建立的連線數
}

http {
    include       mime.types;#表示引入了一個名為 mime.types 的外部配置檔案
    #default_type 表示的是如果在 mime.types 檔案中沒有找到對應的對映,
    #則統一返回給瀏覽器 application/octet-stream 型別,這是一個兜底的方案
    default_type  application/octet-stream;
    #sendfile 指的是資料零拷貝,當你通過 nginx 下載一個資源時,因為 nginx 始終還是個執行在作業系統中的軟體,
    #所以網路請求一定是先由作業系統接收,作業系統再將請求交給 nginx,nginx 再從磁碟上獲取到使用者請求的資源,
    #先將其讀取到 nginx 的快取中,再將其複製到作業系統的快取,最後由作業系統交給客戶端。
    #以上是不開啟資料零拷貝的情況,如果開啟了資料零拷貝,則 nginx 將資源賦值給作業系統的這一步驟會被省略,
    #作業系統將直接從磁碟上讀取資源並交給客戶端,這就是該項配置的作用
    sendfile        on;
    keepalive_timeout  65;#指的是保持連線的超時時間
    
    #server 表示 nginx 中的一個主機,在 nginx 中可以配置多個主機,每個主機相當於是一個獨立的站點,主機之間相互並不影響
    server {
        listen       80;#表示監聽80埠
        server_name  localhost;#表示當前主機的主機名
        location / {#表示匹配請求的URI資源,當匹配上了資源後,就會進入 location 配置塊
            root   html;#指的是資源目錄,此時的資源將從 nginx 中的 html 目錄中尋找
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;#表示當產生這幾個狀態碼的錯誤時,將訪問 /50x.html 資源
        location = /50x.html {
            root   html;
        }
    }
}

mime.types 的作用

types {
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    image/jpeg                                       jpeg jpg;
    application/javascript                           js;
    application/atom+xml                             atom;
    application/rss+xml                              rss;
    ......
}

這裡截取了一部分,但能夠看出這似乎是一個對映表,其實它是用來告訴瀏覽器返回的資源型別的,不知道大家有沒有注意過,當你在瀏覽器上訪問一張圖片時,瀏覽器會直接顯示圖片,而當你訪問的是一個 .exe 可執行檔案時,瀏覽器又會進行下載。那麼瀏覽器是如何知道什麼資源需要顯示,而什麼資源又需要下載呢?其實,瀏覽器靠的是請求頭中的資源型別來辨別的,我們來訪問一張百度的logo圖片

 

再來訪問一個可執行檔案

發現區別了嗎,它們的 Content-Type 值是不同的,瀏覽器正是通過這些值才能夠對不同的資源做出不同的處理。回到 nginx中 的 mime.types 檔案,它是用來對資源做一個對應的,舉個例子,如果檔案是html、htm、shtml,那麼 nginx 會統一返回Content-Type:text/html給瀏覽器;而如果檔案是 jpeg、jpg,那麼 nginx 會統一返回Content-Type:image/jpeg給瀏覽器,這個告知資源型別的過程是由該檔案完成的。事實上,網際網路中的檔案型別非常多,這個檔案不可能全部都能例舉到,如果有沒對映的型別,你當然可以手動將對映新增到 mime.types 中,比如

type{
  ......
  video/mp4    mp4 mp7 mp8;
  ......
}

通過這段配置,如果檔案型別為 mp4、mp7、mp8,nginx 將統一返回給瀏覽器video/mp4型別

在前面我們就介紹到了 server_name,它表示的是當前主機的主機名,也就是說,只有當請求匹配到了該主機名,對應的主機配置才會生效,舉一個例子,在 nginx.conf 中配置兩個主機

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  www.test1.com;

        location / {
            root   /mysite/test1;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       80;
        server_name  www.test2.com;

        location / {
            root   /mysite/test2;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }
}

在這段配置中一共配置了兩個主機,這兩個主機分別指向/mysite目錄下的兩個資源,所以先來建立這兩個資源,在 Linux 根目錄/下建立mysite目錄,並在mysite目錄下分別建立 test1 和 test2 目錄,這兩個目錄下分別有一個 index.html 檔案

#詳細步驟
cd /
mkdir mysite
cd mysite
mkdir test1
mkdir test2
cd test1
vi index.html
i
複製
<!DOCTYPE html>
<html>
<head>
<title>test1</title>
</head>
<body>
<h1>test1 page</h1>
</body>
</html>
點選Esc
:wq!
cp index.html ../test2
cd ../test2
vi index.html
i
將test1修改為test2
點選Esc
:wq!
cd ..
ll

接著在 Windows 的 hosts 檔案中配置一下域名對映

虛擬機器ip www.test1.com
虛擬機器ip www.test2.com

現在試著訪問一下這兩個站點,首先是www.test1.com

 

其次是www.test2.com

而事實上,對於監聽相同埠的不同域名,如果它們獲取的資源需要是一樣的,那麼它們可以配置在一個 server 塊中

server {
        listen       80;
        server_name  www.test1.com;
        server_name  www.test2.com;
        #也可以將域名配置寫在一個 server_name 上:server_name  www.test1.com; www.test2.com;
        
        location / {
            root   /mysite/test1;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}

此時訪問www.test1.comwww.test2.com都將顯示的是test1 page!