1. 程式人生 > >CentOS-7 部署Django----部署Django步驟

CentOS-7 部署Django----部署Django步驟

修改 yacc 技術分享 更新 ESS systemd rep 安裝nginx strong

CentOS-7 部署Django----部署Django步驟

前言:

  網上找了好些資料進行學習怎麽樣部署Django,折騰了幾天,頭昏腦脹,始終沒有成功;

  偶然在Youtube上看到了2016年10月29日發布的一個視頻,順著該作者的步驟做下來,就成功的部署了,在此非常感謝!

  視頻鏈接:https://www.youtube.com/watch?v=DzXCHAuHf0I;

  因為記錄是順著視頻作者的操作順序,中間會有報錯問題和解決,並且每一步操作都寫了,所以有點啰嗦;

一、環境:

  默認目前CentOS-7服務器已經安裝好了Python3,項目所需的數據庫及其他,沒有安裝的可以看前面已發布的安裝方法;

二、創建虛擬環境:

  管理Django項目,可以創建一個虛擬環境,與其他代碼分隔開來;

  將虛擬環境創建在 /opt 目錄下:

    # cd /opt

    # mkdir python3-virtual-env

    # cd python3-virtual-env

    # python3.6 -m venv shop     # 創建Python3.6的虛擬環境,並將虛擬環境目錄命名為shop;

    # source shop/bin/activate     # 進入虛擬環境;

    # pip install uwsgi # 在虛擬環境下安裝uwsgi;

    # pip install -r requirements.txt   # 批量安裝項目依賴的庫,txt文件可使用 pip install > requirements.txt 得到,再上傳到服務器使用;

    # deactivate             # 退出虛擬環境命令;

三、安裝Nginx:

  此時,退出虛擬環境,開始安裝Nginx,視頻中使用的源為yum的repolist,我看了下,截至2018-07-23,其中的Nginx版本為1.12版本;

  我按照前面發布的安裝方法,安裝了Nginx-1.14,也是截至2018-07-23的穩定版的最高版號;

四、設置Nginx:

    # cd /etc/nginx

    # vim nginx.conf  # 這一步是進去註釋掉其中的server參數內容,但在1.14版本中不存在,而1.12版本中有;

    # cd /conf.d

    # vim virtual.conf   # 創建新文件,並且寫入以下內容

 1 server {
 2     listen 80;
 3     server_name 152.95.22.30;  # 你的服務器IP地址,或者域名,示例中我胡寫的
 4     error_log /srv/site/shopping_mail/logs/error.log;  # django項目的error日誌路徑
 5     access_log /srv/site/shopping_mail/logs/access.log;  # django項目的access日誌路徑
 6     charset utf-8;
 7 
 8     location /static/ {
 9         alias /srv/site/shopping_mail/static/;  # django項目的靜態資源路徑
10     }
11     
12     location /media/ {
13         alias /srv/site/shopping_mail/media/;  # django項目的media路徑
14     }
15 
16     location / {
17         uwsgi_pass unix:/opt/uwsgi/sock/shopping_mail.sock;  # django 項目經過的??路徑。。。這裏有點沒搞懂
18         include uwsgi_params;
19     }
20 }

五、上傳Django項目代碼:

  根據上面配置的nginx中的參數,將django項目代碼放置在 /etc/site 目錄下

    # cd /etc

    # mkdir site

    # cd site

    # cd shopping_mail  # 此時已經使用WinSCP上傳了項目,進入項目根目錄

    # mkdir logs  # 下面四步,按照配置的nginx參數來做的,創建logs

    # cd logs

    # vim error.log

    # vim access.log

    # cd /etc/site  # 在site目錄下,進行授權

    # chown nginx:nginx -R shopping_mail/

    # systemctl start nginx  # 開啟nginx服務,瀏覽器訪問服務器IP,得到502頁面

    # systemctl stop nginx  # 關閉nginx服務

六、配置uwsgi相關:

  1、切換到 /etc 目錄下,創建uwsgi目錄,在uwsgi目錄下,創建emperor.ini文件:

    # cd /etc

    # mkdir uwsgi

    # cd uwsgi

    # vim emperor.ini

  寫入:

1 [uwsgi]
2 emperor = /etc/uwsgi/vassals
3 uid = uwsgi
4 pid = uwsgi
5 logto = /etc/uwsgi/log  #設置uwsgi的日誌文件

  2、根據上面配置的參數,在uwsgi目錄下,創建vassals目錄;

    在vassals目錄下,創建shopping_mail.ini文件;

    # mkdir vassals

    # cd vassals

    # vim shopping_mail.ini

  寫入:

1 http = :8000
2 socket = /opt/uwsgi/sock/shopping_mail.sock
3 chdir = /srv/site/shopping_mail  # 指明項目地址
4 pythonpath = /srv/site/shopping_mail/shopping_mail  # 指明項目
5 home = /opt/python3-virtual-env/shop  # 指明項目的虛擬環境地址
6 module = shopping_mail.wsgi  # 指明uwsgi使用項目的wsgi文件
7 uid = uwsgi
8 chmod-socket = 664
9 chown-socket = uwsgi

  3、進入 /etc/systemd/system 目錄下,創建uwsgi.server文件:

    # cd /etc/systemd/system

    # vim uwsgi.server

  寫入:

 1 [Unit]
 2 Descroption=uWSGI Emperor
 3 After=syslog.target
 4 
 5 [Service]
 6 ExecStart=/opt/python3-virtual-env/shop/bin/uwsgi --ini /etc/uwsgi/emperor.ini  # 開啟服務執行的命令
 7 ExecStop = kill -INT cat /run/uwsgi.pid
 8 ExecReload = kill -TERM cat /run/uwsgi.pid
 9 Restart = always
10 Type = notify
11 NotifyAccess = main
12 PIDFile = /run/uwsgi.pid
13 
14 [Install]
15 WantedBy=multi-user.target

  保存後,啟動uwsgi服務:

    # systemctl start uwsgi

  但是失敗了,查看uwsgi的日誌,

    # vim /etc/uwsgi/log

     技術分享圖片  

  解決方法:

    # useradd -s /bin/false -r uwsgi

  然後根據之前配置的nginx的最後一個location參數,在/opt目錄下創建sock目錄,並且做授權

    # mkdir sock

    # chown uwsgi:uwsgi sock/

  在開啟uwsgi服務,開啟成功

  註:此處雖然開啟成功,但是其實這一步是錯誤的,按照nginx的最後一個location參數;

    應該在/opt下創建uwsgi目錄,uwsgi目錄下再創建sock目錄,並授權;

  

  4、此時,瀏覽器刷新,還是失敗的502頁面

  進入項目下的logs目錄,查看error.log

    # vim error.log

    技術分享圖片

  此處就是上面紅色標註說的,創建錯誤了

  解決方法:

    # cd /opt

    # rm -rf sock/

    # mkdir uwsgi

    # cd uwsgi

    # mkdir sock

    # cd opt

    # chown uwsgi:uwsgi -R uwsgi/

  重啟uwsgi和nginx服務,發現網頁刷新還是502頁面

  5、因為報錯,所以進入虛擬環境,直接使用uwsgi命令進行開啟uwsgi服務:

    # source /opt/python3-virtual-env/shop/bin/activate

    # cd /opt/python3-virtual-env/shop/bin

    # uwsgi --ini /etc/uwsgi/vassals/shipping_mail.ini

  出現錯誤:

    技術分享圖片

  地址被占了,這是因為uwsgi服務已經在運行了,再操作uwsgi命令開啟服務,就被占了,要先關掉

  使用 # ps -Ac | grep uwsgi 可以看到uwsgi服務占用的端口:

    技術分享圖片

   關閉uwsgi服務:

    # systemctl stop uwsgi

    # uwsgi --ini /etc/uwsgi/vassals/shipping_mail.ini

   uwsgi開啟正常,刷新瀏覽器,但是還是502頁面

  繼續查看error.log日誌

  切換到 /opt/uwsgi/sock 目錄下,查看詳細信息:

    # cd /opt/uwsgi/sock

    # ls -l

    技術分享圖片

   可以看到shopping_mail.sock文件的所屬組是root,此地應該是nginx的!

  先修改sock的文件屬性:

    # chown -R uwsgi:nginx sock/

    # cd sock

    # chown uwsgi:nginx shopping_mail.sock

    # systemctl restart uwsgi

刷新瀏覽器,會看到你的Django首頁了。此時部署成功!

但是經過實際操作,會出現一個麻煩:

  在每次重啟服務器,或者重啟uwsgi服務後,shopping_mail.sock文件的所屬組就變成了root了。需要重新修改,略麻煩。等有解決方法更新

  

CentOS-7 部署Django----部署Django步驟