Django 部署 (python3 Django uwsgi)
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计划任务 自定义命令 三种方式>>笔记内容