django + uwsgi + nginx 部署网页

本篇文章大量参看了 uwsgi 文档关于 django 部署部分:Setting up Django and your web server with uWSGI and nginx

省去了安装、测试文件、虚拟环境建立部分,根据多次部署的经验总结出一套自己的部署方法,包括问题排查措施、文件配置等。

django部分

1、 本地部分

1.1 .gitignore 设置

向代码托管服务器上 push 代码的时候,一定注意忽略几个可能会影响到网站部署的文件以及文件夹

  • *.pyc 所有编译文件
  • pycache/ 文件夹

还有一些不用上传的文件以及文件夹:

  • .idea 文件夹
  • db.sqlite3 尽量使用 mysql 或其他大型稳定数据库

.gitignore文档
博客教程参考

最后 .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 操作参考 How To Use MySQL or MariaDB with your Django Application on Ubuntu 14.04

最后是 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_settings
python 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

https://github.com/nginx/nginx/blob/master/conf/uwsgi_params 下载信息到 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 server
server {
    # 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 file
module          = mysite.wsgi
# the virtualenv (full path)
# 虚拟环境路径
home            = /home/to/virtualenv

# process-related settings
# master
master          = 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 needed
chmod-socket    = 666
# clear environment on exit
vacuum          = 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 中的静态文件路径是否正确。

原文地址:https://www.cnblogs.com/zx576/p/7091754.html