转自【https://simpleisbetterthancomplex.com/series/2017/10/16/a-complete-beginners-guide-to-django-part-7.html】

Django的初学者指南 - 第7部分

介绍

欢迎来到我们教程系列的最后一部分!在本教程中,我们将把Django应用程序部署到生产服务器。我们还将为我们的服务器配置电子邮件服务和HTTPS证书。

首先,我想到了一个使用虚拟专用服务器(VPS)的例子,它更通用,然后使用一个平台即服务,如Heroku。但它太详细了,所以我最终创建了关于VPS的本教程。

我们的项目现场直播!如果您想在查看文本之前在线查看,这是我们要部署的应用程序:www.djangoboards.com


版本控制

版本控制是软件开发中非常重要的主题。特别是在与团队合作并同时维护生产代码时,并行开发了多个功能。无论是一个开发人员项目还是多个开发人员项目,每个项目都应该使用版本控制。

版本控制系统有几种选择。也许是因为GitHub的流行,Git 成为版本控制的事实标准。所以如果你不熟悉版本控制,Git是一个很好的起点。一般有很多教程,课程和资源,因此很容易找到帮助。

GitHub和Code School有一个关于Git的很棒的互动教程,几年前我开始从SVN转到Git。这是一个非常好的介绍。

这是一个非常重要的主题,我可能应该从第一个教程开始提出它。但事实是我希望本教程系列的重点放在Django上。如果这一切对您来说都是新的,请不要担心。一步一步是很重要的。你的第一个项目并不完美。重要的是要保持学习和慢慢发展你的技能,但要保持稳定。

关于Git的一个非常好的事情是它不仅仅是一个版本控制系统。围绕它建立了丰富的工具和服务生态系统。一些很好的例子是持续集成,部署,代码审查,代码质量和项目管理。

使用Git来支持Django项目的部署过程非常有效。这是从源代码存储库中提取最新版本或在出现问题时回滚到特定版本的便捷方式。有许多服务与Git集成,以便自动化测试执行和部署。

如果您没有在本地计算机上安装Git,请从https://git-scm.com/downloads获取已安装的。

基本设置

首先,设置你的身份:

  1. git config --global user.name "Vitor Freitas"
  2. git config --global user.email vitor@simpleisbetterthancomplex.com

在项目根目录(与manage.py相同的目录)中,初始化一个git存储库:

  1. git init
  1. Initialized empty Git repository in /Users/vitorfs/Development/myproject/.git/

检查存储库的状态:

  1. git status
  1. On branch master
  2. Initial commit
  3. Untracked files:
  4. (use "git add <file>..." to include in what will be committed)
  5. accounts/
  6. boards/
  7. manage.py
  8. myproject/
  9. requirements.txt
  10. static/
  11. templates/
  12. nothing added to commit but untracked files present (use "git add" to track)

在继续添加源文件之前,请在项目根目录中创建名为.gitignore的新文件。这个特殊的文件将帮助我们保持存储库的清洁,而不需要像缓存文件或日志这样的不必要的文件。

您可以 从GitHub 获取Python项目通用.gitignore文件

确保将它从Python.gitignore重命名为.gitignore(点很重要!)。

您可以补充.gitignore文件,告诉它忽略SQLite数据库文件,例如:

的.gitignore

  1. __pycache__/
  2. *.py[cod]
  3. .env
  4. venv/
  5. # SQLite database files
  6. *.sqlite3

现在将文件添加到存储库:

  1. git add .

请注意这里的点。上面的命令告诉Git 在当前目录中添加所有未跟踪的文件。

现在进行第一次提交:

  1. git commit -m "Initial commit"

总是写一个评论告诉这个提交是什么,简要描述你改变了什么。

远程存储库

现在让我们将GitHub设置为远程存储库。首先,在GitHub上创建一个免费帐户,然后确认您的电子邮件地址。之后,您将能够创建公共存储库。

现在,只需为存储库选择一个名称,不要使用自述文件初始化它,或者添加.gitignore或添加许可证到目前为止。确保将存储库空启动:

创建存储库后,您应该看到如下内容:

现在让我们将其配置为我们的远程存储库:

  1. git remote add origin git@github.com:sibtc/django-boards.git

现在将代码推送到远程服务器,即GitHub存储库:

  1. git push origin master
  2. Counting objects: 84, done.
  3. Delta compression using up to 4 threads.
  4. Compressing objects: 100% (81/81), done.
  5. Writing objects: 100% (84/84), 319.70 KiB | 0 bytes/s, done.
  6. Total 84 (delta 10), reused 0 (delta 0)
  7. remote: Resolving deltas: 100% (10/10), done.
  8. To git@github.com:sibtc/django-boards.git
  9. * [new branch] master -> master

我创建此存储库只是为了演示使用现有代码库创建远程存储库的过程。该项目的源代码正式托管在此存储库中:https: //github.com/sibtc/django-beginners-guide


项目设置

无论代码是存储在公共或私有远程存储库中,都不应提交敏感信息并将其推送到远程存储库。这包括密钥,密码,API密钥等。

此时,我们必须在settings.py模块中处理两种特定类型的配置:

  • 密钥和密码等敏感信息;
  • 特定于给定环境的配置。

密码和密钥可以存储在环境变量中或使用本地文件(未提交到远程存储库):

  1. # environment variables
  2. import os
  3. SECRET_KEY = os.environ['SECRET_KEY']
  4. # or local files
  5. with open('/etc/secret_key.txt') as f:
  6. SECRET_KEY = f.read().strip()

为此, 我在我开发的每个Django项目中都使用了一个名为Python Decouple的优秀实用程序库。它将搜索名为.env的本地文件以设置配置变量,并将回退到环境变量。它还提供了一个定义默认值的接口,在适用时将数据转换为intboollist

这不是强制性的,但我真的觉得它是一个非常有用的工具。它像Heroku这样的服务就像魅力一样。

首先,让我们安装它:

  1. pip install python-decouple

的myproject / settings.py

  1. from decouple import config
  2. SECRET_KEY = config('SECRET_KEY')

现在,我们可以将敏感信息放在一个名为.env的特殊文件中(注意前面的点),该文件位于manage.py文件所在的目录中:

  1. myproject/
  2. |-- myproject/
  3. | |-- accounts/
  4. | |-- boards/
  5. | |-- myproject/
  6. | |-- static/
  7. | |-- templates/
  8. | |-- .env <-- here!
  9. | |-- .gitignore
  10. | |-- db.sqlite3
  11. | +-- manage.py
  12. +-- venv/

.ENV

  1. SECRET_KEY=rqr_cjv4igscyu8&&(0ce(=sy=f2)p=f_wn&@0xsp7m$@!kp=d

.ENV文件中忽略的.gitignore文件,所以每次我们要部署应用程序或在不同的机器上运行时,我们将创建一个.ENV文件,并添加必要的配置。

现在让我们安装另一个库来帮助我们在一行中编写数据库连接。这样,在不同的环境中编写不同的数据库连接字符串会更容易:

  1. pip install dj-database-url

目前,我们需要解耦的所有配置:

的myproject / settings.py

  1. from decouple import config, Csv
  2. import dj_database_url
  3. SECRET_KEY = config('SECRET_KEY')
  4. DEBUG = config('DEBUG', default=False, cast=bool)
  5. ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=Csv())
  6. DATABASES = {
  7. 'default': dj_database_url.config(
  8. default=config('DATABASE_URL')
  9. )
  10. }

本地计算机的.env文件示例:

  1. SECRET_KEY=rqr_cjv4igscyu8&&(0ce(=sy=f2)p=f_wn&@0xsp7m$@!kp=d
  2. DEBUG=True
  3. ALLOWED_HOSTS=.localhost,127.0.0.1

请注意,在DEBUG配置中我们有一个默认值,因此在生产中我们可以忽略此配置,因为它将被设置为False自动设置,因为它应该是。

现在ALLOWED_HOSTS将被转换成一个列表['.localhost', '127.0.0.1'. ]。现在,这是在我们的本地机器上,为了生产,我们将其设置为类似于['.djangoboards.com', ]您拥有的任何域。

此特定配置可确保您的应用程序仅提供给此域。


跟踪要求

跟踪项目的依赖关系是一个很好的做法,因此更容易在另一台机器上安装它。

我们可以通过运行命令来检查当前安装的Python库:

  1. pip freeze
  2. dj-database-url==0.4.2
  3. Django==1.11.6
  4. django-widget-tweaks==1.4.1
  5. Markdown==2.6.9
  6. python-decouple==3.1
  7. pytz==2017.2

在项目根目录中创建名为requirements.txt的文件,并在其中添加依赖项:

requirements.txt

  1. dj-database-url==0.4.2
  2. Django==1.11.6
  3. django-widget-tweaks==1.4.1
  4. Markdown==2.6.9
  5. python-decouple==3.1

我保留了pytz == 2017.2,因为它是由Django自动安装的。

您可以更新源代码存储库:

  1. git add .
  2. git commit -m "Add requirements.txt file"
  3. git push origin master

域名

如果我们要正确部署Django应用程序,我们将需要一个域名。拥有域名来为应用程序提供服务,配置电子邮件服务和配置https证书非常重要。

最近,我一直在使用Namecheap 。您可以以8.88美元/年的价格获得.com域名,或者如果您只是尝试一下,您可以 以0.99美元/年的价格注册.xyz域名。

无论如何,您可以自由使用任何注册商。为了演示部署过程,我注册了 www.DjangoBoards.com域名。


部署战略

以下是我们将在本教程中使用的部署策略的概述:

云是Digital Ocean提供的虚拟专用服务器。您可以使用我的会员链接注册Digital Ocean以获得免费的10美元信用额度(仅适用于新帐户)。

我们将提供NGINX,由食人魔说明。NGINX将收到对服务器的所有请求。但如果请求数据,它不会尝试做任何聪明的事情。它所要做的就是确定所请求的信息是否是一个可以自行提供的静态资产,或者它是否更复杂。如果是这样,它会将请求传递给Gunicorn。

NGINX还将配置HTTPS证书。这意味着它只接受通过HTTPS的请求。如果客户端尝试通过HTTP请求,NGINX将首先将用户重定向到HTTPS,然后它才会决定如何处理请求。

我们还将安装此certbot以自动续订Let的加密证书。

Gunicorn是一个应用服务器。根据服务器具有的处理器数量,它可以生成多个工作程序以并行处理多个请求。它管理工作负载并执行Python和Django代码。

Django是努力工作的人。它可以访问数据库(PostgreSQL)或文件系统。但在大多数情况下,工作是在视图内部完成,渲染模板,以及过去几周我们编写过的所有内容。在Django处理请求之后,它会向Gunicorn返回一个响应,他将结果返回给NGINX,最终将响应传递给客户端。

我们还将安装PostgreSQL,一个生产质量数据库系统。由于Django的ORM系统,很容易切换数据库。

最后一步是安装Supervisor。它是一个过程控制系统,它将密切关注Gunicorn和Django,以确保一切顺利进行。如果服务器重新启动,或者Gunicorn崩溃,它将自动重启。


部署到VPS(数字海洋)

您可以使用您喜欢的任何其他VPS(虚拟专用服务器)。配置应该非常相似,毕竟我们将使用Ubuntu 16.04作为我们的服务器。

首先,让我们创建一个新的服务器(在Digital Ocean上,他们称之为“Droplet”)。选择Ubuntu 16.04:

选择尺寸。最小的液滴足够了:

然后为您的Droplet选择一个主机名(在我的情况下为“django-boards”):

如果您有SSH密钥,则可以将其添加到您的帐户。然后,您将能够使用它登录服务器。否则,他们会通过电子邮件向您发送root密码。

现在选择服务器的IP地址:

在我们登录服务器之前,让我们将域名指向此IP地址。这将节省一些时间,因为DNS设置通常需要几分钟才能传播。

所以这里我们添加了两条A记录,一条指向裸域“djangoboards.com”,另一条指向“www.djangoboards.com”。我们将使用NGINX配置规范URL。

现在让我们使用您的终端登录服务器:

  1. ssh root@45.55.144.54
  2. root@45.55.144.54's password:

然后你应该看到以下消息:

  1. You are required to change your password immediately (root enforced)
  2. Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-93-generic x86_64)
  3. * Documentation: https://help.ubuntu.com
  4. * Management: https://landscape.canonical.com
  5. * Support: https://ubuntu.com/advantage
  6. Get cloud support with Ubuntu Advantage Cloud Guest:
  7. http://www.ubuntu.com/business/services/cloud
  8. 0 packages can be updated.
  9. 0 updates are security updates.
  10. Last login: Sun Oct 15 18:39:21 2017 from 82.128.188.51
  11. Changing password for root.
  12. (current) UNIX password:

设置新密码,然后开始配置服务器。

  1. sudo apt-get update
  2. sudo apt-get -y upgrade

如果在升级过程中收到任何提示,请选择“保持当前安装的本地版本”选项。

Python 3.6

  1. sudo add-apt-repository ppa:deadsnakes/ppa
  2. sudo apt-get update
  3. sudo apt-get install python3.6

PostgreSQL的

  1. sudo apt-get -y install postgresql postgresql-contrib

NGINX

  1. sudo apt-get -y install nginx

  1. sudo apt-get -y install supervisor
  2. sudo systemctl enable supervisor
  3. sudo systemctl start supervisor

VIRTUALENV

  1. wget https://bootstrap.pypa.io/get-pip.py
  2. sudo python3.6 get-pip.py
  3. sudo pip3.6 install virtualenv
应用用户

使用以下命令创建新用户:

  1. adduser boards

通常,我只选择应用程序的名称。输入密码,并可选择在提示中添加一些额外信息。

现在将用户添加到sudoers列表:

  1. gpasswd -a boards sudo
PostgreSQL数据库设置

首先切换到postgres用户:

  1. sudo su - postgres

创建数据库用户:

  1. createuser u_boards

创建一个新数据库并将用户设置为所有者:

  1. createdb django_boards --owner u_boards

为用户定义一个强密码:

  1. psql -c "ALTER USER u_boards WITH PASSWORD 'BcAZoYWsJbvE7RMgBPzxOCexPRVAq'"

我们现在可以退出postgres用户了:

  1. exit
Django项目设置

切换到应用程序用户:

  1. sudo su - boards

首先,我们可以检查我们的位置:

  1. pwd
  2. /home/boards

首先,让我们用我们的代码克隆存储库:

  1. git clone https://github.com/sibtc/django-beginners-guide.git

启动虚拟环境:

  1. virtualenv venv -p python3.6

初始化virtualenv:

  1. source venv/bin/activate

安装要求:

  1. pip install -r django-beginners-guide/requirements.txt

我们将在这里添加两个额外的库,Gunicorn和PostgreSQL驱动程序:

  1. pip install gunicorn
  2. pip install psycopg2

现在在/ home / boards / django-beginners-guide文件夹中,让我们创建一个.env文件来存储数据库凭据,密钥和其他所有内容:

/home/boards/django-beginners-guide/.env

  1. SECRET_KEY=rqr_cjv4igscyu8&&(0ce(=sy=f2)p=f_wn&@0xsp7m$@!kp=d
  2. ALLOWED_HOSTS=.djangoboards.com
  3. DATABASE_URL=postgres://u_boards:BcAZoYWsJbvE7RMgBPzxOCexPRVAq@localhost:5432/django_boards

以下是数据库URL的语法:postgres:// db_userdb_passworddb_hostdb_portdb_name

现在让我们迁移数据库,收集静态文件并创建一个超级用户:

  1. cd django-beginners-guide
  1. python manage.py migrate
  2. Operations to perform:
  3. Apply all migrations: admin, auth, boards, contenttypes, sessions
  4. Running migrations:
  5. Applying contenttypes.0001_initial... OK
  6. Applying auth.0001_initial... OK
  7. Applying admin.0001_initial... OK
  8. Applying admin.0002_logentry_remove_auto_add... OK
  9. Applying contenttypes.0002_remove_content_type_name... OK
  10. Applying auth.0002_alter_permission_name_max_length... OK
  11. Applying auth.0003_alter_user_email_max_length... OK
  12. Applying auth.0004_alter_user_username_opts... OK
  13. Applying auth.0005_alter_user_last_login_null... OK
  14. Applying auth.0006_require_contenttypes_0002... OK
  15. Applying auth.0007_alter_validators_add_error_messages... OK
  16. Applying auth.0008_alter_user_username_max_length... OK
  17. Applying boards.0001_initial... OK
  18. Applying boards.0002_auto_20170917_1618... OK
  19. Applying boards.0003_topic_views... OK
  20. Applying sessions.0001_initial... OK

现在静态文件:

  1. python manage.py collectstatic
  2. Copying '/home/boards/django-beginners-guide/static/js/jquery-3.2.1.min.js'
  3. Copying '/home/boards/django-beginners-guide/static/js/popper.min.js'
  4. Copying '/home/boards/django-beginners-guide/static/js/bootstrap.min.js'
  5. Copying '/home/boards/django-beginners-guide/static/js/simplemde.min.js'
  6. Copying '/home/boards/django-beginners-guide/static/css/app.css'
  7. Copying '/home/boards/django-beginners-guide/static/css/bootstrap.min.css'
  8. Copying '/home/boards/django-beginners-guide/static/css/accounts.css'
  9. Copying '/home/boards/django-beginners-guide/static/css/simplemde.min.css'
  10. Copying '/home/boards/django-beginners-guide/static/img/avatar.svg'
  11. Copying '/home/boards/django-beginners-guide/static/img/shattered.png'
  12. ...

此命令将所有静态资产复制到外部目录,NGINX可以在该目录中为我们提供文件。稍后会详细介绍。

现在为应用程序创建一个超级用户:

  1. python manage.py createsuperuser
配置Gunicorn

因此,Gunicorn是负责在代理服务器后面执行Django代码的人。

/ home / boards中创建一个名为gunicorn_start的新文件:

  1. #!/bin/bash
  2. NAME="django_boards"
  3. DIR=/home/boards/django-beginners-guide
  4. USER=boards
  5. GROUP=boards
  6. WORKERS=3
  7. BIND=unix:/home/boards/run/gunicorn.sock
  8. DJANGO_SETTINGS_MODULE=myproject.settings
  9. DJANGO_WSGI_MODULE=myproject.wsgi
  10. LOG_LEVEL=error
  11. cd $DIR
  12. source ../venv/bin/activate
  13. export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
  14. export PYTHONPATH=$DIR:$PYTHONPATH
  15. exec ../venv/bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
  16. --name $NAME \
  17. --workers $WORKERS \
  18. --user=$USER \
  19. --group=$GROUP \
  20. --bind=$BIND \
  21. --log-level=$LOG_LEVEL \
  22. --log-file=-

此脚本将启动应用程序服务器。我们提供了一些信息,例如Django项目的位置,用于运行服务器的应用程序用户等等。

现在让这个文件可执行:

  1. chmod u+x gunicorn_start

创建两个空文件夹,一个用于套接字文件,另一个用于存储日志:

  1. mkdir run logs

现在/ home / boards里面的目录结构应该是这样的:

  1. django-beginners-guide/
  2. gunicorn_start
  3. logs/
  4. run/
  5. staticfiles/
  6. venv/

staticfiles文件夹由创建collectstatic命令。

配置Supervisor

首先,在/ home / boards / logs /文件夹中创建一个空的日志文件:

  1. touch logs/gunicorn.log

现在创建一个新的supervisor文件:

  1. sudo vim /etc/supervisor/conf.d/boards.conf
  1. [program:boards]
  2. command=/home/boards/gunicorn_start
  3. user=boards
  4. autostart=true
  5. autorestart=true
  6. redirect_stderr=true
  7. stdout_logfile=/home/boards/logs/gunicorn.log

保存文件并运行以下命令:

  1. sudo supervisorctl reread
  2. sudo supervisorctl update

现在检查状态:

  1. sudo supervisorctl status boards
  1. boards RUNNING pid 308, uptime 0:00:07
配置NGINX

下一步是设置NGINX服务器以提供静态文件并将请求传递给Gunicorn:

/ etc / nginx / sites-available /中添加一个名为boards的新配置文件:

  1. upstream app_server {
  2. server unix:/home/boards/run/gunicorn.sock fail_timeout=0;
  3. }
  4. server {
  5. listen 80;
  6. server_name www.djangoboards.com; # here can also be the IP address of the server
  7. keepalive_timeout 5;
  8. client_max_body_size 4G;
  9. access_log /home/boards/logs/nginx-access.log;
  10. error_log /home/boards/logs/nginx-error.log;
  11. location /static/ {
  12. alias /home/boards/staticfiles/;
  13. }
  14. # checks for static file, if not found proxy to app
  15. location / {
  16. try_files $uri @proxy_to_app;
  17. }
  18. location @proxy_to_app {
  19. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  20. proxy_set_header Host $http_host;
  21. proxy_redirect off;
  22. proxy_pass http://app_server;
  23. }
  24. }

创建指向已启用站点的文件夹的符号链接:

  1. sudo ln -s /etc/nginx/sites-available/boards /etc/nginx/sites-enabled/boards

删除默认的NGINX网站:

  1. sudo rm /etc/nginx/sites-enabled/default

重启NGINX服务:

  1. sudo service nginx restart

此时,如果DNS已经传播,则该网站应在URL www.djangoboards.com上提供。


配置电子邮件服务

开始使用的最佳选择之一是Mailgun。它提供了一个非常可靠的免费计划,每月包含12,000封电子邮件。

注册一个免费帐户。然后按照步骤操作,这非常简单。您必须与您注册域名的服务一起工作。在我的例子中,它是Namecheap

点击添加域以向您的帐户添加新域。按照说明操作,确保使用“mg。”子域名:

现在抓住第一组DNS记录,它是两个TXT记录:

使用您的注册商提供的网络界面将其添加到您的域中:

对MX记录做同样的事情:

将它们添加到域中:

现在这一步不是强制性的,但由于我们已经在这里,所以也要确认一下:

添加所有DNS记录后,单击“立即检查DNS记录”按钮:

现在我们需要有一些耐心。有时需要一段时间来验证DNS。

同时,我们可以配置应用程序以接收连接参数。

的myproject / settings.py

  1. EMAIL_BACKEND = config('EMAIL_BACKEND', default='django.core.mail.backends.smtp.EmailBackend')
  2. EMAIL_HOST = config('EMAIL_HOST', default='')
  3. EMAIL_PORT = config('EMAIL_PORT', default=587, cast=int)
  4. EMAIL_HOST_USER = config('EMAIL_HOST_USER', default='')
  5. EMAIL_HOST_PASSWORD = config('EMAIL_HOST_PASSWORD', default='')
  6. EMAIL_USE_TLS = config('EMAIL_USE_TLS', default=True, cast=bool)
  7. DEFAULT_FROM_EMAIL = 'Django Boards <noreply@djangoboards.com>'
  8. EMAIL_SUBJECT_PREFIX = '[Django Boards] '

然后,我的本地计算机.env文件将如下所示:

  1. SECRET_KEY=rqr_cjv4igscyu8&&(0ce(=sy=f2)p=f_wn&@0xsp7m$@!kp=d
  2. DEBUG=True
  3. ALLOWED_HOSTS=.localhost,127.0.0.1
  4. DATABASE_URL=sqlite:///db.sqlite3
  5. EMAIL_BACKEND=django.core.mail.backends.console.EmailBackend

我的生产.env文件看起来像这样:

  1. SECRET_KEY=rqr_cjv4igscyu8&&(0ce(=sy=f2)p=f_wn&@0xsp7m$@!kp=d
  2. ALLOWED_HOSTS=.djangoboards.com
  3. DATABASE_URL=postgres://u_boards:BcAZoYWsJbvE7RMgBPzxOCexPRVAq@localhost:5432/django_boards
  4. EMAIL_HOST=smtp.mailgun.org
  5. EMAIL_HOST_USER=postmaster@mg.djangoboards.com
  6. EMAIL_HOST_PASSWORD=ED2vmrnGTM1Rdwlhazyhxxcd0F

您可以在Mailgun 的“ 域信息”部分中找到您的凭据。

  • EMAIL_HOST:SMTP主机名
  • EMAIL_HOST_USER:默认SMTP登录
  • EMAIL_HOST_PASSWORD:默认密码

我们可以在生产服务器中测试新设置。在本地计算机上的settings.py文件中进行更改,将更改提交到远程存储库。然后,在服务器中拉出新代码并重新启动Gunicorn进程:

  1. git pull

使用电子邮件凭据编辑.env文件。

然后重启Gunicorn进程:

  1. sudo supervisorctl restart boards

现在我们可以尝试启动密码重置过程:

在Mailgun仪表板上,您可以获得有关电子邮件传递的一些统计信息:


配置HTTPS证书

现在让我们使用Let's Encrypt提供的一个很好的HTTPS证书来保护我们的应用程序。

设置HTTPS从未如此简单。更好的是,我们现在可以免费获得它。他们提供了一个名为certbot的解决方案 ,负责为我们安装和更新证书。这非常简单:

  1. sudo apt-get update
  2. sudo apt-get install software-properties-common
  3. sudo add-apt-repository ppa:certbot/certbot
  4. sudo apt-get update
  5. sudo apt-get install python-certbot-nginx

现在安装证书:

  1. sudo certbot --nginx

只需按照提示操作即可。当被问及:

  1. Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.

选择2将所有HTTP流量重定向到HTTPS。

有了这个,该网站已经通过HTTPS提供服务:

设置证书的自动续订。运行以下命令编辑crontab文件:

  1. sudo crontab -e

将以下行添加到文件末尾:

  1. 0 4 * * * /usr/bin/certbot renew --quiet

该命令将每天凌晨4点运行。所有在30天内到期的证书将自动续订。

完整的Django入门指南学习笔记7 网页自动翻译的更多相关文章

  1. 完整的Django入门指南学习笔记6

    前言 欢迎来到系列教程的第六部分!在这篇教程中,我们将详细探讨基于类的视图(简称CBV).我们也将重构一些现有的视图,以便利用内置的基于类的通用视图(Generic Class-Based Views ...

  2. 完整的Django入门指南学习笔记5

    前言 欢迎来到本系列教程的第5部分,在这节课,我们将学习如何保护视图防止未登录的用户访问,以及在视图和表单中访问已经登录的用户,我们还将实现主题列表和回复列表视图,最后,将探索Django ORM的一 ...

  3. 完整的Django入门指南学习笔记2

    part2: 前沿 在第一节中,我们安装了项目所需要的一切:Python3.6以及在虚拟环境中运行的Django2.0,这部分教程继续在项目上编写代码. 开始写代码前,先讨论下项目的相关背景知识,然后 ...

  4. 完整的Django入门指南学习笔记1

    转自[https://blog.csdn.net/qq_35554125/article/details/79462885] part 1: 前沿 教程材料一共会被分为七个部分. 此教程将从安装.开发 ...

  5. 完整的Django入门指南学习笔记4

    前言 这一章节将会全面介绍 Django 的身份认证系统,我们将实现注册.登录.注销.密码重置和密码修改的整套流程. 同时你还会了解到如何保护某些试图以防未授权的用户访问,以及如何访问已登录用户的个人 ...

  6. 完整的Django入门指南学习笔记3

    前言 在本节课中,我们将深入理解两个基本概念: URLs 和 Forms.在这个过程中,我们还将学习其它很多概念,如创建可重用模板和安装第三方库.同时我们还将编写大量单元测试. 如果你是从这个系列教程 ...

  7. redis入门指南学习笔记

    redis的常见命令 set key hello get key incr num get num set foo lorem incr foo hset car price 500 hset car ...

  8. Webpack新手入门教程(学习笔记)

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 30.0px Helvetica; color: #000000 } ...

  9. Django RF:学习笔记(8)——快速开始

    Django RF:学习笔记(8)——快速开始 安装配置 1.使用Pip安装Django REST Framework: pip install djangorestframework 2.在Sett ...

随机推荐

  1. npm笔记

    #执行npm start时是运行的哪个js文件? 打开package.json看看scripts属性中start配置的是什么运行脚本,这里配置的就是你执行npm start时跑的脚本 #设置npm的源 ...

  2. python pynput监听键盘

    """小白随笔,大佬勿喷""" #键盘输入 from pynput.keyboard import Key,Controller,Liste ...

  3. C工程 交互 ceph 分布式存储系统

    网上看到有人问,如何在C项目里调用ceph系统对外提供的API,实现分布式存储. 我在网上搜到了相关信息,但是因为不是会员无法追加答案,故而,贴于此. 赠予有缘人:) ———————————————— ...

  4. ASM磁盘组剔盘、加盘实施过程

    Task:从一个ASM磁盘组中剔除一块盘,加入到另一个ASM磁盘组. 环境:AIX6.1 + Oracle RAC 11.2.0.3 前期准备: 1.查看DG磁盘组空间情况: --查看DG磁盘组空间情 ...

  5. 大数据Spark+Kafka实时数据分析案例

    本案例利用Spark+Kafka实时分析男女生每秒购物人数,利用Spark Streaming实时处理用户购物日志,然后利用websocket将数据实时推送给浏览器,最后浏览器将接收到的数据实时展现, ...

  6. Windows下安装MySql5.7(解压版本)

    Windows下安装MySql5.7(解压版本) 1. 官方地址下载MySql Server 5.7 2. 解压文件到目录d:\Soft\mysql57下 3. 在上面目录下创建文件my.ini,内容 ...

  7. EasyUI表格DataGrid格式化formatter用法

    1.通过HTML标签创建数据表格时使用formatter <!DOCTYPE html> <html> <head> <meta charset=" ...

  8. 《CSS世界》读书笔记(一)

    <!-- <CSS世界> 张鑫旭 著 --> CSS世界构建的基石是HTML,而HTML最具代表的两个基石<div>和<span>正好是CSS世界中块级 ...

  9. GoldenGate使用SQLEXEC和GETVAL实现码表关联

    使用OGG中的SQLEXEC参数,可以执行SQL语句或存储过程,再加上@GETVAL函数,可以在目标端获取源表没有的字段值.比如,源端有一个事实表和一个代码表COUNTRY_CODES,代码表中有两个 ...

  10. java开发中中文编码问题

    //ajax以get方式提交,字符串中包含中文 //后台struts中对该string的set方法中 this.jsonString = new String(jsoString.getBytes(& ...