前提更要
項目在本地已完成大框架開發,預想着能部署到公共lunix服務器上,
環境配置
特意找了一臺沒有在使用的lunix服務器,集成部同事幫忙重新安裝了較爲新版的lunix,並安裝了python3.7及django3:
- 項目代碼遷移 在lunix下新建一個文件夾project用來存在django項目代碼,把在本地開發的代碼直接放到project文件夾下.
- 採用django自帶調試模式啓動,發現無法在本地瀏覽器上訪問lunix服務器上的項目;
- 集成同事及本人自行百度,發現 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)