centos8中使用Nginx+Gunicorn部署Vue-cli+Django

  • 前面文章中環(huán)境都配置好了,現(xiàn)在是正餐了。
    為什么要使用gunicorn和nginx部署項目:
    1. 平時開發(fā)直接啟動項目,沒有任何配置依然可以訪問?
      因為djaong或者flask自帶了一個實現(xiàn)了WSGI協(xié)議的server 和 application, 各個web framework也基本上都有自己實現(xiàn)的WSGI server, 但這個server基本上只能用來調(diào)試,不能用于生產(chǎn)環(huán)境,性能沒保障。
      django 通過自帶的runserver (python manage.py runserver 0.0.0.0:8000)命令啟動,啟動文件地址:/Users/fxx/Study/Venv/Heat_venv/lib/python3.7/site-packages/django/core/management/commands/runserver.py 作為WSGI server的啟動入口,可從這里開始查看源代碼。
    1. gunicorn和uWSGI是實現(xiàn)了WSGI協(xié)議的web服務器
      uWSGI:是一個全功能的HTTP服務器,實現(xiàn)了WSGI協(xié)議、uwsgi協(xié)議、http協(xié)議等。
      用于接受http請求并轉換為WSGI協(xié)議,以供實現(xiàn)了WSGI協(xié)議的flask使用,并且gunicorn得益于gevent等技術,大幅度提高了性能,在生產(chǎn)環(huán)境以替代框架自帶的WSGI server。
      tornado之類的框架只支持單核,gunicorn可以提供多進程支持,提升多核服務器的處理性能。
  1. WSGI協(xié)議
    全稱Web Server Gateway Interface,WSGI是一種規(guī)范,用來描述web server如何與web application通信的規(guī)范。
    要實現(xiàn)WSGI協(xié)議,必須同時實現(xiàn)web server和web application,uWSGI和gunicorn都是實現(xiàn)了WSGI server協(xié)議的服務器,Django/Flask是實現(xiàn)了WSGI application協(xié)議的web框架,因此uWSGI 接收了http請求后轉化為WSGI協(xié)議,uWSGI便能和flask進行通信。
    WSGI協(xié)議的server: 是把HTTP協(xié)議轉化成支持的網(wǎng)絡協(xié)議。比如把HTTP協(xié)議轉化成WSGI協(xié)議,讓Python可以直接使用。
    總結:啰里八嗦一大堆,一句話還重復說幾次??傊褪菍崿F(xiàn)協(xié)議轉換,把接收到的http請求在內(nèi)部轉換成WSIG協(xié)議格式的請求,這樣應用就可以處理這些請求了。
    一般并發(fā)量不是特別高的情況下,使用gunicorn或者uWSGI部署項目就足夠了。
    二. 為什么還要加一成nginx?
  2. nginx也是一種web服務器,但功能和gunicorn/uWSGI有些差別
    nginx沒有實現(xiàn)WSGI協(xié)議,如果是nginx+flask的組合的話就必須使用框架自帶的WSGI server,性能渣。
    靜態(tài)文件支持,經(jīng)過配置之后,nginx可以直接處理靜態(tài)文件請求而不用經(jīng)過應用服務器,避免占用寶貴的運算資源;還能緩存靜態(tài)資源,使訪問靜態(tài)資源的速度提高。
    抗并發(fā)壓力??梢晕找恍┧矔r的高并發(fā)請求,讓nginx先保持住連接(緩存http請求),然后后端慢慢消化。如果讓Gunicorn直接提供服務,瀏覽器發(fā)起一個請求,鑒于瀏覽器和網(wǎng)絡情況都是未知的,http請求的發(fā)起過程可能比較慢,而Gunicorn只能等待請求發(fā)起完成后,才去真正處理請求,處理完成后,等客戶端完全接收請求后,才繼續(xù)下一個。
    HTTP 請求緩存頭處理得也比 gunicorn和uWSGI 完善。
    多臺服務器時,可以提供負載均衡和反向代理。
    大意如圖
    image.png

    原文鏈接:https://blog.csdn.net/Aifore/article/details/86703685
    1. 由于是前后端分離的項目,前端使用vue-cli,前端文件需要打包
      至于打包的注意問題:http://www.itdecent.cn/p/45acfd463347
      然后執(zhí)行:npm run build 會得到一個dist文件夾。打開index.html就可以看到頁面了
      我將dist文件copy到后端Django目錄下,然后再centos中做部署。
安裝gunicorn:pip install gunicorn(我在批量安裝包的時候已經(jīng)安裝上去了)

先試著運行一下,進入項目的根目錄(不是wsgi的同級目錄,是wsgi的上一層目錄),然后

  • 1.gunicorn -w 3 -b 127.0.0.1:8080 MOTTA_mall.wsgi:application 啟動成功
    -w workers:處理工作進程的數(shù)量
    -D --daemon: 守護進程后臺運行
    -b ADDRESS, --bind ADDRESS
    Gunicorn綁定服務器套接字,Host形式的字符串格式。Gunicorn可綁定多個套接字,如:gunicorn -b 127.0.0.1:8000 -b [::1]:9000 manager:app
    參數(shù)參考:https://www.cnblogs.com/zgcblog/p/10923913.html
  • 2.通過配置文件啟動,gunicorn -c gunicorn-config.py MOTTA_mall.wsgi:application

    還有更加復雜的,我是簡單的配置了下
    image.png

    啟動后:前端的項目是可以訪問了,就如訪問Django服務器一樣。但是要注意下

    1.前端項目的ip地址,是否在setting.py文件白名單中。
    2.關閉防火墻,不然會攔截(systemctl status firewalld.service查看狀態(tài),如果是開啟的,關閉它)
    OK,前端項目正常訪問。

安裝nginx:yum install nginx

yum 安裝的 nginx,通常 nginx 命令會位于 /usr/sbin目錄下。
which nginx cd 在目錄中
目錄中啟動:sudo nginx 然后直接在瀏覽器輸入服務器端地址,看到了啟動的頁面

image.png

Nginx配置文件詳解寫的很好:http://www.itdecent.cn/p/1593954d5faf
使用 SysV 腳本控制 nginx
使用官方 yum 源安裝的nginx已經(jīng)提供了 SysV 腳本,使用非常簡單
service nginx stop
service nginx start
service nginx restart
service nginx reload
service nginx status
參考:https://blog.csdn.net/qq_21465561/article/details/90747206
然后開始修改配置文件 find找到 /etc/nginx/nginx.conf
結果訪問403 emm...
網(wǎng)上找到4個方法,
步驟一:
檢查目錄權限。權限不足的就加個權限吧。
例子:chmod -R 755 / var/www
步驟二:
打開nginx.conf
例子:vim /etc/nginx/nginx.conf
把 user 用戶名 改為 user root 或 其它有高權限的用戶名稱即可
步驟三
如果是centos,看一下selinux是否關閉了
查看SELinux狀態(tài):
1、/usr/sbin/sestatus -v ##如果SELinux status參數(shù)為enabled即為開啟狀態(tài)
SELinux status: enabled
2、getenforce ##也可以用這個命令檢查
關閉SELinux:
修改配置文件需要重啟機器:
修改/etc/selinux/config 文件
將SELINUX=enforcing改為SELINUX=disabled
重啟機器即可
整完 OK
(關閉防火墻 開啟nginx和gunicorn)

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容