lunix部署django(gunicorn)

前提更要

項目在本地已完成大框架開發,預想着能部署到公共lunix服務器上,

環境配置

特意找了一臺沒有在使用的lunix服務器,集成部同事幫忙重新安裝了較爲新版的lunix,並安裝了python3.7及django3:

  1. 項目代碼遷移 在lunix下新建一個文件夾project用來存在django項目代碼,把在本地開發的代碼直接放到project文件夾下.
  2. 採用django自帶調試模式啓動,發現無法在本地瀏覽器上訪問lunix服務器上的項目;
  3. 集成同事及本人自行百度,發現 runserver 是開發測試環境下用來啓動django項目的方式,所以django提供配置文件配置的。用的話得配合uwsgi或者gunicorn這個插件去使用。參考文章這裏的3、4節的內容,這樣就能配置網絡層的一些東西。

Nginx(暫時不使用)

Nginx安裝可參考文章:Nginx 服務器安裝及配置文件詳解
安裝服務器爲lunix,常用開啓、關閉、重啓命令如下:

配置文件:/etc/nginx/nginx.conf
啓動nginx: sudo nginx
測試配置: sudo nginx -t
重載nginx: sudo nginx -s reload
停止nginx:sudo nginx -s stop

gunicorn

cd到django項目根目錄下,執行如下命令:
pip3 install gunicorn
在這裏插入圖片描述
如若安裝錯了路徑,可執行卸載:
在這裏插入圖片描述
如下

[appsrv@localhost ~]$ pip3 uninstall gunicorn
Found existing installation: gunicorn 20.0.4
Uninstalling gunicorn-20.0.4:
  Would remove:
    /home/appsrv/.local/bin/gunicorn
    /home/appsrv/.local/lib/python3.7/site-packages/gunicorn-20.0.4.dist-info/*
    /home/appsrv/.local/lib/python3.7/site-packages/gunicorn/*
Proceed (y/n)? ye^H
Your response ('ye\x08') was not one of the expected responses: y, n
Proceed (y/n)? y
  Successfully uninstalled gunicorn-20.0.4
[appsrv@localhost ~]$ 

然後重新cd到項目根目錄下,執行安裝命令:pip3 install gunicorn
由於上一次安裝gunicorn已自動下載了gunicorn 20.0.4- py2. py3- none any .whl文件,故此時安裝不再重複下載,直接使用原本已下載的whl安裝。

[appsrv@localhost ~]$ cd project/ManagerPlan
[appsrv@localhost ManagerPlan]$ pip3 install gunicorn
Defaulting to user installation because normal site-packages is not writeable
Collecting gunicorn
  Using cached gunicorn-20.0.4-py2.py3-none-any.whl (77 kB)
Requirement already satisfied: setuptools>=3.0 in /usr/local/python3/lib/python3.7/site-packages (from gunicorn) (39.0.1)
Installing collected packages: gunicorn
Successfully installed gunicorn-20.0.4
[appsrv@localhost ManagerPlan]$ 

在這裏插入圖片描述

修改配置,重啓nginx(暫時不使用)

配置nginx
修改配置文件:/etc/nginx/nginx.conf
如下:
在這裏插入圖片描述
重啓nginx命令:

sudo service nginx reload

如果提示:

[appsrv@localhost ManagerPlan]$ sudo nginx -s reload
[sudo] appsrv 的密碼:
nginx: [error] open() "/run/nginx.pid" failed (2: No such file or directory)
[appsrv@localhost ManagerPlan]$ sudo nginx
[appsrv@localhost ManagerPlan]$ 

則說明nginx沒有啓動,重新啓動即可。啓動命令:sudo nginx

備註:如果你是root賬號登錄,重啓還可以用這個命令:

sudo service nginx reload

如果非root賬號,用此命令執行時會報錯:

對不起,用戶 appsrv 無權以 root 的身份在 localhost.localdomain 上執行 /sbin/service nginx reload。

gunicorn啓動、關閉、重啓

1、gunicorn開啓
在項目的根目錄下,輸入下方的代碼。

gunicorn --bind unix:/tmp/域名.socket projectname.wsgi:application

例如我使用的:

gunicorn -b 192.168.101.240:8002 ManagerPlan.wsgi:application

2、查詢
首先執行如下命令獲取Gunicorn進程:

ps -ef|grep gunicorn

執行後如下:

[appsrv@localhost ~]$ ps -ef|grep gunicorn
appsrv    9781     1  0 4月21 ?       00:01:07 /usr/local/python3/bin/python3.7 /home/appsrv/.local/bin/gunicorn ManagerPlan.wsgi
appsrv    9803  9781  0 4月21 ?       00:00:07 /usr/local/python3/bin/python3.7 /home/appsrv/.local/bin/gunicorn ManagerPlan.wsgi
appsrv   10498     1  0 4月22 ?       00:00:58 /usr/local/python3/bin/python3.7 /home/appsrv/.local/bin/gunicorn -b 192.168.101.240:8002 ManagerPlan.wsgi:application
appsrv   15116 10498  0 16:46 ?        00:00:00 /usr/local/python3/bin/python3.7 /home/appsrv/.local/bin/gunicorn -b 192.168.101.240:8002 ManagerPlan.wsgi:application
appsrv   15255 15150  0 18:08 pts/1    00:00:00 grep --color=auto gunicorn

3、關閉
首先執行如下命令獲取Gunicorn進程樹:

ps -ef|grep gunicorn

之後輸入如下指令關閉進程:

kill -9 pid

4、重啓
輸入如下指令重啓進程:

kill -HUP pid

發現執行如下啓動命令報錯,8002端口被佔用

gunicorn -b 192.168.101.240:8002 ManagerPlan.wsgi:application

查看是被哪個進程佔用:

ss -anp |grep 8002
在這裏插入圖片描述

居然是nginx配置中的地址。那麼此時把nginx停止運行(sudo nginx -s stop),再重新執行gunicorn啓動命令.
現在報出其他錯誤,找不到ModuleNotFoundError: No module named ‘ManagerPlan.wsgi.plan’;

[appsrv@localhost ManagerPlan]$ gunicorn -b 192.168.101.240:8002 ManagerPlan.wsgi.plan
[2020-04-28 11:34:26 +0800] [16185] [INFO] Starting gunicorn 20.0.4
[2020-04-28 11:34:26 +0800] [16185] [INFO] Listening at: http://192.168.101.240:8002 (16185)
[2020-04-28 11:34:26 +0800] [16185] [INFO] Using worker: sync
[2020-04-28 11:34:26 +0800] [16188] [INFO] Booting worker with pid: 16188
[2020-04-28 03:34:26 +0000] [16188] [ERROR] Exception in worker process
Traceback (most recent call last):
  File "/home/appsrv/.local/lib/python3.7/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
    worker.init_process()
  File "/home/appsrv/.local/lib/python3.7/site-packages/gunicorn/workers/base.py", line 119, in init_process
    self.load_wsgi()
  File "/home/appsrv/.local/lib/python3.7/site-packages/gunicorn/workers/base.py", line 144, in load_wsgi
    self.wsgi = self.app.wsgi()
  File "/home/appsrv/.local/lib/python3.7/site-packages/gunicorn/app/base.py", line 67, in wsgi
    self.callable = self.load()
  File "/home/appsrv/.local/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py", line 49, in load
    return self.load_wsgiapp()
  File "/home/appsrv/.local/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py", line 39, in load_wsgiapp
    return util.import_app(self.app_uri)
  File "/home/appsrv/.local/lib/python3.7/site-packages/gunicorn/util.py", line 358, in import_app
    mod = importlib.import_module(module)
  File "/usr/local/python3/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 962, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'ManagerPlan.wsgi.plan'; 'ManagerPlan.wsgi' is not a package
[2020-04-28 03:34:26 +0000] [16188] [INFO] Worker exiting (pid: 16188)
[2020-04-28 11:34:26 +0800] [16185] [INFO] Shutting down: Master
[2020-04-28 11:34:26 +0800] [16185] [INFO] Reason: Worker failed to boot.

暫時沒有解決ta。只是先要確定普通模式運行下django項目,看看它能否跑起來
cd到項目根目錄下,運行命令:

python3 manage.py runserver 192.168.101.240:8002

[appsrv@localhost ManagerPlan]$ python3 manage.py runserver 192.168.101.240:8002
Performing system checks...

System check identified no issues (0 silenced).
April 28, 2020 - 03:44:07
Django version 2.1.1, using settings 'ManagerPlan.settings'
Starting development server at http://192.168.101.240:8002/
Quit the server with CONTROL-C.

在其他電腦(也即是遠程)上訪問:http://192.168.101.240:8002/index/

可正常訪問到登錄頁面。故此項目是能正常運行的。目前緊要的就是解決找不到模塊的問題。
原來是執行錯命令了,用命令:

gunicorn -b 192.168.101.240:8002 ManagerPlan.wsgi:application

纔是正確的。

gunicorn -b 192.168.101.240:8002 ManagerPlan.wsgi:application

wsgi:application 之間應該用:冒號,而不是.

總結:脫離了nginx,直接用gunicorn啓動項目,運行。

考慮:把nginx用起來。(可參考:https://www.cnblogs.com/joest/p/setting_up_your_django_project_to_nginx.html)

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