本篇文章大量参看了 uwsgi 文档关于 django 部署部分:
省去了安装、测试文件、虚拟环境建立部分,根据多次部署的经验总结出一套自己的部署方法,包括问题排查措施、文件配置等。
django部分
1、 本地部分
1.1 .gitignore 设置
向代码托管服务器上 push 代码的时候,一定注意忽略几个可能会影响到网站部署的文件以及文件夹
- *.pyc 所有编译文件
- pycache/ 文件夹
还有一些不用上传的文件以及文件夹:
- .idea 文件夹
- db.sqlite3 尽量使用 mysql 或其他大型稳定数据库
最后 .gitignore 文件示例:
db.sqlite3*.pyc__pycache__/.idea
1.2 确认项目本身正确
push 之前确保 django 项目没有代码错误,跑一下python manage.py runserver
将自己开发的页面都过一遍。 1.3 项目二次开发
在初次 push 之后,之后在本地进行继续开发,切记不要直接在 master 分支上直接修改代码,最好新建 dev 分支开发,然后确保代码没问题后,合并到主分支。
对于项目管理方面,由于没有大型项目开发经验,所以理解的不深,进步一点儿是一点儿。
2、 服务器部分
将代码下载到服务器后,需要做以下几步操作
2.1 配置服务器设置文件
2.1.1
在同一文件夹下复制一份 settings.py 命名为 server_settings.py,修改其中设置。
首先是 ALLOWED_HOSTS,填上网站根域名,比如:
ALLOWED_HOSTS = ['lab.crossincode.com']
将 DEBUG 改为 False
DEBUG = False
如果使用了 mysql 数据库,需要修改 DATABASES 配置。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'database_name', 'USER': 'user', 'PASSWORD': 'password', }}
相关的 mysql 操作参考
最后是 static 和 media 设置,注意 STATIC_URL 和 MEDIA_URL 的设置需要配合 django 项目中的 url 路径。比如:
如果我的根域名为 'lab.crossincode.com' ,本 django 项目所有的 url 路径都为 'lab.crossincode.com/mysite/.....' ,配置如下图所示:STATIC_URL = '/mysite/static/'STATIC_ROOT = os.path.join(BASE_DIR, "static/")MEDIA_ROOT = os.path.join(BASE_DIR, 'media')MEDIA_URL = '/mysite/media/'
如果 django 项目的路径直接从根域名开始,直接为 STATIC_URL = '/static/'
即可。
2.1.2 修改 wsgi.py
将 setting 路径改为刚刚我们新建的设置文件
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.server_settings")
2.1.3 更改 django 项目的设置文件路径
设置一:
export DJANGO_SETTINGS_MODULE=mysite.server_settings
设置二:
python manage.py runserver --settings=mysite.server_settings
我用的是第二种办法,直接在命令后添加 --settings 参数。
2.1.4 运行 collectstatic 命令
这一步的作用是将整个 django 的静态文件归纳到一起,命令如下:
python manage.py collectstatic --settings=mysite.server_settings
2.1.5 迁移数据库
python manage.py makemigrations --settings=mysite.server_settingspython manage.py migrate --settings=mysite.server_settings
2.1.6 创建超级用户
python manage.py createsuperuser --settings=mysite.server_settings
2.1.7 跑一跑 django 项目,查看是否正常
python manage.py runserver --settings=mysite.server_settings
最后记得修改 .gitignore 文件,将 server_settings.py 文件忽略掉。
nginx 部分
1、配置文件
首先进入 /etc/nginx/sites-enabled
文件夹,创建一个 mysite.conf
文件:
$ cd /etc/nginx/sites-enabled$ sudo nano mysite.conf
到 下载信息到 uwsgi_params 文件,该文件放在 /etc/nginx/sites-enabled
下,或者 django 的根目录下。
进入编辑页面后,复制如下信息:
# mysite.conf# the upstream component nginx needs to connect to# 这里的 django 名可以修改,不过注意与下文的 uwsgi_pass 保持一致。upstream django { # for a file socket # 路径为 django 目录 # sock 文件不用事先创建 # 示例 server unix:///home/zx/django-program/mysite/mysite.sock; server unix:///path/to/your/mysite/mysite.sock; }# configuration of the serverserver { # the port your site will be served on # 监听端口,这跟域名有关 listen 8000; # the domain name it will serve for # substitute your machine's IP address or FQDN # 示例 server_name lab.crossincode.com; server_name .example.com; charset utf-8; # max upload size client_max_body_size 75M; # adjust to taste # Django media location /media { alias /path/to/your/mysite/media; # your Django project's media files - amend as required } location /static { alias /path/to/your/mysite/static; # your Django project's static files - amend as required } # Finally, send all non-media requests to the Django server. location / { uwsgi_pass django; include /path/to/your/mysite/uwsgi_params; # the uwsgi_params file you installed }}
复制的时候将中文注释去除。
2、测试 nginx 是否正确配置
命令行下
$ sudo /etc/init.d/nginx restart
如果出现失败的情况,运行命令
$ sudo nginx -t
该命令会输出配置错误信息,根据提示修改即可。
uwsgi 部分
在 django 项目中建立 mysite.ini 文件
复制以下内容:
[uwsgi]# Django-related settings# the base directory (full path)# 项目文件夹路径,chdir = /home/to/your/project/path# Django's wsgi filemodule = mysite.wsgi# the virtualenv (full path)# 虚拟环境路径home = /home/to/virtualenv# process-related settings# mastermaster = true# maximum number of worker processes# 根据网站性能填写processes = 2# the socket (use the full path to be safe# sock 文件路劲socket = /path/to/your/mysite.sock# ... with appropriate permissions - may be neededchmod-socket = 666# clear environment on exitvacuum = true# 日志文件daemonize = /path/to/log/project.log# 进程号文件路径pidfile = mysite.pid
初次运行:
uwsgi --ini mysite.ini
之后重新加载,切记不能重复运行以上代码,否则会产生很多相似的进程。
uwsgi --reload mysite.pid
接着,就可以在浏览器打开 url 地址了。
不出意外,应该能看到页面了。开心,比心心。
错误调试
当然,也有很大几率不能一次成功,下面给出调试心得
在之前的部署过程中,我们已经解决了部署过程每一部分的正确, django 项目本身OK, Nginx配置未报错, uwsgi 可以运行,所以到这一步已经不是某部分独立的问题,而是几方面协作时出现了问题。逐一排查:
1、 查看 ngnix 日志
$ sudo cat /var/log/nginx/error.log
该命令可以查看 nginx 错误日志,根据日志进行调试
2、django 运行日志
在 ini 文件中,我们设置了 项目日志记录,道理与上面一样,查看日志,看看错误信息,最后调试。3、ini 文件配置
打开 ini 文件,逐项检查配置,曾经遇到由于是复制其他 ini 进行修改,但是眼拙没把所有配置项改完,导致错误。4、django-server_settings
偶尔会遇到网站可以加载,但是未加载静态文件,这时回过头去看静态文件路径是否设置正确,mysite.conf 中的静态文件路径是否正确。