祝大家有美好的一天。在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
就是所有这些,对我来说都是正常的,并且可以正常工作,但是如果发生错误,它非常个别,因此,我建议不要跳过性能测试的步骤,这样您就可以了解错误发生在哪个阶段。在写作时,我使用了:- www.digitalocean.com/community/tutorials/how-to-set-up-django-with-postgres-nginx-and-gunicorn-on-ubuntu-18-04-ru
- vexxhost.com/resources/tutorials/how-to-deploy-django-on-nginx-gunicorn-with-postgres
- pythonworld.ru/web/django-ubuntu1604.html