为Django项目配置Debian,Nginx和Gunicorn



祝大家有美好的一天。

在Nginx上为项目Django 3.x提升了Debian服务器的任务。打破互联网上的大量信息,我设法通过结合来自多个不同站点的建议来做到这一点。如果您有兴趣阅读如何为Django项目设置第一台服务器,那么欢迎您。

我会告诉您一些有关您自己的信息,以便您了解我的身份。我不是开发人员,程序员,系统管理员,甚至没有IT知识。我是计算机科学老师。但是在工作中,我必须向学生解释一些与计算机科学学校课程相距甚远的观点,其中之一就是在Django上开发项目。

基本设置


首先,我们已经安装了Debian 10服务器,安装Debian应该没有问题。我的安装干净,没有任何其他设置,因此我通过root用户进入服务器并开始为我安装一些主要组件。

apt-get update
apt-get install -y sudo htop git curl wget unzip zip gcc build-essential make
apt-get install -y tree redis-server nginx  libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python3-dev python-pil ython3-pil 
apt-get install -y python3-lxml libxslt-dev python-libxml2 python-libxslt1 python-dev gnumeric libpq-dev libxml2-dev libxslt1-dev libjpeg-dev libfreetype6-dev libcurl4-openssl-dev supervisor libgdbm-dev libnss3-dev ufw

您可以将所有这些都放入一个安装中,但是我遇到了一个错误,并且按此顺序,一切进展顺利。

接下来,创建一个新用户并将其添加到sudo组中,以便他可以代表超级用户启动进程。

adduser username 
usermod -aG sudo username

其中username是您将来使用的用户名从源代码
安装最新版本的Python在撰写本文时,该值为3.8.2

cd /home/username
curl -O https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tar.xz
tar -xf Python-3.8.2.tar.xz
cd Python-3.8.2

动作说明
cd — , change directory;
curl — URL. ;
tar — .

下载最新版本的Python并移至源目录后,我们运行:

./configure --enable-optimizations
make -j 2

这将使我们准备安装Python所需的一切。在这里,数字2是处理器内核的数量。您可以使用nproc命令来查找
我们开始安装。
make altinstall

您可以使用以下命令来验证是否安装Python

python3.8 -V

它将输出Python版本
之后,我们更新pip并安装最常用的Python软件包
python3.8 -m pip install -U pip
python3.8 -m pip install -U setuptools
python3.8 -m pip install pillow
python3.8 -m pip install virtualenv

Django设定


我们重新启动系统,然后进入您创建的用户。让我们转到/ var / www目录并将我们的项目下载到其中,该项目已上传到GitHub上

cd /var/www
sudo git clone LINK_TO_PROJECT

使用/ var / www目录配置正常操作的权限
sudo chown -R www-data:www-data /var/www
sudo usermod -aG www-data username
sudo chmod go-rwx /var/www
sudo chmod go+x /var/www
sudo chgrp -R www-data /var/www
sudo chmod -R go-rwx /var/www
sudo chmod -R g+rwx /var/www

看来我们执行了某些操作,然后取消了它们,但要点是,我们首先删除了所有人的所有权限,然后将它们分配给特定的用户或组。

我们进入项目,创建一个虚拟环境并运行它:

cd djangoprojectname/
virtualenv env
source ./env/bin/activate

如果所有内容均已激活,则将出现以下形式的行:(env)username @ server。

我们将交付/更新项目所需的主要软件包。

pip install -U pip
pip install -U setuptools
pip install -U pillow

我们放置了Django,Gunicorn和PostgreSQL适配器。

pip install django gunicorn psycopg2-binary

您还可以放置项目所需的软件包,我使用summernote作为文本:

pip install django-summernote

我们设置了防火墙,因此我们需要在端口8000上为其创建一个例外(默认情况下使用它,如果我们计划使用另一个,则指定它):

sudo ufw allow 8000

必需的步骤是检查服务器的运行状况:

python3.8 manage.py runserver 0.0.0.0:8000

然后访问您的网站DOMAIN_NAME:8000,以确保一切正常!但是,目前,我们还没有进行太多配置,这些只是基本设置,我们需要配置服务器的正常运行,连接静态对象等。
如果您的站点没有启动,那么您需要深入研究设置(可能是访问权限),并查看尚未安装的软件包,所有内容都很个别。

:通过按键来完成的CTRL +的C

然后,我们仅在您的项目开始时继续前进,我强烈建议您在无法解决问题时继续前进。最好在初始阶段解决问题,而不是将服务器拆除到根目录(我拆除了3次,然后开始编写此指令,修复了所有操作)。

检查Gunicorn的工作:

gunicorn --bind 0.0.0.0:8000 MAINAPPNAME.wsgi

MAINAPPNAME是包含settings.py的主应用程序的名称

如果服务器正在运行,请继续。

在C:通过按键来完成TRL +的C

设置settings.py


部署到生产服务器时,需要从项目中禁用调试并更改几个设置,我在项目的settings.py中执行了以下操作。

DEBUG = False
if DEBUG:
    ALLOWED_HOSTS = ['*']
else:
    ALLOWED_HOSTS = ['HOST IP', 'DOMAIN NAIM', 'localhost']
...
STATIC_URL = '/static/'
if DEBUG:
    STATIC_DIR = os.path.join(BASE_DIR, 'static')
    STATICFILES_DIRS = [
        STATIC_DIR,
        '/var/www/static/',
    ]
else:
    STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
    STATICFILES_FINDERS = (
        'django.contrib.staticfiles.finders.FileSystemFinder',
        'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    )
MEDIA_URL = '/media/'

urls.py中,我更改了静态和媒体设置。

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

我不知道这是正确的决定,也许这些文件还有更正确的更改。但是在这种情况下,更改DEBUG的值足以在开发和发布之间进行切换。

运行命令:

python3.8 manage.py collectstatic

收集静态信息并停用虚拟环境:

deactivate

配置Gunicorn


开放定制

sudo nano /etc/systemd/system/gunicorn.socket

让我们在文件中写一些设置:

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

我们创建了[Unit]部分来描述套接字,在[Socket]部分中,我们确定了套接字的位置,在[Install]部分中,我们需要在正确的时间安装套接字。

打开systemd实用程序文件以配置服务:

sudo nano /etc/systemd/system/gunicorn.service

[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=username
Group=www-data
WorkingDirectory=/var/www/djangoprojectname
ExecStart=/var/www/djangoprojectname/env/bin/gunicorn \
          --access-logfile - \
          --workers 5 \
          --bind unix:/run/gunicorn.sock \
          myproject.wsgi:application

[Install]
WantedBy=multi-user.target

不要忘记指出您的用户,项目名称和虚拟环境。

正如我所解释的,工作人员的计算方式是处理器内核数量* 2 +1
现在,我们启动并激活Gunicorn套接字。

sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket

并确保测试一切正常!

sudo systemctl status gunicorn.socket

应该显示有关正在运行的服务的信息。

Q退出(在英语布局中是必需的)。

file /run/gunicorn.sock

最后一条命令应显示有关该文件的消息。

如果第一个sudo systemctl status gunicorn.socket命令失败,或者第二个文件/run/gunicorn.sock命令报告gunicorn.sock文件不在目录中,则无法创建Gunicorn套接字。您需要使用以下命令检查Gunicorn套接字日志:

sudo journalctl -u gunicorn.socket

找出错误所在,然后解决。

让我们继续测试套接字激活。

sudo systemctl status gunicorn

您最有可能获得记录:

Active: inactive (dead)

到目前为止,一切进展顺利。

通过卷曲与插座建立连接。

curl --unix-socket /run/gunicorn.sock localhost


可能引发错误请求(400)错误。

尝试代替localhost来指定服务器IP,如果一切正常,则很可能是由于我们尚未完成的nginx设置。继续前进。

再次,请求状态输出:

sudo systemctl status gunicorn

Active: active (running)

如果记录是“ +”,那么仍然有很多信息,但是没有关于错误的信息,那么一切都很好。

否则,我们将查看日志中的错误

sudo journalctl -u gunicorn

并重新启动Gunicorn进程

sudo systemctl daemon-reload
sudo systemctl restart gunicorn

NGINX设置


我们将为我们的站点创建一个新的服务器块并对其进行配置,以便在地址栏中访问我们的站点时,服务器了解从何处以及从何处获取它。

sudo nano /etc/nginx/sites-available/djangoprojectname

server {
    listen 80;
    server_name server_domain_or_IP;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        alias /var/www/djangoprojectname/static/;
    }

    location /media/ {
        alias /var/www/djangoprojectname/media/;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }
}

在sever_name部分中,您可以指定多个用空格分隔的地址。

测试语法错误:

sudo nginx -t

如果没有错误,请重新启动服务器并为我们的防火墙授予必要的权限:

sudo systemctl restart nginx
sudo ufw allow 'Nginx Full'

您还可以删除对端口8000的访问

sudo ufw delete allow 8000

在这一点上,一切都应该正常工作,但是直到我配置了https,它对我来说还是无法正常工作。不幸的是,尽管媒体文件已正常加载,但我无法解释它的功能,但没有加载静态变量。

HTTPS设置


我们将使用Cerbot进行配置

sudo apt-get install certbot python-certbot-nginx
sudo certbot –nginx

并按照屏幕上的提示进行操作。如果有错误,则消除并重试。例如,如果您指定与该服务器无关的域名,则可能会发生错误。
要自动续订证书,请输入命令。

sudo certbot renew --dry-run 

现在,我们正在测试该网站,一切正常!

如果静态消息仍然没有出现,请尝试打开一些指向其完整地址的css文件,如果出现403错误,则一切正常,但需要尝试使用访问权限问题,请尝试将www-data的所有权限设置重置为目录/ var / www如果错误是404,则需要查看NGINX设置中位置设置

PostgreSQL设置


设置PostgreSQL并从SQLite导入数据。如果不需要它,请跳过此步骤,或仅进行PostgreSQL设置。

创建一个数据库和用户。

sudo -u postgres psql

CREATE DATABASE dbforproject;
CREATE USER projectdbuser WITH PASSWORD 'password';

我们将遵循有关Django项目的建议。

我们将默认编码设置为UTF-8,将默认事务隔离方案设置为“读取已提交”,以阻止从未确认的事务中读取。将时区设置为GMT(UTC)。

ALTER ROLE projectdbuser SET client_encoding TO 'utf8';
ALTER ROLE projectdbuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE projectdbuser SET timezone TO 'UTC';

之后,您需要向我们创建的用户提供访问权限以管理新数据库:

GRANT ALL PRIVILEGES ON DATABASE dbforproject TO projectdbuser;

完成所有命令后,可以使用以下命令关闭PostgreSQL对话框:

\q

现在PostgreSQL配置已完成,现在我们将Django配置为可与PostreSQL一起正常使用。

首先,从SQLite复制旧数据(如有必要)。为此,请转到您的项目并启动虚拟环境:

cd /var/www/djangoprojectname
source ./env/bin/activate
cd mainappname/
python3.8 manage.py dumpdata > datadump.json

更改用于连接数据库的设置:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'dbforproject',
        'USER': 'projectdbuser',
        'PASSWORD': 'password',
        'HOST': 'localhost',
        'PORT': '',
    }
}

运行数据库迁移:

python3.8 manage.py migrate --run-syncdb

在这个shell之后:

python3 manage.py shell

并写在里面:

>>> from django.contrib.contenttypes.models import ContentType
>>> ContentType.objects.all().delete()
>>> quit()

并从SQLite加载以前上传的数据:

python3.8 manage.py loaddata datadump.json

就是所有这些,对我来说都是正常的,并且可以正常工作,但是如果发生错误,它非常个别,因此,我建议不要跳过性能测试的步骤,这样您就可以了解错误发生在哪个阶段。

在写作时,我使用了:

  1. www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-18-04-ru
  2. vexxhost.com/resources/tutorials/how-to-deploy-django-on-nginx-gunicorn-with-postgres
  3. pythonworld.ru/web/django-ubuntu1604.html

All Articles