超详细Python教程——项目部署上线指南(python 项目)

超详细Python教程——项目部署上线指南项目部署上线指南
准备上线 上线前的检查工作。 python manage.py check –deploy将DEBUG设置为False并配置ALLOWED_HOSTS。 DEBUG Fals

项目部署上线指南

准备上线

上线前的检查工作。

python 管理.py 检查–deploy

将DEBUG 设置为False 并配置ALLOWED_HOSTS。

调试=假

ALLOWED_HOSTS=[\’*\’]

安全相关配置。

# 维持HTTPS连接的时间

SECURE_HSTS_SECONDS=3600

SECURE_HSTS_INCLUDE_SUBDOMAINS=True

SECURE_HSTS_PRELOAD=True

# 自动重定向到安全连接

SECURE_SSL_REDIRECT=真

# 防止浏览器猜测内容类型

SECURE_CONTENT_TYPE_NOSNIFF=True

# 避免跨站脚本攻击

SECURE_BROWSER_XSS_FILTER=True

# COOKIE只能通过HTTPS传输

SESSION_COOKIE_SECURE=True

CSRF_COOKIE_SECURE=True

# 防止点击劫持攻击——修改HTTP协议响应头

# 当前网站无法使用iframe标签进行加载。

X_FRAME_OPTIONS=\’拒绝\’

将敏感信息放置在环境变量或文件中。

SECRET_KEY=os.environ[\’SECRET_KEY\’]

DB_USER=os.environ[\’DB_USER\’]

DB_PASS=os.environ[\’DB_PASS\’]

REDIS_AUTH=os.environ[\’REDIS_AUTH\’]

更新服务器Python环境到3.x

注意:如果需要清除以前的安装,只需删除相应的文件和文件夹即可。

安装底层依赖库。

yum -y 安装zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel libdb4-devel libpcap-devel xz-devel libffi-devel libxml2

下载Python源代码。

wget https://www.python.org/ftp/python/3.7.6/Python-3.7.6.tar.xz

检查下载的文件。

md5sumPython-3.7.6.tar.xz

解压缩并取消存档。

xz -dPython-3.7.6.tar.xz

tar -xvf Python-3.7.6.tar

执行安装前配置(生成Makefile文件)。

cdPython-3.7.6

./configure –prefix=/usr/local/python37 –enable-optimizations

构建并安装。

进行安装

设置PATH环境变量(用户或系统环境变量)并启用它。

vim ~/.bash_profile

vim /etc/配置文件

.上面的代码这里就省略了.

导出PATH=$PATH:/usr/local/python37/bin

.下面的代码已被省略.

来源~/.bash_profile

源/etc/profile

注册软链接(符号链接) – 此步骤不是必需的,但通常很有用。

ln -s /usr/local/python37/bin/python3 /usr/bin/python3

测试你的Python环境是否更新成功(Python 3安装一定不能破坏原来的Python 2)。

python3——版本

Python –版本

项目目录结构

假设你的项目文件夹是project,下面五个子目录分别是code、conf、logs、stat和venv,分别存放项目代码、配置文件、日志文件、静态资源和虚拟环境。 conf目录下的cert子目录存放配置HTTPS所需的证书和密钥。代码目录下的项目代码可以通过版本控制工具从代码仓库中检出。例如:venv、virtualenv、pyenv 等)。

项目

代码

方特库斯

API

常见

fangtx

论坛

租金

用户

管理.py

自述文件.md

静态

模板

设置

证书

214915882850706.key

214915882850706.pem

nginx.conf

uwsgi.ini

日志

访问.log

错误.log

uwsgi.log

现状

CSS

图片

js

旺夫

瓶子

开始

激活.csh

激活.fish

芹菜

芹菜甜菜

Cerolide

芹菜覆盖物

采访

专访3

覆盖范围-3.7

django-admin

django-admin.py

easy_install

easy_install-3.7

皮普

点3

pip3.7

__pycache__

Pyrsa-解密

pyrsa-解密大文件

pyrsa-加密

pyrsa-加密-bigfile

pyrsa-keygen

pyrsa-priv2pub

皮尔萨标志

pyrsa-验证

python – python3

python3 – /usr/bin/python3

uwsgi

包括

图书馆

python3.7

lib64-lib

pip-selfcheck.json

pyvenv.cfg

下面以阿里云为例,简单介绍一下如何为您的项目注册域名、解析域名以及购买权威机构颁发的证书。

域名注册。

域名注册。

域名系统。

购买证书。

您可以使用类似sftp的工具将证书上传到conf/cert目录,并使用git将项目代码克隆到代码目录中。

光盘代码

git 克隆URL

返回您的项目目录并创建并激活您的虚拟环境。

python3 -m venv venv

源venv/bin/activate

重建项目依赖关系。

pip install -r 代码/团队项目/requirements.txt

uWSGI的配置

安装uWSGI。

pip 安装uwsgi

修改uWSGI配置文件(/root/project/conf/uwsgi.ini)。

[臼]

# 设置起始路径

基础=/根目录/项目

#设置项目名称

名称=团队项目

# 守护进程

大师=真

# 进程数

进程=4

# 虚拟环境

pythonhome=%(base)/venv

# 项目地址

chdir=%(基本)/代码/%(名称)

#指定Python解释器

pythonpath=%(pythonhome)/bin/python

#指定uwsgi文件

模块=%(名称).wsgi

# 通讯地址和端口(你的服务器的IP地址和端口)

套接字=172.18.61.250:8000

# 日志文件地址

logto=%(base)/logs/uwsgi.log

注意:将“通讯地址和端口”项前面的等号改为http进行测试,如果可以则改回socket,然后使用Nginx实现“动静分离”。项目内容(静态资源传给Nginx处理,动态内容传给uWSGI处理)。要启动uWSGI服务器,请按照以下步骤操作。

启动服务器。

nohup uwsgi –ini conf/uwsgi.ini

Nginx的配置

安装Nginx。

安装yum -y nginx

修改全局配置文件(/etc/nginx/nginx.conf)。

用户设置

用户nginx。

#运行进程数(建议与CPU核数匹配)

工人流程自动化;

# 错误日志

错误日志/var/log/nginx/error.log;

# 处理文件

pid /run/nginx.pid;

# 包含其他配置

包含/usr/share/nginx/modules/*.conf。

# 运行模式(多路IO复用模式)及连接上限

事件{

使用epoll。

工人连接1024;

}

# HTTP服务器相关设置

http{

# 日志格式

log_format main \’$remote_addr – $remote_user [$time_local] \’$request\’ \’

\’$status $body_bytes_sent \’$http_referer\’ \’

\’\’$http_user_agent\’ \’$http_x_forwarded_for\’;

#访问日志

access_log /var/log/nginx/access.log main;

# 启用高效文件传输模式

发送文件。

# 使用sendfile传输文件以获得更好的性能

tcp_no 继续推送;

# 禁用Nagle 以解决交互问题

tcp_nolay 已打开。

#客户端维护连接时间

保活超时30;

type_hash_max_size 2048;

# 包含MIME类型设置

包括/etc/nginx/mime.types。

#默认使用二进制流格式

默认类型应用程序/八位字节流;

#包含其他配置文件

包括/etc/nginx/conf.d/*.conf。

# 包含项目的Nginx配置文件

包含/root/project/conf/*.conf。

}

编辑本地配置文件(/root/project/conf/nginx.conf)。

服务器{

听80。

服务器名称_;

访问日志/root/project/logs/access.log;

错误日志/root/project/logs/error.log;

位置/{

包括uwsgi_params。

uwsgi_pass 172.18.61.250:8000;

}

位置/静态/{

别名/root/project/stat/;

有效期为30 天。

}

}

服务器{

听443。

服务器名称_;

SSL 开启。

访问日志/root/project/logs/access.log;

错误日志/root/project/logs/error.log;

ssl_certificate /root/project/conf/cert/214915882850706.pem;

ssl_certificate_key /root/project/conf/cert/214915882850706.key;

ssl_session_timeout 5 分钟;

ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:NULL:aNULL:MD5:ADH:RC4;

ssl_协议TLSv1 TLSv1.1 TLSv1.2;

ssl_prefer_server_ciphers 已打开。

位置/{

包括uwsgi_params。

uwsgi_pass 172.18.61.250:8000;

}

位置/静态/{

别名/root/project/static/;

有效期为30 天。

}

}

此时,您可以启动Nginx 并访问您的应用程序。如果Nginx已经运行,可以使用以下命令修改配置文件后重新启动Nginx:

重新启动Nginx 服务器。

nginx -s 重新加载

或者

systemctl 重新启动nginx

注意:您可以在Django 项目中使用python manage.pycollectstatic 命令将静态资源收集到指定目录中。为此,只需将STATIC_ROOT 配置添加到项目的配置文件settings.py 中即可。

负载均衡配置

下面的配置使用Nginx 实现负载均衡,并向另外三台Nginx 服务器(通过Docker 创建)提供反向代理服务。

docker run -d -p 801:80 –name nginx1 nginx:latest

docker run -d -p 802:80 –name nginx2 nginx:latest

docker run -d -p 803:80 –name nginx3 nginx:latest

用户根。

工人流程自动化;

错误日志/var/log/nginx/error.log;

pid /run/nginx.pid;

包含/usr/share/nginx/modules/*.conf。

事件{

工人连接1024;

}

# 配置HTTP服务负载均衡

http{

上游xx {

服务器192.168.1.100权重=2;

服务器192.168.1.101权重=1;

服务器192.168.1.102权重=1;

}

服务器{

80 监听默认服务器。

监听[:]:80默认服务器;

443 监听SSL。

请听[:]:443 ssl;

SSL 开启。

访问日志/root/project/logs/access.log;

错误日志/root/project/logs/error.log;

ssl_certificate /root/project/conf/cert/214915882850706.pem;

ssl_certificate_key /root/project/conf/cert/214915882850706.key;

ssl_session_timeout 5 分钟;

ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:NULL:aNULL:MD5:ADH:RC4;

ssl_协议TLSv1 TLSv1.1 TLSv1.2;

ssl_prefer_server_ciphers 已打开。

位置/{

proxy_set_header 主机$host;

proxy_set_header X-Forwarded-For $remote_addr;

# proxy_set_header X-真实IP $remote_addr;

# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

代理缓冲已关闭。

代理路径http://fangtx;

}

}

}

注意:Nginx在配置负载均衡时默认使用WRR(加权轮询算法)。此外,它还支持ip_hash、fair(需要安装upstream_fair模块)和url_hash算法。另外,在配置upstream模块时,可以指定服务器状态值,例如: backup(备份机器,只有在没有其他服务器可用的情况下,请求才分配到本机)、down、fail_timeout(服务中断时间)、max_fails)、max_fails(允许请求失败次数)、weight(轮询权重)达到。

Keepalived

在负载均衡配置中使用Nginx 时,必须考虑负载均衡服务器停机时间。为此,可以使用Keepalived实现负载均衡主机和备机之间的热切换,保证系统的高可用性。 Keepalived的配置还是比较复杂的,一般是由专门的运维人员来配置。有关基本配置,请参见《Keepalived的配置和使用》。

MySQL主从复制

下面仍然基于Docker来演示如何配置MySQL主从复制。提前准备好MySQL配置文件以及保存MySQL数据和执行日志的目录,并通过Docker的数据卷映射指定容器配置文件、数据文件和日志文件的位置。

mysql

大师

设置

| 数据

Slave-1

| 设置

| 数据

Slave-2

| 设置

| 数据

Slave-3

设置

数据

MySQL配置文件(主从配置文件需要不同的服务器ID)。

[mysqld]

pid-file=/var/run/mysqld/mysqld.pid

套接字=/var/run/mysqld/mysqld.sock

数据目录=/var/lib/mysql

日志错误=/var/log/mysql/error.log

服务器ID=1

log-bin=/var/log/mysql/mysql-bin.log

过期日志天=30

max_binlog_size=256M

符号链接=0

# 慢查询日志=ON

#slow_query_log_file=/var/log/mysql/slow.log

#long_query_time=1

创建并配置主站。

docker run -d -p 3306:3306 –name mysql-master \\

-v /root/mysql/master/conf:/etc/mysql/mysql.conf.d \\

-v /root/mysql/master/data:/var/lib/mysql \\

-e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

docker exec -it mysql-master /bin/bash

mysql -u 根-p

请输入您的密码:

欢迎使用MySQL 监视器。命令以; 或\\g 结尾。

MySQL连接ID为1

服务器版本: 5.7.23 日志MySQL 社区服务器(GPL)

版权所有(c) 2000、2018,Oracle 和/或其附属公司保留所有权利。

Oracle 是Oracle Corporation 的注册商标和/或其注册商标。

其他名称可能是其各自附属公司的商标。

拥有者。

输入“help;”或“\\h”获取帮助,或输入“\\c”清除当前输入语句。

mysql 允许*.* 复制从属设备到由“iamslave”标识的“slave”@“%”。

查询正常,0 行受影响,1 条警告(0.00 秒)

mysql flash 权限。

查询正常,0 行受影响(0.00 秒)

mysql显示主站

tus;
+——————+———-+————–+——————+——————-+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+——————+———-+————–+——————+——————-+
| mysql-bin.000003 | 590 | | | |
+——————+———-+————–+——————+——————-+
1 row in set (0.00 sec)
mysql> quit
Bye
exit
上面创建Docker容器时使用的-v参数(–volume)表示映射数据卷,冒号前是宿主机的目录,冒号后是容器中的目录,这样相当于将宿主机中的目录挂载到了容器中。
备份主表中的数据(如果需要的话)。
mysql> flush table with read lock;
mysqldump -u root -p 123456 -A -B > /root/backup/mysql/mybak$(date +\”%Y%m%d%H%M%S\”).sql
mysql> unlock table;
创建和配置slave。
docker run -d -p 3308:3306 –name mysql-slave-1 \\
-v /root/mysql/slave-1/conf:/etc/mysql/mysql.conf.d \\
-v /root/mysql/slave-1/data:/var/lib/mysql \\
-e MYSQL_ROOT_PASSWORD=123456 \\
–link mysql-master:mysql-master mysql:5.7
docker run -d -p 3309:3306 –name mysql-slave-2 \\
-v /root/mysql/slave-2/conf:/etc/mysql/mysql.conf.d \\
-v /root/mysql/slave-2/data:/var/lib/mysql \\
-e MYSQL_ROOT_PASSWORD=123456 \\
–link mysql-master:mysql-master mysql:5.7
docker run -d -p 3310:3306 –name mysql-slave-3 \\
-v /root/mysql/slave-3/conf:/etc/mysql/mysql.conf.d \\
-v /root/mysql/slave-3/data:/var/lib/mysql \\
-e MYSQL_ROOT_PASSWORD=123456 \\
–link mysql-master:mysql-master mysql:5.7
docker exec -it mysql-slave-1 /bin/bash
mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \\g.
Your MySQL connection id is 2
Server version: 5.7.23-log MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type \’help;\’ or \’\\h\’ for help. Type \’\\c\’ to clear the current input statement.
mysql> reset slave;
Query OK, 0 rows affected (0.02 sec)
mysql> change master to master_host=\’mysql-master\’, master_user=\’slave\’, master_password=\’iamslave\’, master_log_file=\’mysql-bin.000003\’, master_log_pos=590;
Query OK, 0 rows affected, 2 warnings (0.03 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
mysql> show slave status\\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: mysql57
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 590
Relay_Log_File: f352f05eb9d0-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 590
Relay_Log_Space: 534
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 30c38043-ada1-11e8-8fa1-0242ac110002
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
mysql> quit
Bye
exit
接下来可以如法炮制配置出slave2和slave3,这样就可以搭建起一个“一主带三从”的主从复制环境。上面创建创建容器时使用的–link参数用来配置容器在网络上的主机名(网络地址别名)。

配置好主从复制后,写数据的操作应该master上执行,而读数据的操作应该在slave上完成。为此,在Django项目中需要配置DATABASE_ROUTERS并通过自定义的主从复制路由类来实现读写分离操作,如下所示:

DATABASE_ROUTERS = [
# 此处省略其他配置
\’common.routers.MasterSlaveRouter\’,
]

class MasterSlaveRouter(object):
\”\”\”主从复制路由\”\”\”
@staticmethod
def db_for_read(model, **hints):
\”\”\”
Attempts to read auth models go to auth_db.
\”\”\”
return random.choice((\’slave1\’, \’slave2\’, \’slave3\’))
@staticmethod
def db_for_write(model, **hints):
\”\”\”
Attempts to write auth models go to auth_db.
\”\”\”
return \’default\’
@staticmethod
def allow_relation(obj1, obj2, **hints):
\”\”\”
Allow relations if a model in the auth app is involved.
\”\”\”
return None
@staticmethod
def allow_migrate(db, app_label, model_name=None, **hints):
\”\”\”
Make sure the auth app only appears in the \’auth_db\’
database.
\”\”\”
return True

上面的内容参考了Django官方文档的DATABASE_ROUTERS配置,对代码进行了适当的调整。

Docker

事实上,项目上线中最为麻烦的事情就是配置软件运行环境,环境的差异会给软件的安装和部署带来诸多的麻烦,而Docker正好可以解决这个问题。关于Docker在之前的文档中我们已经介绍过了,接下来我们对Docker的知识做一些必要的补充。

创建镜像文件。
将容器保存成镜像:
docker commit -m \”…\” -a \”jackfrued\” <container-name> jackfrued/<image-name>
使用Dockerfile构建镜像:
# 指定基础镜像文件
FROM centos:latest
# 指定维护者信息
MAINTAINER jackfrued
# 执行命令
RUN yum -y install gcc
RUN cd ~
RUN mkdir -p project/code
RUN mkdir -p project/logs
# 拷贝文件
COPY …
# 暴露端口
EXPOSE …
# 在容器启动时执行命令
CMD ~/init.sh
docker build -t jackfrued/<image-name> .
镜像的导入和导出。
docker save -o <file-name>.tar <image-name>:<version>
docker load -i <file-name>.tar
推送到DockerHub服务器。
docker tag <image-name>:<version> jackfrued/<name>
docker login
docker push jackfrued/<name>
容器之间的通信。
docker run –link <container-name>:<alias-name>

如果我们能够在Docker中完成项目的部署,并且将整个部署好的容器打包成镜像文件进行分发和安装,这样就可以解决项目在多个节点上进行部署时可能遇到的麻烦,而且整个部署可以在很短的时间内完成。

Supervisor

Supervisor是一个用Python写的进程管理工具,可以很方便的用来在类Unix系统下启动、重启(自动重启程序)和关闭进程,目前Supervisor暂时还没有提供对Python 3的支持,可以通过Python 2来安装和运行Supervisor,再通过Supervisor来管理Python 3的程序。

提示:还有一个和Supervisor功能类似的工具名为Circus,支持Python 3。

安装Supervisor。
virtualenv -p /usr/bin/python venv
source venv/bin/activate
pip install supervisor
查看Supervisor的配置文件。
vim /etc/supervisord.conf
; 此处省略上面的代码
; The [include] section can just contain the \”files\” setting. This
; setting can list multiple files (separated by whitespace or
; newlines). It can also contain wildcards. The filenames are
; interpreted as relative to this file. Included files *cannot*
; include files themselves.
[include]
files = supervisord.d/*.ini
可以看出自定义的管理配置代码可以放在/etc/supervisord.d目录中,并且文件名以ini作为后缀即可。
编写自己的配置文件fangtx.ini并放在/etc/supervisord.d目录中。
[program:project]
command=uwsgi –ini /root/project/conf/uwsgi.ini
stopsignal=QUIT
autostart=true
autorestart=true
redirect_stderr=true
[program:celery]
; Set full path to celery program if using virtualenv
command=/root/project/venv/bin/celery -A fangtx worker
user=root
numprocs=1
stdout_logfile=/var/log/supervisor/celery.log
stderr_logfile=/var/log/supervisor/celery_error.log
autostart=true
autorestart=true
startsecs=10
; Need to wait for currently executing tasks to finish at shutdown.
; Increase this if you have very long running tasks.
;stopwaitsecs = 600
; When resorting to send SIGKILL to the program to terminate it
; send SIGKILL to its whole process group instead,
; taking care of its children as well.
killasgroup=true
; Set Celery priority higher than default (999)
; so, if rabbitmq is supervised, it will start first.
priority=1000
启动Supervisor。
supervisorctl -c /etc/supervisord.conf

其他服务

常用开源软件。

功能开源方案版本控制工具Git、Mercurial、SVN缺陷管理Redmine、Mantis负载均衡Nginx、LVS、HAProxy邮件服务Postfix、SendmailHTTP服务Nginx、Apache消息队列RabbitMQ、ZeroMQ、Redis、Kafka文件系统FastDFS基于位置服务(LBS)MongoDB、Redis监控服务Nagios、Zabbix关系型数据库MySQL、PostgreSQL非关系型数据库MongoDB、Redis、Cassandra、TiDB搜索引擎ElasticSearch、Solr缓存服务Mamcached、Redis 常用云服务。

功能可用的云服务团队协作工具Teambition、钉钉代码托管平台Github、Gitee、CODING邮件服务SendCloud云存储(CDN)七牛、OSS、LeanCloud、Bmob、又拍云、S3移动端推送极光、友盟、百度即时通信环信、融云短信服务云片、极光、Luosimao、又拍云第三方登录友盟、ShareSDK网站监控和统计阿里云监控、监控宝、百度云观测、小鸟云

#以上关于超详细Python教程——项目部署上线指南的相关内容来源网络仅供参考,相关信息请以官方公告为准!

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/93920.html

Like (0)
CSDN的头像CSDN
Previous 2024年7月26日
Next 2024年7月26日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注