解鎖Nginx不一樣的知識

1. web服務基礎

① DNS解析流程
在這裏插入圖片描述

用戶輸入域名
本地hosts文件(/etc/host)中查找解析記錄
本地DNS緩存中查找記錄
指定的公網DNS服務器(/etc/resolv.conf),通過公網DNS服務器查找記錄
將此記錄緩存到本地DNS中,用於下次加速解析
瀏覽器訪問域名對應的ip,發送http請求

② http協議
http協議的全稱是HyperText Tansfer Protocol,也就是超文本傳輸協議,它是互聯網最常見的協議。http協議最重要的是www(World Wide Web)服務,也叫web服務器,中文叫“萬維網”。web服務端口默認是80,另外一個加密的www服務應用https的默認端口是443。

# 訪問某個域名,獲取該域名請求體信息
[root@master ~]# curl -I baidu.com
HTTP/1.1 200 OK
Date: Sat, 05 Oct 2019 12:48:33 GMT
Server: Apache
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
ETag: "51-47cf7e6ee8400"
Accept-Ranges: bytes
Content-Length: 81
Cache-Control: max-age=86400
Expires: Sun, 06 Oct 2019 12:48:33 GMT
Connection: Keep-Alive
Content-Type: text/html

http協議誕生以來有若干個版本,主要是http/1.0 http/1.1。http/1.0規定瀏覽器和服務器只能保持短暫的連接,瀏覽器的每次請求都需要和服務器建立一個TCP連接,服務器完成請求後即斷開TCP連接,服務器不跟蹤每個鏈接,也不記錄請求。http/1.1是對HTTP的缺陷進行重點修復,從可擴展性,緩存,帶寬優化,持久連接,host頭,錯誤通知等訪問改進。http/1.1支持長連接,增加了更多的請求頭和響應頭信息,例如配置請求頭的Connection的值爲keep-alive,表示請求結果返回後保持連接。

③ https請求的方法

GET    請求指定的頁面信息,並返回實體主體。
HEAD    類似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭
POST    向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。
PUT    從客戶端向服務器傳送的數據取代指定的文檔的內容。
DELETE    請求服務器刪除指定的頁面。
CONNECT    HTTP/1.1協議中預留給能夠將連接改爲管道方式的代理服務器。
OPTIONS    允許客戶端查看服務器的性能。
TRACE    回顯服務器收到的請求,主要用於測試或診斷。

④ http狀態碼

HTTp狀態碼錶示web服務器響應http請求狀態的數字代碼
常見狀態碼以及作用是
1**    信息,服務器收到請求,需要請求者繼續執行操作
2**    成功,操作被成功接收並處理
3**    重定向,需要進一步的操作以完成請求
4**    客戶端錯誤,請求包含語法錯誤或無法完成請求
5**    服務器錯誤,服務器在處理請求的過程中發生了錯誤

⑤ http狀態碼的命令查看

[root@master ~]# curl -I www.baidu.com
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: keep-alive
Content-Length: 277
Content-Type: text/html
Date: Sat, 05 Oct 2019 12:48:45 GMT
Etag: "575e1f7c-115"
Last-Modified: Mon, 13 Jun 2016 02:50:36 GMT
Pragma: no-cache
Server: bfe/1.0.8.18

⑥ http報文
http請求由請求行、請求頭部、空行、請求報文主體幾個部分組成。http報文是HTTP應用程序之間發送的數據塊。這些數據塊以一些文本形式的元信息開頭,這些信息描述了報文的內容及含義,後面跟着可選的數據部分。這些報文都是在客戶端、服務器和代理之間流動。

  • 請求報文的格式
起始行:<method> <request-URL> <version>
頭部:<headers>
主體:<entity-body>
  • GET請求報文
GET /books/?sex=man&name=Professional HTTP/1.1
Host: www.example.com  主機名
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)Gecko/20050225 Firefox/1.0.1  客戶端類型
Accept-Encoding:gzip,deflate    支持壓縮
Accept-Language:zh-cn  支持語言類型
Connection: Keep-Alive  長鏈接
  • 請求行:請求報文第一行,表示客戶端想要什麼,由請求方法 url 協議版本組成。
  • 請求頭部:請求頭由關鍵字:值組成,通過客戶端把請求相關信息告訴服務器。
  • 空行:請求頭信息之後是一個空行,發送回車和換行符,通知web服務器以下沒有請求頭信息了。
  • 請求報文主體
POST / HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive

sex=man&name=Professional  

請求體中包含了要發送給web服務器的數據信息,請問報文主體不用於get方法,而是用於post方法。post方法適用於客戶端填寫表單的場合。

⑦ http響應報文
http 響應與 http 請求相似,http響應也由3個部分構成,分別是:狀態行、響應頭(Response Header)和響應正文

  • 狀態行:協議版本、數字形式的狀態代碼、及相應的狀態描述,各元素之間以空格分隔。用來說明服務器響應客戶端的狀況,一般分爲協議版本號,數字狀態碼,狀態情況。
  • 響應頭部
常見響應頭信息
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Mon, 13 Aug 2018 06:06:54 GMT
Expires: Mon, 13 Aug 2018 06:06:54 GMT
  • 空白行:通知客戶端空行以下沒有頭部信息了
  • 響應報文主體:主要包含了返回給客戶端的數據,可以是文本,二進制(圖片,視頻)
  • HTTP響應例子
HTTP/1.1 200 OK

Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112

<html>...

⑧ url
url的意思是“統一資源標識符”,是一個用於標識某一互聯網資源名稱的字符串,在世界範圍內標識定位某一個唯一信息資源。主要用在各種www客戶端和服務器程序上,url可以用一種統一的格式來描述各種信息資源,包括文件,服務器地址和目錄等。
url組成:

協議  
主機ip或域名
主機資源具體地址
第一部分用"://"隔開,第二部分用"/"符號隔開

⑨ 靜態網頁資源
在網頁設計中,純HTMl格式的網頁(包含圖片,視頻,JS,CSS等樣式)通常被稱作“靜態網頁”。靜態網頁是相對於動態網頁而言的,是指沒有後臺數據庫,不包含程序,不可交互的網頁。

  • 靜態網頁的特性
1、每個頁面有一個固定的url地址,url地址不含有問號"?""&"等符號
2、網頁一經發布到服務器,網頁內容是保存在服務器文件系統上的,每個網頁都是獨立的一個文件
3、網頁內容固定不變,容易被搜索引擎收錄(優點)
4、網頁沒有數據庫支撐,在網站製作和維護上工作量很大(缺點)
5、網頁的交互性很差,缺少程序的功能實現(缺點)
6、客戶端解析網址時,由於不需要讀取數據庫,因此服務器端可以接受更高的併發訪問。請求到來時,直接從磁盤上返回數據。(優點)

高併發架構思想:在高併發,高訪問量的場景下做架構優化時,比較關鍵的就是把動態網頁轉化成靜態網頁,而不是直接請求數據庫和動態服務器,並且可以吧靜態內容推到緩存中,這樣就提升用戶體驗,節約服務器壓力成本。

⑩ 動態網頁資源
動態網頁是和靜態網頁相對而言的,動態網頁的url後綴一般是.asp .aspx .php .js .cgi。並且動態網頁都有標誌性的符號"? &",後端都有數據庫的支持。

  • 動態網頁的特性
1、網頁以數據庫技術爲支撐,大大降低網站維護的工作量
2、動態網頁技術的網站可以實現更多的功能,如用戶註冊,用戶登錄,投票,用戶管理,博客管理等
3、動態網頁不是獨立存在服務器上的網頁文件,用戶請求動態程序時,服務器解析程序並且可能讀取數據庫返回一個完整的網頁內容
4、搜索引擎(爬蟲)一般不會抓取網址中的“?”後面的內容,因此企業都會做僞靜態技術頁面

PS:網站流量術語

  • IP即Internet Protocol,這裏是指獨立ip數,不同的ip地址的計算機訪問網站時被計算的總次數。獨立ip數是網站流量的一個重要指標,一般相同ip地址的客戶端訪問網站頁面一天內只會被計算一次。這裏的ip指的是是固定的公網ip
  • PVPage View的簡寫即是頁面瀏覽量,不管客戶端是不是相同,也不管ip是否相同,用戶只要訪問網站頁面就會被計算PV,一次計算一個PV。PV的度量方法就是客戶端從瀏覽器發出一個web請求(request),服務器接收請求返回一個頁面給客戶端,這樣就產生一個PV。PV是衡量網站被訪問的一個標準,但並不準確有多少人訪問了網站。
  • IUV即unique visitor,同一個客戶端(pc或移動端)訪問網站被計算爲一個訪客。一天內相同的客戶端訪問同一個網站只計一次uv,uv是以cookie等技術爲統計依據,實際統計存在誤差。
  • I併發數併發數指系統同時能處理的請求數量,也反應了系統的負載能力
  • I響應時間響應時間是指執行一個請求從開始到最後收到響應數據所花費的總體時間。
  • IQPSQuery Per Second,指每秒查詢數服務器在一秒內處理了多少個請求,顯然數字越大代表服務器的負載越高,處理能力越強。
2. web服務器和web框架

web服務器只接收請求,然後返回數據,如nginx。而web服務框架是用來開發web應用程序,首先需要接受請求,然後是處理接收到的請求,再返回數據。

3. nginx簡介(面試)

nginx是一個開源的,支持高性能,高併發的www服務和代理服務軟件。它是一個俄羅斯人lgor sysoev開發的,作者將源代碼開源出來供全球使用。nginx的優點如下:

  • 支持高併發,能支持幾萬併發連接
  • 資源消耗少,例如在3萬併發連接下開啓10個nginx線程消耗的內存不到200MB
  • 可以做http反向代理和負載均衡
  • 支持異步網絡i/o事件模型epoll(nginx快就是基於epoll去做的)

面試:爲什麼要使用nginx,可以按照上面所述

4. nginx的安裝與配置

① 安裝nginx依賴環境:

[root@instance-mtfsf05r ~]# yum install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y

nginx 不僅支持 http 協議,還支持 https(即在ssl協議上傳輸http),所以需要在 Centos 安裝 OpenSSL 庫。 OpenSSL 是一個強大的安全套接字層密碼庫,囊括主要的密碼算法、常用的密鑰和證書封裝管理功能及 SSL 協議,並提供豐富的應用程序供測試或其它目的使用。

② 安裝nginx

nginx的下載:http://nginx.org/en/download.html

# 下載源碼包
[root@instance-mtfsf05r ~]# wget http://nginx.org/download/nginx-1.16.1.tar.gz
# 解壓縮
[root@instance-mtfsf05r ~]# tar -zxf nginx-1.16.1.tar.gz
# 切換到nginx目錄
[root@instance-mtfsf05r ~]# cd nginx-1.16.1/
# 配置安裝位置這裏不會生成文件夾
[root@instance-mtfsf05r nginx-1.16.1]# ./configure --prefix=/usr/local/nginx-16/ --with-http_stub_status_module --with-http_ssl_module
# 編譯安裝,編譯安裝後纔會生成/usr/local/nginx-16/目錄
[root@instance-mtfsf05r nginx-1.16.1]# make && make install
# 進入nginx安裝目錄
[root@instance-mtfsf05r ~]# cd /usr/local/nginx-16/
# 進入/sbin目錄
[root@instance-mtfsf05r nginx-16]# cd sbin/
# 啓動nginx
[root@instance-mtfsf05r sbin]# ./nginx
# 查看nginx進程
[root@instance-mtfsf05r sbin]# ps -ef |grep nginx
root      6770     1  0 15:12 ?        00:00:00 nginx: master process ./nginx
nobody    6771  6770  0 15:12 ?        00:00:00 nginx: worker process
root      6779  2444  0 15:12 pts/0    00:00:00 grep --color=auto nginx
# 關閉nginx
[root@instance-mtfsf05r sbin]# ./nginx -s stop
# 重新加再nginx配置文件,不重啓nginx
[root@instance-mtfsf05r sbin]# ./nginx -s reload
# 爲了方便nginx的相關操作,可以做軟鏈接
[root@instance-mtfsf05r sbin]# ln -s /usr/local/nginx-16/sbin/nginx /usr/bin/nginx
# 這樣就可以直接使用nginx命令了
[root@instance-mtfsf05r ~]# nginx

操作nginx的其它命令:

# 監測nginx配置文件nginx.conf的語法是否正確
[root@instance-mtfsf05r ~]# nginx -t
# 查看nginx默認的80端口
[root@instance-mtfsf05r ~]# netstat -tunlp|grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      6955/nginx: master
# 查看配置文件有哪些信息
[root@instance-mtfsf05r ~]# nginx -T
# 安裝後訪問本地ip地址,如果訪問不了,可以檢查selinux,iptables
[root@instance-mtfsf05r ~]# curl -I 127.0.0.1

nginx安裝完畢並且啓動後,默認使用的是80端口,可通過瀏覽器訪問80端口的程序:
在這裏插入圖片描述

5. nginx目錄結構
[root@instance-mtfsf05r ~]# ls /usr/local/nginx-16/
client_body_temp  fastcgi_temp  logs        sbin       uwsgi_temp
conf              html          proxy_temp  scgi_temp
conf:存放nginx所有配置文件的目錄,主要nginx.conf
html:存放nginx默認站點的目錄,如index.html、error.html等
logs:存放nginx默認日誌的目錄,如error.log、access.log
sbin:存放nginx主命令的目錄,sbin/nginx
6. nginx配置文件解析

nginx主配置文件/etc/nginx/nginx.conf是一個純文本類型的文件,整個配置文件是以區塊的形式組織的。一般每個區塊以一對大括號{}來表示開始與結束。

######Nginx配置文件nginx.conf中文詳解#####

#定義Nginx運行的用戶和用戶組
user www www;

#nginx進程數,建議設置爲等於CPU總核心數。
worker_processes 8;
 
#全局錯誤日誌定義類型,[ debug | info | notice | warn | error | crit ]
error_log /usr/local/nginx/logs/error.log info;

#進程pid文件
pid /usr/local/nginx/logs/nginx.pid;

#指定進程可以打開的最大描述符:數目
#工作模式與連接數上限
#這個指令是指當一個nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(ulimit -n)與nginx進程數相除,但是nginx分配請求並不是那麼均勻,所以最好與ulimit -n 的值保持一致。
#現在在linux 2.6內核下開啓文件打開數爲65535,worker_rlimit_nofile就相應應該填寫65535。
#這是因爲nginx調度時分配請求到進程並不是那麼的均衡,所以假如填寫10240,總併發量達到3-4萬時就有進程可能超過10240了,這時會返回502錯誤。
worker_rlimit_nofile 65535;

events
{
    #參考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型
    #是Linux 2.6以上版本內核中的高性能網絡I/O模型,linux建議epoll,如果跑在FreeBSD上面,就用kqueue模型。
    #補充說明:
    #與apache相類,nginx針對不同的操作系統,有不同的事件模型
    #A)標準事件模型
    #Select、poll屬於標準事件模型,如果當前系統不存在更有效的方法,nginx會選擇select或poll
    #B)高效事件模型
    #Kqueue:使用於FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用雙處理器的MacOS X系統使用kqueue可能會造成內核崩潰。
    #Epoll:使用於Linux內核2.6版本及以後的系統。
    #/dev/poll:使用於Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。
    #Eventport:使用於Solaris 10。 爲了防止出現內核崩潰的問題, 有必要安裝安全補丁。
    use epoll;

    #單個進程最大連接數(最大連接數=連接數*進程數)
    #根據硬件調整,和前面工作進程配合起來用,儘量大,但是別把cpu跑到100%就行。每個進程允許的最多連接數,理論上每臺nginx服務器的最大連接數爲。
    worker_connections 65535;

    #keepalive超時時間。
    keepalive_timeout 60;

    #客戶端請求頭部的緩衝區大小。這個可以根據你的系統分頁大小來設置,一般一個請求頭的大小不會超過1k,不過由於一般系統分頁都要大於1k,所以這裏設置爲分頁大小。
    #分頁大小可以用命令getconf PAGESIZE 取得。
    #[root@web001 ~]# getconf PAGESIZE
    #4096
    #但也有client_header_buffer_size超過4k的情況,但是client_header_buffer_size該值必須設置爲“系統分頁大小”的整倍數。
    client_header_buffer_size 4k;

    #這個將爲打開文件指定緩存,默認是沒有啓用的,max指定緩存數量,建議和打開文件數一致,inactive是指經過多長時間文件沒被請求後刪除緩存。
    open_file_cache max=65535 inactive=60s;

    #這個是指多長時間檢查一次緩存的有效信息。
    #語法:open_file_cache_valid time 默認值:open_file_cache_valid 60 使用字段:http, server, location 這個指令指定了何時需要檢查open_file_cache中緩存項目的有效信息.
    open_file_cache_valid 80s;

    #open_file_cache指令中的inactive參數時間內文件的最少使用次數,如果超過這個數字,文件描述符一直是在緩存中打開的,如上例,如果有一個文件在inactive時間內一次沒被使用,它將被移除。
    #語法:open_file_cache_min_uses number 默認值:open_file_cache_min_uses 1 使用字段:http, server, location  這個指令指定了在open_file_cache指令無效的參數中一定的時間範圍內可以使用的最小文件數,如果使用更大的值,文件描述符在cache中總是打開狀態.
    open_file_cache_min_uses 1;
    
    #語法:open_file_cache_errors on | off 默認值:open_file_cache_errors off 使用字段:http, server, location 這個指令指定是否在搜索一個文件是記錄cache錯誤.
    open_file_cache_errors on;
}
 
#設定http服務器,利用它的反向代理功能提供負載均衡支持
http
{
    #文件擴展名與文件類型映射表
    include mime.types;

    #默認文件類型
    default_type application/octet-stream;

    #默認編碼
    #charset utf-8;

    #服務器名字的hash表大小
    #保存服務器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的。參數hash bucket size總是等於hash表的大小,並且是一路處理器緩存大小的倍數。在減少了在內存中的存取次數後,使在處理器中加速查找hash表鍵值成爲可能。如果hash bucket size等於一路處理器緩存的大小,那麼在查找鍵的時候,最壞的情況下在內存中查找的次數爲2。第一次是確定存儲單元的地址,第二次是在存儲單元中查找鍵 值。因此,如果Nginx給出需要增大hash max size 或 hash bucket size的提示,那麼首要的是增大前一個參數的大小.
    server_names_hash_bucket_size 128;

    #客戶端請求頭部的緩衝區大小。這個可以根據你的系統分頁大小來設置,一般一個請求的頭部大小不會超過1k,不過由於一般系統分頁都要大於1k,所以這裏設置爲分頁大小。分頁大小可以用命令getconf PAGESIZE取得。
    client_header_buffer_size 32k;

    #客戶請求頭緩衝大小。nginx默認會用client_header_buffer_size這個buffer來讀取header值,如果header過大,它會使用large_client_header_buffers來讀取。
    large_client_header_buffers 4 64k;

    #設定通過nginx上傳文件的大小
    client_max_body_size 8m;

    #開啓高效文件傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出文件,對於普通應用設爲 on,如果用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡I/O處理速度,降低系統的負載。注意:如果圖片顯示不正常把這個改成off。
    #sendfile指令指定 nginx 是否調用sendfile 函數(zero copy 方式)來輸出文件,對於普通應用,必須設爲on。如果用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡IO處理速度,降低系統uptime。
    sendfile on;

    #開啓目錄列表訪問,合適下載服務器,默認關閉。
    autoindex on;

    #此選項允許或禁止使用socke的TCP_CORK的選項,此選項僅在使用sendfile的時候使用
    tcp_nopush on;
     
    tcp_nodelay on;

    #長連接超時時間,單位是秒
    keepalive_timeout 120;

    #FastCGI相關參數是爲了改善網站的性能:減少資源佔用,提高訪問速度。下面參數看字面意思都能理解。
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;

    #gzip模塊設置
    gzip on; #開啓gzip壓縮輸出
    gzip_min_length 1k;    #最小壓縮文件大小
    gzip_buffers 4 16k;    #壓縮緩衝區
    gzip_http_version 1.0;    #壓縮版本(默認1.1,前端如果是squid2.5請使用1.0)
    gzip_comp_level 2;    #壓縮等級
    gzip_types text/plain application/x-javascript text/css application/xml;    #壓縮類型,默認就已經包含textml,所以下面就不用再寫了,寫上去也不會有問題,但是會有一個warn。
    gzip_vary on;

    #開啓限制IP連接數的時候需要使用
    #limit_zone crawler $binary_remote_addr 10m;

    #負載均衡配置
    upstream jh.w3cschool.cn {
     
        #upstream的負載均衡,weight是權重,可以根據機器配置定義權重。weigth參數表示權值,權值越高被分配到的機率越大。
        server 192.168.80.121:80 weight=3;
        server 192.168.80.122:80 weight=2;
        server 192.168.80.123:80 weight=3;

        #nginx的upstream目前支持4種方式的分配
        #1、輪詢(默認)
        #每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器down掉,能自動剔除。
        #2、weight
        #指定輪詢機率,weight和訪問比率成正比,用於後端服務器性能不均的情況。
        #例如:
        #upstream bakend {
        #    server 192.168.0.14 weight=10;
        #    server 192.168.0.15 weight=10;
        #}
        #2、ip_hash
        #每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端服務器,可以解決session的問題。
        #例如:
        #upstream bakend {
        #    ip_hash;
        #    server 192.168.0.14:88;
        #    server 192.168.0.15:80;
        #}
        #3、fair(第三方)
        #按後端服務器的響應時間來分配請求,響應時間短的優先分配。
        #upstream backend {
        #    server server1;
        #    server server2;
        #    fair;
        #}
        #4、url_hash(第三方)
        #按訪問url的hash結果來分配請求,使每個url定向到同一個後端服務器,後端服務器爲緩存時比較有效。
        #例:在upstream中加入hash語句,server語句中不能寫入weight等其他的參數,hash_method是使用的hash算法
        #upstream backend {
        #    server squid1:3128;
        #    server squid2:3128;
        #    hash $request_uri;
        #    hash_method crc32;
        #}

        #tips:
        #upstream bakend{#定義負載均衡設備的Ip及設備狀態}{
        #    ip_hash;
        #    server 127.0.0.1:9090 down;
        #    server 127.0.0.1:8080 weight=2;
        #    server 127.0.0.1:6060;
        #    server 127.0.0.1:7070 backup;
        #}
        #在需要使用負載均衡的server中增加 proxy_pass http://bakend/;

        #每個設備的狀態設置爲:
        #1.down表示單前的server暫時不參與負載
        #2.weight爲weight越大,負載的權重就越大。
        #3.max_fails:允許請求失敗的次數默認爲1.當超過最大次數時,返回proxy_next_upstream模塊定義的錯誤
        #4.fail_timeout:max_fails次失敗後,暫停的時間。
        #5.backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。

        #nginx支持同時設置多組的負載均衡,用來給不用的server來使用。
        #client_body_in_file_only設置爲On 可以講client post過來的數據記錄到文件中用來做debug
        #client_body_temp_path設置記錄文件的目錄 可以設置最多3層目錄
        #location對URL進行匹配.可以進行重定向或者進行新的代理 負載均衡
    }
     
     
    #虛擬主機的配置
    server
    {
        #監聽端口
        listen 80;

        #域名可以有多個,用空格隔開
        server_name www.w3cschool.cn w3cschool.cn;
        index index.html index.htm index.php;
        root /data/www/w3cschool;

        #對******進行負載均衡
        location ~ .*.(php|php5)?$
        {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
        }
         
        #圖片緩存時間設置
        location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires 10d;
        }
         
        #JS和CSS緩存時間設置
        location ~ .*.(js|css)?$
        {
            expires 1h;
        }
         
        #日誌格式設定
        #$remote_addr與$http_x_forwarded_for用以記錄客戶端的ip地址;
        #$remote_user:用來記錄客戶端用戶名稱;
        #$time_local: 用來記錄訪問時間與時區;
        #$request: 用來記錄請求的url與http協議;
        #$status: 用來記錄請求狀態;成功是200,
        #$body_bytes_sent :記錄發送給客戶端文件主體內容大小;
        #$http_referer:用來記錄從那個頁面鏈接訪問過來的;
        #$http_user_agent:記錄客戶瀏覽器的相關信息;
        #通常web服務器放在反向代理的後面,這樣就不能獲取到客戶的IP地址了,通過$remote_add拿到的IP地址是反向代理服務器的iP地址。反向代理服務器在轉發請求的http頭信息中,可以增加x_forwarded_for信息,用以記錄原有客戶端的IP地址和原來客戶端的請求的服務器地址。
        log_format access '$remote_addr - $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" $http_x_forwarded_for';
         
        #定義本虛擬主機的訪問日誌
        access_log  /usr/local/nginx/logs/host.access.log  main;
        access_log  /usr/local/nginx/logs/host.access.404.log  log404;
         
        #對 "/" 啓用反向代理
        location / {
            proxy_pass http://127.0.0.1:88;
            proxy_redirect off;
            proxy_set_header X-Real-IP $remote_addr;
             
            #後端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             
            #以下是一些反向代理的配置,可選。
            proxy_set_header Host $host;

            #允許客戶端請求的最大單文件字節數
            client_max_body_size 10m;

            #緩衝區代理緩衝用戶端請求的最大字節數,
            #如果把它設置爲比較大的數值,例如256k,那麼,無論使用firefox還是IE瀏覽器,來提交任意小於256k的圖片,都很正常。如果註釋該指令,使用默認的client_body_buffer_size設置,也就是操作系統頁面大小的兩倍,8k或者16k,問題就出現了。
            #無論使用firefox4.0還是IE8.0,提交一個比較大,200k左右的圖片,都返回500 Internal Server Error錯誤
            client_body_buffer_size 128k;

            #表示使nginx阻止HTTP應答代碼爲400或者更高的應答。
            proxy_intercept_errors on;

            #後端服務器連接的超時時間_發起握手等候響應超時時間
            #nginx跟後端服務器連接超時時間(代理連接超時)
            proxy_connect_timeout 90;

            #後端服務器數據回傳時間(代理髮送超時)
            #後端服務器數據回傳時間_就是在規定時間之內後端服務器必須傳完所有的數據
            proxy_send_timeout 90;

            #連接成功後,後端服務器響應時間(代理接收超時)
            #連接成功後_等候後端服務器響應時間_其實已經進入後端的排隊之中等候處理(也可以說是後端服務器處理請求的時間)
            proxy_read_timeout 90;

            #設置代理服務器(nginx)保存用戶頭信息的緩衝區大小
            #設置從被代理服務器讀取的第一部分應答的緩衝區大小,通常情況下這部分應答中包含一個小的應答頭,默認情況下這個值的大小爲指令proxy_buffers中指定的一個緩衝區的大小,不過可以將其設置爲更小
            proxy_buffer_size 4k;

            #proxy_buffers緩衝區,網頁平均在32k以下的設置
            #設置用於讀取應答(來自被代理服務器)的緩衝區數目和大小,默認情況也爲分頁大小,根據操作系統的不同可能是4k或者8k
            proxy_buffers 4 32k;

            #高負荷下緩衝大小(proxy_buffers*2)
            proxy_busy_buffers_size 64k;

            #設置在寫入proxy_temp_path時數據的大小,預防一個工作進程在傳遞文件時阻塞太長
            #設定緩存文件夾大小,大於這個值,將從upstream服務器傳
            proxy_temp_file_write_size 64k;
        }
         
         
        #設定查看Nginx狀態的地址
        location /NginxStatus {
            stub_status on;
            access_log on;
            auth_basic "NginxStatus";
            auth_basic_user_file confpasswd;
            #htpasswd文件的內容可以用apache提供的htpasswd工具來產生。
        }
         
        #本地動靜分離反向代理配置
        #所有jsp的頁面均交由tomcat或resin處理
        location ~ .(jsp|jspx|do)?$ {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://127.0.0.1:8080;
        }
         
        #所有靜態文件由nginx直接讀取不經過tomcat或resin
        location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|
        pdf|xls|mp3|wma)$
        {
            expires 15d; 
        }
         
        location ~ .*.(js|css)?$
        {
            expires 1h;
        }
    }
}
######Nginx配置文件nginx.conf中文詳解#####

CoreModule核心模塊:

user www;                       #Nginx進程所使用的用戶
worker_processes 1;             #Nginx運行的work進程數量(建議與CPU數量一致或auto)
error_log /log/nginx/error.log  #Nginx錯誤日誌存放路徑
pid /var/run/nginx.pid          #Nginx服務運行後產生的pid進程號

events事件模塊:

events {            
    worker_connections  //每個worker進程支持的最大連接數
    use epool;          //事件驅動模型, epoll默認
}

http內核模塊:

//公共的配置定義在http{}
http {  //http層開始
...    
    //使用Server配置網站, 每個Server{}代表一個網站(簡稱虛擬主機)
    'server' {
        listen       80;        //監聽端口, 默認80
        server_name  localhost; //提供服務的域名或主機名
        access_log host.access.log  //訪問日誌
        //控制網站訪問路徑
        'location' / {
            root   /usr/share/nginx/html;   //存放網站代碼路徑
            index  index.html index.htm;    //服務器返回的默認頁面文件
        }
        //指定錯誤代碼, 統一定義錯誤頁面, 錯誤代碼重定向到新的Locaiton
        error_page   500 502 503 504  /50x.html;
    }
    ...
    //第二個虛擬主機配置
    'server' {
    ...
    }
    
    include /etc/nginx/conf.d/*.conf;  //包含/etc/nginx/conf.d/目錄下所有以.conf結尾的文件

}   //http層結束
7. 默認web站點的配置
# 切換到配置文件所在目錄
[root@instance-mtfsf05r ~]# cd /usr/local/nginx-16/conf/
# 編輯nginx配置文件
[root@instance-mtfsf05r conf]# vim nginx.conf
# 找到http中的server裏面的location模塊,可以配置網站根目錄爲其它目錄
location / {
            root   html; #html爲網站根目錄
            index  index.html index.htm; #指定網站首頁文件
        }

配置文件中一些常見參數的解釋:

# nginx是c寫的
#user  nobody;
#表示兩個進程,官方推薦根據cpu核數,我的雲主機是兩核,通過top然後按1可查看機器核數
worker_processes  2;

#error_log是記錄錯誤日誌的,原來是關閉的,我們這裏可以打開
error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#nginx的進程id
#pid        logs/nginx.pid;

#worker_connections:可連接數
events {
    worker_connections  1024;
}

#web服務器的配置都在http裏
http {
    include       mime.types;
    default_type  application/octet-stream;
    #日誌格式,$http_x_forwarded_for是:用於抓取爬蟲,爬蟲使用了代理,不知道你真實的ip,這個參數可以獲取真實的ip
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    #長鏈接超時
    keepalive_timeout  65;
    #支持文件傳輸的時候進行壓縮,傳輸效率提高
    #gzip  on;
    #虛擬主機標籤段
    server {
        #端口
        listen       80;
        #域名
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
        #url路徑匹配
        location / {
            #網站根目錄是html目錄
            root   html;
            #網站首頁文件頁
            index  index.html index.htm;
        }
        #錯誤頁面
        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}
8. nginx多虛擬主機

① 虛擬主機類型

  • 基於域名的虛擬主機:通過不同的域名區分不同的虛擬主機,是企業應用最廣的虛擬主機。
  • 基於端口的虛擬主機:通過不同的端口來區分不同的虛擬主機,一般用作企業內部網站,不對外直接提供服務的後臺
  • 基於ip的虛擬主機:通過不同的ip區分不同的虛擬主機,此類比較少見,一般業務需要多IP的常見都會在負載均衡中綁定VIP

② 多虛擬主機的配置
我們這裏做“基於域名的虛擬主機”,基於域名的虛擬主機可以幫助我們實現使用不同的域名訪問同一臺服務器的不同虛擬主機(端口都是80)獲取不同的資源。也就是說你想在一臺服務器上做兩個網站以及多個網站都沒問題,這在企業中應用比較廣泛。並且相較於以前一個域名只能訪問一臺服務器有了很大進步,節省了資源和成本。

  • 配置兩臺虛擬主機
# 修改配置文件
[root@instance-mtfsf05r ~]# vim /usr/local/nginx-16/conf/nginx.conf
# 再增加一個server標籤,並且修改server_name對應的域名:
 server{
        listen       80;
        server_name  www.thanlon.cn;
        location / {
                root /opt/nginx/thanlon/;
                index  index.html index.htm;
        }
    }
 server{
        listen       80;
        server_name  www.kiku.cn;
        location / {
                root /opt/nginx/kiku/;
                index  index.html index.htm;
        }
    }
# 創建虛擬主機的目錄
[root@instance-mtfsf05r ~]# mkdir -p /opt/nginx/{thanlon,kiku}
# 在thanlon和kiku文件夾創建index.html文件
[root@instance-mtfsf05r thanlon]# vim index.html
[root@instance-mtfsf05r kiku]# vim index.html
  • 找到本地主機的hosts文件(C:\Windows\System32\drivers\etc)進行強制域名解析:
# linux桌面系統(ubuntu linux等)的用戶同理找到系統裏的hosts文件(/etc/hosts)
# 在文件末尾追加下面兩行,這樣訪問這兩個域名就直接解析到106.12.115.101
106.12.115.101 www.thanlon.cn 
106.12.115.101 www.kiku.cn

直接在本地訪問這兩個站點:
在這裏插入圖片描述
在這裏插入圖片描述

如果你的域名是公網域名,並且已經解析到你的雲服務器,不要在本地做強制解析,直接訪問你的域名即可。

9. nginx訪問日誌

日誌功能對每個用戶訪問網站的日誌信息記錄到指定的日誌文件中,開發運維人員可以分析用戶的瀏覽器行爲。此功能由ngx_http_log_module模塊負責,將配置文件中的下面四行的註釋去掉,開啓訪問日誌功能:

 log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                   '$status $body_bytes_sent "$http_referer" '
                   '"$http_user_agent" "$http_x_forwarded_for"';

 access_log  logs/access.log  main;

參數的解析:

$remote_addr    記錄客戶端ip
$remote_user    遠程用戶,沒有就是 “-”
$time_local    對應[14/Aug/2018:18:46:52 +0800]
$request     對應請求信息"GET /favicon.ico HTTP/1.1"
$status      狀態碼
$body_bytes_sent  571字節 請求體的大小
$http_referer  對應“-”  由於是直接輸入瀏覽器就是 -
$http_user_agent  客戶端身份信息
$http_x_forwarded_for  記錄客戶端的來源真實ip 97.64.34.118

可以通過配置好的域名訪問虛擬主機,使用tail -f access.log命令來監控日誌文件的變化:

# 監控日誌文件
[root@instance-mtfsf05r logs]# tail -f access.log 
# 可以看到訪問記錄
122.96.44.251 - - [06/Oct/2019:08:30:37 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "-"
122.96.44.251 - - [06/Oct/2019:08:30:49 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "-"
# 訪問記錄解析
122.96.44.251:訪問機器的ip
[06/Oct/2019:08:30:37 +0800]:訪問時間
"GET / HTTP/1.1":請求的方式,請求的資源(根路徑)、http協議
304:狀態碼
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36":客戶端信息(User-Agent)
"-":表示沒有使用代理,如果用戶使用代理,這裏會顯示用戶真實ip
10. 限制網站來源ip訪問

如果nginx很慢,或者在檢查訪問日誌的時候,看到有人惡意請求你的網站資源。可以查看訪問日誌中,找到這個ip進行限制。

location / {
			# 限制122.96.44.251訪問此站點
            deny 122.96.44.251;
            root   html;
            index  index.html index.htm;
        }

還可以限制訪問允許某ip段訪問:

location / {
			# 允許某ip段訪問此站點
			allow 10.1.1.0/16;  
            root   html;
            index  index.html index.htm;
        }

也可以禁止某ip或ip段訪問服務器指定的資源:

# 禁止訪問/images資源
location /images {
			deny 122.96.44.251;
			#alias /opt/nginx1-12/html/images;
			allow 10.1.1.0/16;  
}

ip被限制後訪問到的頁面是這樣的:
在這裏插入圖片描述

11. nginx錯誤頁面優化

爲了增強用戶的體驗效果,可以對一系列錯誤頁面進行優化,可通過nginx配置文件完成:

error_page 400 403 404 405 /40x.html;
# redirect server error pages to the static page /50x.html
error_page   500 502 503 504  /50x.html;
location = /50x.html {
	root   html;
}
12. 正向代理

正向代理等同於代理,舉個例子:用戶不能訪問一個網站,例如google。然後想着通過連接一個可以訪問google的代理服務器,讓這個代理服務器會幫助用戶去google的服務器請求資源,然後把資源返回給我,這就是屬於正向代理。
在這裏插入圖片描述
正向代理的實際應用是公司職員在公司辦公時通過vpn代理ip連接外網,在家的時候也可以使用這個代理ip連接公司的內網環境。

13. 反向代理

來談反向代理,對於用戶而言,反向代理服務器就像是原始服務器,用戶並不知道資源來自哪裏。但是,用戶只要通過這個反向代理服務器就可以訪問到我們想要的資源,反向代理服務器可以保護和隱藏原始資源服務器。
在這裏插入圖片描述

下面簡單敘述一個反向代理的過程:

1、用戶向www.blueflags.cn/login 發送一個登錄的請求,需要先到nginx服務器,告訴nginx我的“登錄”請求
2、nginx作爲一箇中間代理,不做用戶請求的處理,把請求直接拋給web應用服務器django
3、django收到用戶的請求並處理請求後返回請求給nginx
4、nginx返回處理完畢好的數據,返回給用戶(瀏覽器)
5、客戶的瀏覽器得到這個返回結果進行展示給用戶

nginx實現負載均衡的組件:ngx_http_proxy_module proxy代理模塊,用於把請求拋給服務器節點或者upstream服務器池

14. 反向代理的實現

實現的目標:向本地nginx服務器發送請求,本地nginx服務器不處理請求,把請求直接轉交給www.baidu.com的服務器。www.baidu.com的服務器返回結果給本地的nginx服務器,本地nginx服務器再把結果返回到瀏覽器。

首先在本地安裝nginx並配置反向代理:

# 更新apt源
thanlon@plus-book:~$ sudo apt update
# 安裝nginx
thanlon@plus-book:~$ sudo apt install nginx
# 安裝後默認是啓動的狀態,可以查看nginx進程(因爲nginx默認配置進程數是自動的,我的電腦是八核,也就開了8個nginx進程)
thanlon@plus-book:~$ ps -ef |grep nginx
root     19853  1230  0 13:29 ?        00:00:00 nginx: master process nginx
www-data 19854 19853  0 13:29 ?        00:00:00 nginx: worker process
www-data 19855 19853  0 13:29 ?        00:00:00 nginx: worker process
www-data 19856 19853  0 13:29 ?        00:00:00 nginx: worker process
www-data 19857 19853  0 13:29 ?        00:00:00 nginx: worker process
www-data 19858 19853  0 13:29 ?        00:00:00 nginx: worker process
www-data 19859 19853  0 13:29 ?        00:00:00 nginx: worker process
www-data 19860 19853  0 13:29 ?        00:00:00 nginx: worker process
www-data 19861 19853  0 13:29 ?        00:00:00 nginx: worker process
thanlon  19864  5276  0 13:29 pts/2    00:00:00 grep --color=auto nginx
# 切換到/etc/nginx/conf.d目錄
thanlon@plus-book:/etc/nginx$ cd /etc/nginx/conf.d/
# 新建一個nginx配置文件,文件只要以.conf結尾即可
thanlon@plus-book:/etc/nginx/conf.d$ sudo vim nginx.conf
# 在配置文件寫入下面的內容
server{
        listen 80;
        server_name xxx;
        location /{
        		#proxy_pass參數指定了轉交處理請求的ip
                proxy_pass http://www.baidu.com;
        }
}
# 爲了使配置文件生效,還要修改主配置文件/etc/nginx/nginx.conf
thanlon@plus-book:/etc/nginx$ vim nginx.conf
# 把下面一行註釋掉,表示不使用默認的配置,這樣nginx便成功將請求轉發到百度
include /etc/nginx/sites-enabled/*;

當在瀏覽器輸入localhost或127.0.0.1的時候,會看到www.baidu.com返回的結果。

15. 項目發佈

① 項目發佈需要用到的軟件
django項目發佈使用的軟件有:CentOS7、Nginx、uWSGI、Virtualenv、Supervisor。使用CentOS系統這沒什麼多說的;使用的Nginx是爲了做反向代理,也沒什麼多說的。下面主要介紹爲什麼要使用uWSGI、Virtualenv、Supervisor。

② 爲什麼要使用uWSGI
uWSGI是一個全功能的http服務器,實現了WSGI協議、uwsgi協議、http協議等。使用uWSGI是因爲它可以把http協議轉化成語言支持的協議,比如把http協議轉換爲WSGI協議讓python可以直接使用。Python Web服務器開發使用的WSGI(Web Server Gateway Interface)協議,Python Web項目默認會生成一個wsgi.py文件。但在生產環境中使用的是uWSGI,uWSGI實現了WSGI所有接口,是用C語言編寫的,所以它是一個效率很高的Web服務器。

③ 爲什麼要使用virtualenv
使用virtualenv可以構建一個乾淨的、隔離的Python解釋器環境,可以防止軟件依賴衝突等問題,非常建議使用。

④ 爲什麼要使用Supervisor
Supervisor是Python開發的一個C/S服務,是Linux系統下的遠程管理工具,它不支持window系統。它可以很方便地監聽、啓動、停止一個或多個進程。使用Supervisor管理進程,當一個進程被意外殺死後,Supervisor監聽到進程死掉,會里立即將它重新拉起,很方便做到自動恢復的功能,不再需要寫shell腳本來控制。

⑤ 使用python解釋器運行django程序

# 進入venv虛擬環境
[root@master ~]# workon venv
# 安裝django程序
(venv) [root@master mysite]#  pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple django==2.1.12
# 切換到venv虛擬環境目錄
(venv) [root@master ~]# cdvirtualenv
# 創建django項目
(venv) [root@master venv]# django-admin startproject mysite
# 修改配置文件,讓所有ip都可以訪問
(venv) [root@master venv]# vim mysite/mysite/settings.py
ALLOWED_HOSTS = ['*']
# 切換到mysite目錄
(venv) [root@master venv]# cd mysite/
# 啓動django程序
(venv) [root@master mysite]# python manage.py runserver 0.0.0.0:8000
# 查看運行的python進程
[root@master ~]# ps -ef|grep python
root       885     1  0 1005 ?      00:00:17 /usr/bin/python2 -Es /usr/sbin/tuned -l -P
root      5261  3823  0 22:40 pts/0    00:00:00 python manage.py runserver 0.0.0.0:8000
root      5263  5261  1 22:40 pts/0    00:00:06 /root/Envs/venv/bin/python manage.py runserver 0.0.0.0:8000
root      5879  5767  0 22:49 pts/1    00:00:00 grep --color=auto python

⑥ 使用uWSGI啓動一個Python Web服務(uwsgi是基於python的)

# 安裝uWSGI模塊
(venv) [root@master mysite]# pip install uwsgi
# 查看版本
(venv) [root@master mysite]# uwsgi --version
2.0.18
# 或者通過pip查看版本
(venv) [root@master mysite]# pip list
Package    Version
---------- -------
Django     2.1.12 
pip        19.2.3 
pytz       2019.2 
setuptools 41.2.0 
sqlparse   0.3.0  
uWSGI      2.0.18 
wheel      0.33.6
# 檢查uwsig是基於哪個python解釋器運行的
(venv) [root@master mysite]# uwsgi --python-version
3.7.3
# 當前所在目錄創建test_uwsgi.py文件,向代碼寫入下面的內容 
(venv) [root@master mysite]# ls
db.sqlite3  manage.py  mysite
(venv) [root@master mysite]# vim test_uwsgi.py
def application(env, start_response):
        start_response('200 OK', [('Content-Type','text/html')])
        return [b"Hello World, I am uwsgi....."]
 # 通過命令啓動這個文件
 (venv) [root@master mysite]# uwsgi --http :8001 --wsgi-file test_uwsgi.py

訪問8001端口:
在這裏插入圖片描述
⑦ 通過uwsgi啓動django項目

# 查看當前目錄下的資源
(venv) [root@master mysite]# ls
db.sqlite3  manage.py  mysite  test_uwsgi.py
# 通過wsgi其功django項目,mysite.wsgi指mysite目錄下的wsgi.py,這裏不用加.py
(venv) [root@master mysite]# uwsgi --http :9000 --module mysite.wsgi
# uwsgi熱加載python程序:不重啓項目生效。需要加上--py-autoreload=1
(venv) [root@master mysite]# uwsgi --http :9000 --module mysite.wsgi --py-autoreload=1
# 配置nginx,使用nginx轉發給本地9000端口處理請求
location / {
        proxy_pass http://0.0.0.0:9000;
        #root   html;
        #index  index.html index.htm;
 }

訪問9000端口後發現此時你的項目丟失靜態文件,因爲uwsgi不解析靜態文件配置,後面會通過nginx來解決這個問題。

⑧ 使用uWSGI配置文件啓動項目

# 查看uwsgi配置文件,這個配置文件內置在nginx
[root@master ~]# cat /usr/local/nginx-16/conf/uwsgi_params

uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;

# 配置nginx配置文件,需要結合uWSGI
  location / {
           include /usr/local/nginx-16/conf/uwsgi_params;
           uwsgi_pass 0.0.0.0:9000;
           #root   html;
           #index  index.html index.htm;
        }

啓動這個項目,注意不要使用下面這條命令:uwsgi --http :9000 --module mysite.wsgi --py-autoreload=1,雖然啓動不會處問題,但是訪問資源會出錯。否則會出現這樣的頁面:
在這裏插入圖片描述
這是uwsgi找不到9000口的錯誤5000錯誤,是服務器內部錯誤,原因是這裏不能使用的是http協議,uwsgi_pass識別不了這個協議,應該使用socket協議:

(venv) [root@master mysite]# uwsgi --socket :9000 --module mysite.wsgi --py-autoreload=1

正常訪問:
在這裏插入圖片描述
nginx有關uWSGI模塊的介紹:http://nginx.org/en/docs/http/ngx_http_uwsgi_module.html,示例程序:

Example Configuration:
location / {
   include    uwsgi_params;
    uwsgi_pass localhost:9000;
}

⑨ nginx解決uWSGI啓動django項目靜態文件丟失
啓動後django是有問題的,我們可以通過“右鍵”->“檢查”或者ctrl + shift +i,刷新網頁查看網絡資源,發現django中的靜態資源沒有找到:
在這裏插入圖片描述
使用nginx處理靜態頁面的資源:

# 編輯nginx配置文件

# 在server標籤段下添加下面的內容

# 
(venv) [root@master mysite]# vim /usr/local/nginx-16/conf/nginx.conf
location /static{
           # alias參數告訴靜態資源放在哪裏
           alias /opt/django/tmp/static/;
}

# 修改django的settings.py文件
(venv) [root@master mysite]# vim mysite/settings.py 
# 找到下面內容
Static files (CSS, JavaScript, Images)
https://docs.djangoproject.com/en/2.2/howto/static-files/

STATIC_URL = '/static/'
# 修改爲下面的內容
Static files (CSS, JavaScript, Images)
https://docs.djangoproject.com/en/2.2/howto/static-files/

STATIC_ROOT = '/opt/django/tmp/static/'
STATIC_URL = '/static/'
STATICFILES_DIRS=[
        os.path.join(BASE_DIR,'static')
]
# 收集所有的靜態文件保存到STATIC_ROOT對應的目錄中
(venv) [root@master mysite]# ls
db.sqlite3  manage.py  mysite  test_uwsgi.py
(venv) [root@master mysite]# mkdir static
(venv) [root@master mysite]# python manage.py collectstatic

119 static files copied to '/opt/django/tmp/static'.
# 進入到/root/static/django目錄下可以看到拷貝完成的靜態文件目錄
(venv) [root@master mysite]# cd /root/static/django/
(venv) [root@master django]# ls
admin
(venv) [root@master django]# cd admin/
(venv) [root@master admin]# ls
css  fonts  img  js
# 最後啓動項目
(venv) [root@master mysite]# uwsgi --socket :9000 --module mysite.wsgi --py-autoreload=1

靜態資源正常:
在這裏插入圖片描述
⑩ 配置啓動文件啓動django

# 創建uwsgi.ini的文件(在哪裏創建都可以)
(venv) [root@master mysite]# vim uwsgi.ini
# 在該文件中寫入下面的內容
[uwsgi]
#使用nginx連接時使用
socket=0.0.0.0:9000
#不用nginx直接當作web服務器使用
#http=0.0.0.0:9000
#項目目錄絕對路徑
chdir=/root/Envs/venv/mysite
#wsgi文件路徑,在項目底下
wsgi-file=mysite/wsgi.py
#指定解釋器目錄
home=/root/Envs/venv
processes=4
thread=2
master=True
pidfile=uwsgi.pid
# 啓動
(venv) [root@master mysite]# uwsgi --ini uwsgi.ini

正常訪問:
在這裏插入圖片描述
PS:使用supervisor管理進程

# 安裝supervisor
[root@master mysite]# pip3 install supervisor
# 通過命令生成supervisor的配置文件
[root@master mysite]# echo_supervisord_conf >/etc/supervisord.conf
# 編輯配置文件
[root@master mysite]# vim /etc/supervisord.conf
# 在該配置文件最下面追加以下內容,這是在配置文件寫入一個名爲“django_pro”的任務
[program:django_pro]
command=/root/Envs/venv/bin/uwsgi --ini /root/Envs/venv/mysite/uwsgi.ini
# 啓動supervisord
[root@master mysite]# supervisord -c /etc/supervisord.conf
# 通過服務端命令supervisord -c參數指明一個配置文件
root     21950     1  0 19:22 ?        00:00:00 /usr/local/python373/bin/python3.7 /usr/local/python373/bin/supervisord -c /etc/supervisord.conf
# 進入交互式環境,可以看到時正在運行的任務,以及任務的pid和運行了多久
[root@master mysite]# supervisorctl 
django_pro                       RUNNING   pid 21952, uptime 0:03:19
supervisor> 
# 停止這個任務
supervisor> stop django_pro
django_pro: stopped
# 開啓這個任務
supervisor> start django_pro
16. 設置nginx負載均衡池

nginx能夠支持高併發的集羣功能,主要是nginx使用輪訓算法和權重算法。輪訓算法使用nginx可以一個個轉交處理的請求 ,簡而言之,也就是如果web服務器掛掉,接着給下一個web服務器。權重算法,則是根據權重,改變轉交處理請求的順序。哪個web服務器權重大,優先把權重交給哪個。

# 將原來進行修改
  location / {
           include /usr/local/nginx/conf/uwsgi_params;
           uwsgi_pass 0.0.0.0:9000;
           #root   html;
           #index  index.html index.htm;
        }
 # 修改爲
 location / {
           include /usr/local/nginx/conf/uwsgi_params;
           uwsgi_pass django;
        }
 # 並在http內、server標籤外添加下面的內容(我把這段內容寫在server邊前段的上面了)
   upstream django{
        #0.0.0.0:90;
        server 0.0.0.0:9000 weight=10;
    }
    server {
        #端口
        listen       80;
        ……
17. ssl證書的安裝
1、將證書公鑰和證書私鑰上傳到服務器
thanlon@thanlon-master:~/下載/cert/Nginx$ scp 1_www.bysj39.com_bundle.crt 2_www.bysj39.com.key root@106.12.115.136:/home/thanlon/cert/39bysj
2、打開nginx安裝目錄下conf目錄中的nginx.conf文件
[root@master conf]# vim nginx.conf
3、找到被註釋掉的部分
 # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.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;
    #    }
    #}
4、修改nginx.conf,添加公鑰證書和證書密鑰
   #HTTPS server
    #
    server {
        listen       443 ssl;
        server_name  localhost;

        ssl_certificate      /home/thanlon/cert/39bysj/1_www.bysj39.com_bundle.crt; # 寫證書公鑰;
        ssl_certificate_key  /home/thanlon/cert/39bysj/2_www.bysj39.com.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;
        }
    }

可參考數安時代, Nginx SSL證書安裝指南:https://www.trustauth.cn/ssl-guide/676.html

18. nginx中遇到的問題

配置文件出現下面的錯誤:

nginx: [emerg] unknown directive "ssl_certificate" in /usr/local/nginx-16/conf/nginx.conf:124
[root@instance-mtfsf05r nginx-1.16.1]# ./configure --prefix=/usr/local/nginx-16/ --with-http_stub_status_module --with-http_ssl_module
[root@instance-mtfsf05r nginx-1.16.1]# make

如果出現下面的錯誤:

nginx: [emerg] invalid number of arguments in "ssl_certificate" directive in /usr/local/nginx/conf/n

看一下是不是分號沒有添加。

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