django服务器部署
部署
环境: CentOS 7.4、Nginx、mysql、python38
一、项目部署准备
购买腾讯云服务
镜像信息
操作系统 CentOS 7.4 64位
二、 部署MySQL数据库 8.0
1. 检查mysql环境
1.1 查看是否有安装过mysql
rpm -qa | grep -i mysql
1.2 删除mysql
yum -y remove MySQL-*
1.3 把所有出现的目录统统删除
find / -name mysql
1.4 删除配置文件
rm -rf /etc/my.cnf
1.5 删除mysql的默认密码
rm -rf /root/.mysql_sercret
五步完成之后,这样mysql就全部删除干净了,若没安装过mysql可忽略以上步骤
2. 安装Mysql
2.1 配置Mysql 8.0安装源
sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
2.2 安装Mysql 8.0sudo yum --enablerepo=mysql80-community install mysql-community-server
- 提示下载插件选择:y
2.3 启动mysql服务
sudo service mysqld start
2.4 查看mysql服务运行状态
service mysqld status
检查是否在运行:sudo systemctl status mysqld
2.5 查看root临时密码
安装完mysql之后,会生成一个临时的密码让root用户登录
grep "A temporary password" /var/log/mysqld.log
3.更改临时密码
输入:mysql -uroot -p
在Enter password:后面输入临时密码
登录成功
输入:ALTER USER 'root'@'localhost' IDENTIFIED BY '稍稍复杂的密码';
会提示:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements(密码不符合当前策略)
方案1: 设置符合策略的密码(大小写字母+数据+符号)
方案2:密码策略改简单一点
4.配置远程访问 Navicat
输入:grant all on *.* to 'root'@'%';
flush privileges
Navicat 连接 Mysql8 [1251]错误:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '稍稍复杂的密码';
三、 安装python3环境(3.8)
1. 安装依赖包
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel
2. 安装wget
yum install wget
3. 下载源码包
wget https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz
# 解压压缩包
tar -zxvf Python-3.8.2.tgz
# 进入文件夹
cd Python-3.8.2
# 配置安装位置
./configure prefix=/usr/local/python3
# 安装
make && make install
4. 添加软连接
(默认安装了2.7)重命名旧的python软链
mv /usr/bin/python /usr/bin/python.bak
mv /usr/bin/pip /usr/bin/pip.bak
添加python3的软链接 和 添加 pip3 的软链接
ln -s /usr/local/python3/bin/python3.8 /usr/bin/python
ln -s /usr/local/python3/bin/pip3.8 /usr/bin/pip
切换python3委默认后yum出问题解决
vim /usr/libexec/urlgrabber-ext-down
vi /usr/bin/yum
首行的#! /usr/bin/python
都改为#! /usr/bin/python2.7
firewall-cmd也需要手工设置一下
# vim /usr/bin/firewall-cmd
首行改为
#!/usr/bin/python2.7 -Es
环境变量
出现问题参考:
export PYTHON_HOME=/usr/local/python3
export PATH=$PYTHON_HOME/bin:$PATH
四、配置部署Django项目
- 项目目录:/home/poetry/django_server/
- ftp文件传输 安装 FileZilla Client 上传代码,后面考虑用git
- 创建和进入python虚拟环境:
cd /home/poetry/
python -m venv venv
. venv/bin/activate
- 添加 mysqlclient (这个单独安装)
yum install mysql-devel gcc-devel python-devel
python -m pip install mysqlclient -i https://pypi.tuna.tsinghua.edu.cn/simple/
- 添加其他依赖
- 项目以来的其他python库 DependentLibraries.txt
//DependentLibraries.txt
django==3.0.8
channels==2.4.0
channels-redis==3.0.1
django-cors-headers==3.4.0
pymysql
mysqlclient==2.0.1
xpinyin
requests
python -m pip install -r DependentLibraries.txt
- 数据迁移
python manage.py makemigrations
python manage.py migrate
- 启动服务器: python manage.py runserver 0.0.0.0:8888 ,可以访问
- 退出虚拟环境:deactivate
1. 继续安装uwsgi
python -m pip install uwsgi
给uwsgi建立软链接: ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
测试: uwsgi --http :8001 --wsgi-file test.py
配置: uwsgi 文件 创建 /home/poetry/django_server/uwsgi/uwsgi.ini
启动: uwsgi --ini /home/poetry/django_server/uwsgi/uwsgi.ini
查看: ps -aux | grep uwsgi
- uwsgi.ini
# uwsgi.ini file path;/home/poetry/django_server/uwsgi/uwsgi.ini
[uwsgi]
#此处填写项目地址,我的Django项目地址是/home/poetry/django_server
chdir = /home/poetry/django_server
#虚拟环境的目录
home = /home/poetry/venv
# 设置使用插件
plugins = python
# wsgi文件
module = template_server.wsgi:application
# process-related settings
# master
master = True
# 进程数量
processes = 4
#最大请求
max-requests = 5000
#请求超时时间(单位秒)
harakiri = 60
#设置监听端口
socket = 127.0.0.1:8889
#使用用户组,使用root用户比较危险
uid = 1000
gid = 2000
#快捷启动重启目录
pidfile = /home/poetry/django_server/uwsgi/master.pid
#此处配置的为日志文件存放的地方
daemonize = /home/poetry/django_server/uwsgi/my_uwsgi.log
#服务器停止后进行回收log文件等操作
vacuum = True
#静态文件目录
static-map = /static=/home/poetry/django_server/static
2. nginx安装
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install nginx
准备工具:
sudo yum install yum-utils
创建nginx.repo文件
sudo vim /etc/yum.repos.d/nginx.repo
- 并添加以下内容
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
- 编辑配置文件
vim /etc/nginx/conf.d/myconf.conf
#Nginx反向代理服务器,主要功能就是将发送到指定端口的数据转发到相应的服务器中
server {
listen 80; # 监听80端口
server_name 111.111.111.1; # 路径前面的url名称,也就是你在浏览器中输入访问这个服务器的网址,比如1.1.1.10
access_log /var/log/nginx/access.log main; # Nginx日志配置
charset utf-8; # Nginx编码
client_max_body_size 75M;#最大上传大小
error_page 404 /404.html; # 配置notfound错误页面
error_page 500 502 503 504 /50x.html; # 配置50X错误页面
# 指定项目路径uwsgi,此处配置的就是Nginx和uwsgi之间的代理
location / {
include /etc/nginx/uwsgi_params; # 导入Nginx的模块,这个模块是用来和uWSGI进行通讯的
uwsgi_connect_timeout 30; # 设置连接uWSGI超时时间
uwsgi_pass 127.0.0.1:8889; # 指定uwsgi的sock文件,此处填写要和uwsgi配置文件中的socket后面是一样的
}
location /media{
alias /home/poetry/django_server/;
}
# 指定静态文件路径,此处指定你的CSS和JS的文件路径,也就是你Django项目中的静态文件夹的地址,配置不好,所有的CSS以及JS效果都看不到
location /static{
alias /home/poetry/django_server/static;
}
}
检测配置文件是否正确(正确打印如下)
nginx -t
出现打印:nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
启动nginx服务
service nginx restart
查看以运行服务
netstat -ntpl
重新加载uwsgi
uwsgi --reload /home/poetry/django_server/uwsgi/master.pid
ps -ef | grep uwsgi
3. django 静态文件 配置到 nginx 、 uwsgi:
- django setting.py 添加
STATIC_ROOT = os.path.join( BASE_DIR, '/static/' )
- uwsgi中添加配置
static-map = /static=/home/poetry/django_server/static
- (虚拟环境)收集项目静态文:
python manage.py collectstatic
- nginx 配置 vim /etc/nginx/conf.d/myconf.conf
指定静态文件路径,此处指定你的CSS和JS的文件路径,也就是你Django项目中的静态文件夹的地址,配置不好,所有的CSS以及JS效果都看不到
location /static{
alias /home/poetry/django_server/static;
}
写在最后
应用程序常驻后台
方法一
nohup python3 manage.py runserver 0.0.0.0:9090 &
&可以不写,这样启动测试服务器后,就可以常驻后台运行了。
方法二 (建议)
配置uwsgi nginx 服务器
查看后台某个进程
ps -ef|grep “python”
杀死进程:
kill -9 进程号
ssl证书
server {
listen 443;
server_name 网站域名或者ip;
ssl on;
ssl_certificate cert/尾缀为pem的那个文件.pem;
ssl_certificate_key cert/尾缀为可以的那个文件.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#密码加密方式
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码
ssl_prefer_server_ciphers on;
charset utf-8;
client_max_body_size 75M;
location /static/ {
alias /项目的绝对路径/static_dist/;
}
location / {
uwsgi_pass 自定义1;
include uwsgi_params;
uwsgi_read_timeout 30;
}
}
#监控80端口,强制跳转到443端口
server {
listen 80;
server_name 域名或ip;
rewrite ^(.*)$ https://www.$server_name$1 permanent;
}