Django 部署 (python3 Django uwsgi)
2019/01/24 Chenxin
參考:
https://www.jianshu.com/p/12e0814e6b56
https://segmentfault.com/a/1190000014361352
https://stackoverflow.com/questions/39907281/django-uwsgi-static-files-not-being-served-even-after-collectstatic
安裝與配置數據庫
安裝mysql.略.
導入數據
mysql --default-character-set=utf8mb4 -uzichan -pxxx -P 10306 zichan < zichan02_20190124.sql
安裝其他相關軟件以及相關的項目依賴包
yum install python36 python36-devel python36-pip
pip-3.6 --version
pip-3.6 install uwsgi
提示: Successfully installed uwsgi-2.0.17.1
制作一個測試py文件
cat test.py
!/bin/env python36
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
運行uwsgi: uwsgi --http :10080 --wsgi-file test.py
web訪問測試
http://3.1.111.170:10080/ 瀏覽器上會看到 "Hello World"
安裝Django項目依賴包
比如通過requirements.txt文件來安裝
asn1crypto0.24.0
certifi2018.11.29
cffi1.11.5
chardet3.0.4
configparser3.5.0
cryptography2.4.2
Django1.11.7
django-ranged-response0.2.0
django-simple-captcha0.5.9
idna2.8
Pillow5.3.0
pycparser2.19
PyMySQL0.9.2
pypiwin32220
pytz2018.7
requests2.19.1
six1.12.0
urllib31.23
WMI1.4.9
安裝
pip-3.6 install -r requirements.txt # pypiwin32220 這個在linux下會安裝失敗.暫時忽略該包,繼續安裝其他包.
上傳代碼(Deployment)
pycharm->Tools->Deployment->Configuration
配置SFTP,Connection.
配置Mappings. 在linux服務器上的目錄是相對於用戶主目錄下的次級目錄,所以這里目錄只需要給出項目名就可以了.比如django-cmdb.
在項目根文件夾點右鍵(或通過"Tools"),選擇Deployment,選擇upload執行上傳代碼到服務器操作.
最終代碼被上傳到 /home/admin/django-cmdb 目錄下.
[root@ip-10-0-1-23 admin]# ls /home/admin/django-cmdb/
aliyun_ecs aws_ec2 login login_regs manage.py requirements.txt server_asset static templates tmp-del
修改配置文件以及測試
使用Django開發模式測試 settings.py修改
login_regs/settings.py
DEBUG = False # 關閉debug模式.注意,在實際部署中,可能會碰到很多問題,也可以將這里為默認"True",等最終再改成False.
ALLOWED_HOSTS = ['*'] # 加入所以主機都可以訪問
DATABASES ... # DB配置文件
使用Django開發模式運行項目,進行測試
python36 manage.py runserver 0.0.0.0:10080
通過uwsgi命令方式測試(實際部署不需要)
使用http協議,以及靜態文件掛載點
uwsgi --http :10080 --chdir /home/admin/django-cmdb --wsgi login_regs.wsgi --static-map /static=/home/admin/django-cmdb/static
或者 ... --static-map=/static=/home.../static .
可以多次指定 --static-map 選項,即使是對於同一個掛載點,類似 --static-map /images=/var/www/img --static-map /images=/var/www/img2 --static-map /images=/var/www/img3 的方式.在找到文件之前會在每個目錄中進行搜索,如果找不到,這個請求就會交由你的應用管理.
其他說明
cd /home/admin/django-cmdb/ # 該文件夾里為項目的多個app
uwsgi --http :10080 --module login_regs.wsgi # 這里, login_regs是文件夾,wsgi是wsgi.py文件."."則為"/".
wsgi.py文件是Django自動生成的.存在路徑/home/admin/django-cmdb/login_regs(與其他app同級)/wsgi.py .
如果這里報no python application found, check your startup logs for errors,說明uwsgi沒有找到app.一般是路徑給錯了.
也可以http-socket方式 uwsgi --http-socket :10080 --chdir /home/admin/django-cmdb --wsgi login_regs.wsgi
方式一:通過uwsgi配置文件(只修改uwsgi自身配置文件,以及setting.py生成靜態文件)(推薦)
修改setting.py文件
STATIC_ROOT靜態文件收集路徑,在開發中,STATIC_ROOT什么都不做.你甚至不需要設置它.
需要運行 python manage.py collectstatic 將項目涉及到的所有靜態文件,一並拷貝到以下文件夾里.
STATIC_ROOT = '/home/admin/static_dj'
生成靜態文件
執行 python36 manage.py collectstatic
將靜態文件放入到/home/admin/static_dj/文件夾下,包括 admin(Django自帶的資源文件) bootstrap-3.3.7-dist css DataTables image js 文件夾.
修改uwsgi.ini配置文件
[root@ip-10-0-1-23 admin]# cat login_regs_uwsgi.ini
[uwsgi]
這里是手動創建的uwsgi配置文件
pythonpath = /usr/lib/python3.6/dist-packages
協議和端口.用nginx的時候就配socket , 直接運行的時候配 http
http = :10080
socket = 127.0.0.1:10080
項目根目錄
chdir = /home/admin/django-cmdb
Django wsgi 文件
wsgi-file=login_regs/wsgi.py
module = login_regs.wsgi:login_regs
module = login_regs.wsgi
the virtualenv (full path)
home = /path/to/virtualenv
process-related settings
允許主線程存在
master = true
開啟的進程數量
processes = 2
the socket (use the full path to be safe
socket = /path/to/your/project/mysite.sock
socket = /home/admin/django-cmdb/login_regs.sock
... with appropriate permissions - may be needed
chmod-socket = 664
當服務器退出的時候自動清理環境,刪除unix socket文件和pid文件.clear environment on exit
vacuum = true
日志
daemonize = /home/admin/uwsgi8000.log
vhost = true //多站模式
no-site = true //多站模式時不設置入口模塊和文件
workers = 2 //子進程數
reload-mercy = 10
vacuum = true //退出、重啟時清理文件
max-requests = 1000
limit-as = 512
buffer-size = 30000
pidfile = /var/run/uwsgi8000.pid
靜態文件(這里開啟的話,urls.py文件里就不用開啟了)
static-map = /static=/home/admin/static_dj
啟動
[root@ip-10-0-1-23 admin]# uwsgi --ini login_regs_uwsgi.ini
[uWSGI] getting INI configuration from login_regs_uwsgi.ini
[uwsgi-static] added mapping for /static => /home/admin/static_dj # 會看到這個映射的提示信息.如果static-map配置錯誤,就看不到了.
方式二:通過uwsgi配置文件-讓Django自己去找靜態文件 (同時配合修改setting.py和urls.py)
[root@ip-10-0-1-23 admin]# cat login_regs_uwsgi.ini
...同方式一...
靜態文件(這里默認從Django進入,會從url匹配,故這里就沒有作用了).
static-map = /static=/home/admin/static_dj
修改setting.py文件
Static files (CSS, JavaScript, Images)
https://docs.djangoproject.com/en/1.11/howto/static-files/
STATIC_URL = '/static/'
STATIC_ROOT是新添加的一行,結合url.py供生成環境訪問靜態資源使用.否則uwsgi無法加載靜態資源.對windows系統使用Django貌似無影響
STATIC_ROOT靜態文件收集路徑,在開發中,STATIC_ROOT什么都不做.你甚至不需要設置它.
需要運行 python manage.py collectstatic 將項目涉及到的所有靜態文件,一並拷貝到以下文件夾里.
STATIC_ROOT = '/home/admin/static_dj'
STATICFILES_DIRS:靜態文件的額外目錄,STATICFILES_DIRS用於包含要查找的其他靜態文件目錄.比如你自己新建的一個靜態文件文件夾.
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
修改主urls.py文件
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [...原先的代碼...] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) # 是為了生成環境中,uwsgi能夠加載到靜態文件,如css
生成靜態文件
執行 python36 manage.py collectstatic
將靜態文件放入到/home/admin/static_dj/文件夾下,包括 admin(Django自帶的資源文件) bootstrap-3.3.7-dist css DataTables image js 文件夾.
運行uwsgi並進行測試
uwsgi --ini login_regs_uwsgi.ini
備注
方式一和二不能混合使用,會造成訪問不了靜態資源文件.
自動任務計划
針對crontab的修改,以及定期執行的方式,請參考<<Django系統計划任務 django-crontab計划任務 自定義命令 三種方式>>筆記內容