1. 程式人生 > >virtualvenv+django+uWSGI+nginx部署

virtualvenv+django+uWSGI+nginx部署

RoCE resources code control 安裝 dmi running uic webp

1. virtualvenv

2. django

3. uWSGI

4. nginx

1. virtualvenv

virtualvenv install

首先要安裝python3

因為系統已經裝了 python3.6 所以接下來直接裝虛擬環境 virtualvenv

mkdir yourwebproject folder
cd yourwebproject
/usr/python3.6/bin/python3.6 -m venv venv   #建立一個獨立於系統的虛擬環境 不會跟系統環境混淆
source venv/bin/activate                    #運行環境
deactivate                                  #退出環境

2. django

  • 運行虛擬環境,在環境中安裝django
pip install django
  • 新建項目
   1). django-admin startproject proName        
   2). cd proName
   3). python manage.py runserver   # run
  • 新建app
    不用也可以進行接下來的操作

3. uWSGI

官網: https://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html#installing-uwsgi-with-python-support

安裝

在虛擬環境中

pip install uwsgi

檢測 uwsgi 是否正常工作

  • 在與venv同目錄下寫一個模擬站點文件 test.py
# test.py
def application(env, start_response):
    start_response(‘200 OK‘, [(‘Content-Type‘,‘text/html‘)])
    return [b"Hello World"]     # python3
  • 運行
uwsgi --http :8080 --wsgi-file test.py  # 假設訪問端口號8080
  • 瀏覽器訪問
http://serverIP:8080

若顯示站點文件中的輸出,說明uwsgi生效

路徑 web client <-> uwsgi <-> python

部署 django

  • 首先運行django確保django能正常工作
python manage.py runserver 0.0.0.0:8000
  • 在manage.py同級目錄下運行
uwsgi --http :8080 --module djangoProName.wsgi

--module djangoProName.wsgi 代表 djangoProName 目錄下的 wsgi.py 文件

  • 瀏覽器訪問
http://serverIP:8080

4. uWSGI

官網: https://www.nginx.com/resources/wiki/start/topics/tutorials/install/

不在虛擬環境中安裝
由於服務器上已經安裝了 nginx 所以安裝步驟省略,只需要在 nginx.conf 中添加配置即可。

  • 配置 nginx

nginx.conf 結構:

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 768;
}

http {
   # server{ ... }
}

添加 server

   server {
        listen       98 default_server;   # 訪問時輸入的端口 本地和外部瀏覽器後面都要加這個端口號
        server_name  10.41.95.85;          # 自己網站的域名

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
        
        location / {                      # location : 文件系統配置 去應答一些要服務器資源的請求
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:9898;    # 與ini文件對接端口 與上面的 93 端口沒有關系
        }
    }
  • 配置 uwsgi

將配置項全部寫入ini文件
在venv同目錄下自己新建uwsgi的ini文件

[uwsgi]
socket = 127.0.0.1:9898                               ; 與 nginx 對接 IP
; django pro dir
chdir = /root/Odin/TrackManagement/TrackManagement/   ; django project dir
wsgi-file = TrackManagement/wsgi.py                   ; 代表 TrackManagement 目錄下的 wsgi.py 文件
; module = TrackManagement.wsgi                       ; 有上面的wsgi配置這個就不用寫了

processes = 2                                         ; 進程
threads = 1                                           ; 線程
stats = 127.0.0.1:9696                                ; 內部配置訪問ip 與socket區別開
  • 瀏覽器訪問
http://10.41.95.85:98

若顯示django畫面 則 uwsgi+nginx生效

路徑 web client <-> nginx <-> uwsgi <-> django


接下來是過程中踩的坑

uwsgi: unrecognized option ‘--http:8089‘ ```(venv) [root@localhost TrackManagement]# uwsgi --http:8089 --module TrackManagement.wsgi uwsgi: unrecognized option ‘--http:8089‘ getopt_long() error ```
#### 原因:
參數格式不對 :8089前面要加空格 uwsgi還在開啟
uwsgi: unrecognized option ‘--http‘ ``` (venv) [root@localhost TrackManagement]# uwsgi --http:8089 --module TrackManagement.wsgi uwsgi: unrecognized option ‘--http‘ getopt_long() error ```
#### 原因:
uwsgi還在開啟 先殺了進程再重啟
uwsgi trkMngm_uwsgi.ini -> invalid request block size: 21573 (max 4096)...skip 啟動了之後每次訪問 ``` *** Stats server enabled on 127.0.0.1:9295 fd: 12 *** invalid request block size: 21573 (max 4096)...skip invalid request block size: 21573 (max 4096)...skip invalid request block size: 21573 (max 4096)...skip invalid request block size: 21573 (max 4096)...skip invalid request block size: 21573 (max 4096)...skip invalid request block size: 21573 (max 4096)...skip invalid request block size: 21573 (max 4096)...skip invalid request block size: 21573 (max 4096)...skip invalid request block size: 21573 (max 4096)...skip invalid request block size: 21573 (max 4096)...skip invalid request block size: 21573 (max 4096)...skip invalid request block size: 21573 (max 4096)...skip invalid request block size: 21573 (max 4096)...skip invalid request block size: 21573 (max 4096)...skip invalid request block size: 21573 (max 4096)...skip invalid request block size: 21573 (max 4096)...skip invalid request block size: 21573 (max 4096)...skip invalid request block size: 21573 (max 4096)...skip invalid request block size: 21573 (max 4096)...skip invalid request block size: 21573 (max 4096)...skip ```
#### 原因:
trkMngm_uwsgi.ini 文件中有設置nginx的socket
這時候nginx還沒加上 所以會有這個錯誤
ModuleNotFoundError: No module named ‘TrackManagement/TrackManagement/wsgi‘ ``` (venv) [root@localhost TrackManagement]# uwsgi --http :8089 --module TrackManagement/TrackManagement/wsgi.py *** Starting uWSGI 2.0.18 (64bit) on [Tue Feb 19 11:33:20 2019] *** compiled with version: 4.8.5 20150623 (Red Hat 4.8.5-36) on 18 February 2019 05:28:03 os: Linux-3.10.0-957.1.3.el7.x86_64 #1 SMP Thu Nov 29 14:49:43 UTC 2018 nodename: localhost.localdomain machine: x86_64 clock source: unix pcre jit disabled detected number of CPU cores: 4 current working directory: /root/Odin/TrackManagement detected binary path: /root/Odin/TrackManagement/venv/bin/uwsgi uWSGI running as root, you can use --uid/--gid/--chroot options *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** *** WARNING: you are running uWSGI without its master process manager *** your processes number limit is 63229 your memory page size is 4096 bytes detected max file descriptor number: 1024 lock engine: pthread robust mutexes thunder lock: disabled (you can enable it with --thunder-lock) uWSGI http bound on :8089 fd 4 spawned uWSGI http 1 (pid: 33181) uwsgi socket 0 bound to TCP address 127.0.0.1:33454 (port auto-assigned) fd 3 uWSGI running as root, you can use --uid/--gid/--chroot options *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** Python version: 3.6.4 (default, Mar 6 2018, 13:19:57) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] *** Python threads support is disabled. You can enable it with --enable-threads *** Python main interpreter initialized at 0x12acbf0 uWSGI running as root, you can use --uid/--gid/--chroot options *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** your server socket listen backlog is limited to 100 connections your mercy for graceful operations on workers is 60 seconds mapped 72920 bytes (71 KB) for 1 cores *** Operational MODE: single process *** ModuleNotFoundError: No module named ‘TrackManagement/TrackManagement/wsgi‘ unable to load app 0 (mountpoint=‘‘) (callable not found or import error) *** no app loaded. going in full dynamic mode *** uWSGI running as root, you can use --uid/--gid/--chroot options *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** *** uWSGI is running in multiple interpreter mode *** spawned uWSGI worker 1 (and the only) (pid: 33180, cores: 1) ```
#### 原因: 應該在TrackManagement項目裏面運行 即這個目錄下面
``` (venv) [root@localhost TrackManagement]# ls db.sqlite3 manage.py testUwsgi.py TrackManagement ```
runserver運行django error : Bad Request ``` (venv) [root@localhost TrackManagement]# python manage.py runserver 0.0.0.0:8080 Performing system checks... System check identified no issues (0 silenced). You have 15 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. Run ‘python manage.py migrate‘ to apply them. February 18, 2019 - 07:47:25 Django version 2.1.7, using settings ‘TrackManagement.settings‘ Starting development server at http://0.0.0.0:8080/ Quit the server with CONTROL-C. Invalid HTTP_HOST header: ‘10.41.95.85:8080‘. You may need to add ‘10.41.95.85‘ to ALLOWED_HOSTS. Bad Request: / [18/Feb/2019 07:47:51] "GET / HTTP/1.1" 400 60826 Invalid HTTP_HOST header: ‘10.41.95.85:8080‘. You may need to add ‘10.41.95.85‘ to ALLOWED_HOSTS. Bad Request: /favicon.ico [18/Feb/2019 07:47:54] "GET /favicon.ico HTTP/1.1" 400 60906 ```
#### solution
django setting.py
``` ALLOWED_HOSTS = [‘*‘] -> ALLOWED_HOSTS = [‘*‘] ```
manage.py語法錯誤 ``` SyntaxError: invalid syntax [root@localhost TrackManagement]# python manage.py runserver 0.0.0.0:8080 File "manage.py", line 14 ) from exc ```
##### solution
沒有運行虛擬環境 外面的環境是python 虛擬環境才是python3 所以會有語法錯誤

virtualvenv+django+uWSGI+nginx部署