注意事项
- 本地开发环境,在把项目代码上传到云服务器之前;要在本地进行足够的测试;而且,要把所有连接本地的一些配置,都要改为线上环境的;在项目中,写死的路径、连接,一定要统一的放到配置文件中。`d:\xx\xxx\xx.txt`
- 尽量避免出现中文路径和中文文件名。包括一些特殊字符。
本地调通,我从码云拉下代码以后重新改了一下配置
local_settings.py
# -*- coding = utf-8 -*-
import os
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
ALLOWED_HOSTS = ["*"]
DEBUG = True
# 静态文件收集目录
STATIC_ROOT = "/root/data/allstatic/"
# sqlite3
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# MySQL配置
# DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.mysql',
# 'NAME': 'day13', # 你的数据库名称
# 'USER': 'root', # 你的数据库用户名
# 'PASSWORD': '123', # 你的数据库密码
# 'HOST': "127.0.0.1", # 你的数据库主机,留空默认为localhost
# 'PORT': '3306', # 你的数据库端口
# }
# }
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379", # 安装redis的主机的 IP 和 端口
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {
"max_connections": 1000,
"encoding": 'utf-8'
},
"PASSWORD": "admin123" # redis密码
}
}
}
为了开发简单,用的是sqlite,一般会用mysql
数据库迁移
#数据不可以太多
python manage.py dumpdata > data.json
或者用mysql的命令:
mysql -hlocalhost -u root -p databasename -d day13 > day13.sql;
https://www.cnblogs.com/cloudwas/p/13072749.html
需要注意的是mysql导出的命令自带创建数据库的命令,navicat只导出数据。所以用navicat,首先要创建库,使用库以后进行loads xxx.sql
修改配置
# -*- coding = utf-8 -*-
import os
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# sqlite3
# DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
# }
# MySQL配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'day13', # 你的数据库名称
'USER': 'root', # 你的数据库用户名
'PASSWORD': 'root123', # 你的数据库密码
'HOST': "127.0.0.1", # 你的数据库主机,留空默认为localhost
'PORT': '3306', # 你的数据库端口
}
}
终端输入
# 登录到MySQL中
create database day13 CHARSET utf8mb4 COLLATE utf8mb4_bin;
pip install pymysql
# 然后在settings.py同级目录添加
import pymysql
pymysql.install_as_MySQLdb()
线上环境准备
硬件要求:一个云服务器,配置要求:2核2G内存,带宽,阿里1M;腾讯300M/400M都行;硬盘40G+;系统是cnetos7.x(7.3/7.5/7.6)。
哥们这里租的是华为云
分享xshell
推荐用xshell,可以花十块钱去淘宝买。或者用其他终端,比如tabby。
设置防火墙
systemctl stop firewalld.service# 查看防火墙状态
systemctl status firewalld.service
# 关闭防火墙
systemctl stop firewalld.service
# 禁止开机启动防火墙
systemctl disable firewalld.service
# 启动防火墙
systemctl start firewalld.service
# 防火墙随系统开启启动
systemctl enable firewalld.service
# 关闭selinux,提高了系统的安全性,但关闭它可以释放系统资源,提高服务器的性能,避免一些程序的兼容性问题等等
[root@r ~]# sed -i.ori 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl status firewalld.service
sed -i.ori 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
放开安全组
线上规划
mkdir data
cd data/
#上传文件
yum install lrzsz
rz day13.zip
unzip day13.zip
装python解释器
#这里我用的是3.10
#更新一下
yum update -y
#装依赖
yum install gcc zlib zlib-devel bzip2 bzip2-devel ncurses ncurses-devel readline readline-devel openssl openssl-devel xz lzma xz-devel sqlite sqlite-devel gdbm gdbm-devel tk tk-devel mysql-devel python-devel libffi-devel -y
更新openssl版本, 3.10更新了要求。3.9及其更早的版本不需要更新openssl
cd /usr/local/src
yum install openssl-devel bzip2-devel libffi-devel -y
yum groupinstall "Development Tools" -y
wget https://ftp.openssl.org/source/openssl-1.1.1q.tar.gz --no-check-certificate
tar -xzvf openssl-1.1.1q.tar.gz
cd openssl-1.1.1q
./config --prefix=/usr --openssldir=/etc/ssl --libdir=lib no-shared zlib-dynamic
#make和make install 比较花时间
make
make test
make install
openssl version
OpenSSL 1.1.1q 5 Jul 2022
which openssl
/usr/bin/openssl
cd /usr/local/src
#这里用华为云的源,下载更快
wget https://mirrors.huaweicloud.com/python/3.10.10/Python-3.10.10.tgz
tar -xzf Python-3.10.10.tgz
cd Python-3.10.10
#这两步比较花时间
./configure --enable-optimizations --with-openssl=/usr
make altinstall
#检查版本
python3.10
#pip设置国内源
pip3.10 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
cd
mkdir envs
cd envs/
pip3.10 install virtualenv
#设置虚拟环境
virtualenv venv
#激活
source /envs/venv/bin/activate
yum remove openssl-devel -y
pip install uwsgi
#下载依赖
cd /root/data/day13
pip install -r requirements.txt
nginx安装
yum update -y
yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel libxml2-devel libxslt-devel gd-devel GeoIP-devel jemalloc-devel libatomic_ops-devel perl-devel perl-ExtUtils-Embed
cd /usr/local/src
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0
# 这种方式nginx的安装目录为/usr/local/nginx
./configure
make && make install
或者
yum install nginx -y
在nginx的安装目录中:
- conf:存放nginx配置文件目录
- logs:存放nginx日志目录
- sbin:存放nginx可执行脚本目录
- html:存放nginx的网站站点,静态资源的目录
知道主要的目录作用,我们也就可以启动nginx了。
#配置环境变量
echo "export PATH=/usr/local/nginx/sbin:$PATH" >> /etc/profile
source /etc/profile
cd /usr/local/nginx/sbin
#启动
nginx
# 查看nginx相关进程
ps -ef | grep nginx
# 查看NGINX监听的端口
netstat -tunlp | grep nginx
# 平滑重启nginx,也就是重新读取nginx的配置文件,而不是重启进程
nginx -s reload
配置systemctl管理nginx
systemd 配置文件说明:
- 每一个 Unit 都需要有一个配置文件用于告知 systemd 对于服务的管理方式
- 配置文件存放于 /usr/lib/systemd/system/,设置开机启动后会在 /etc/systemd/system 目录建立软链接文件
- 每个Unit的配置文件配置默认后缀名为.service
- 在 /usr/lib/systemd/system/ 目录中分为 system 和 user 两个目录,一般将开机不登陆就能运行的程序存在系统服务里,也就是 /usr/lib/systemd/system
- 配置文件使用方括号分成了多个部分,并且区分大小写
cat >/lib/systemd/system/nginx.service<<EOF
[Unit] # 记录service文件的通用信息
Description=nginx # Nginx服务描述信息
After=network.target # Nginx服务启动依赖,在指定服务之后启动
[Service] # 记录service文件的service信息
Type=forking # 标准UNIX Daemon使用的启动方式
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install] # 记录service文件的安装信息
WantedBy=multi-user.target # 多用户环境下启用
EOF
cat /lib/systemd/system/nginx.service
复杂黏贴这个
cat >/lib/systemd/system/nginx.service<<EOF
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
cat /lib/systemd/system/nginx.service
如下命令输入
pkill nginx
systemctl daemon-reload
systemctl start nginx
systemctl status nginx
systemctl stop nginx
mysql安装
可以去装mariadb
装mysql:
服务端:
yum install mariadb-server -y
客户端:
yum install mariadb -y
启动:
systemctl start mariadb
设为开机启动:
systemctl enable mariadb
账号初始化:
登录:
mysql -u root -p
然后敲回车
root设置密码:
use mysql;
UPDATE user SET password=password('root123') WHERE user='root';
然后:
flush privileges;
源码装mysql
cd /usr/local
#下载
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.36-linux-glibc2.12-x86_64.tar.xz
#解压
xz -d mysql-8.0.36-linux-glibc2.12-x86_64.tar.xz
tar -xvf mysql-8.0.36-linux-glibc2.12-x86_64.tar
#改名
mv mysql-8.0.36-linux-glibc2.12-x86_64 mysql
#mysql用户组、mysql用户
groupadd mysql
useradd -r -g mysql mysql
passwd mysql
#qwe123
#修改MySQL配置文件
/etc/my.cnf
#输入
cat >/etc/my.cnf<<EOF
[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
# server_id = .....
socket = /tmp/mysql.sock
character-set-server = utf8
skip-name-resolve
log-error = /usr/local/mysql/data/error.log
pid-file = /usr/local/mysql/data/mysql.pid
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
EOF
#创建目录
mkdir data
chown -R mysql .
chgrp -R mysql .
yum install -y libaio
#初始化数据库
./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
#执行完后查看初始密码:
vim /usr/local/mysql/data/error.log
feikKjRte0!P
#启动mysql服务
./support-files/mysql.server start
#修改root密码
./bin/mysql -uroot -pfeikKjRte0!P
#注意,我这个临时密码比较奇怪。!p给我看成参数了,也可以这么输入
./bin/mysql -uroot -p
feikKjRte0!P
#修改密码
alter user 'root'@'localhost' identified by 'root123';
操作
./support-files/mysql.server restart
./support-files/mysql.server stop
./support-files/mysql.server start
#设置远程连接
create user 'root'@'%' identified with mysql_native_password by 'root123';
grant all on *.* to 'root'@'%';
flush privileges;
mysql卸载
./support-files/mysql.server stop
find / -name mysql
rm -rf /var/lib/selinux/targeted/active/modules/100/mysql
#删除配置文件
rm -f /etc/my.cnf
rm -rf /etc/init.d/mysql.server
#删除用户组
userdel mysql
id mysql
redis
#yum安装
yum install redis -y
#修改配置,比如密码
vim /etc/redis.conf
#启动
systemctl start redis
systemctl restart redis
#开机自启:
systemctl enable redis
#源码安装
cd /usr/local/
wget http://download.redis.io/releases/redis-6.2.9.tar.gz
tar xzf redis-6.2.9.tar.gz
mv redis-6.2.9 redis
cd redis
make && make install
vim /etc/redis.conf
#写入
#前台启动,改后台启动
daemonize yes
# 注意,生产中, 千万不要bind 0.0.0.0,不要将Redis暴露到外网环境,防止被人gongji
bind 0.0.0.0
#bind 127.0.0.1
requirepass admin123
redis-server /etc/redis.conf
ps -ef|grep redis |grep -v grep
配置uwsgi
cd /root/data
mkdir script
mkdir logs
vim script/uwsgi.ini
[uwsgi]
# 填写订单项目的根目录
chdir=/root/data/day13/
# 填写与项目同名的目录,这是个相对路径,主要就是找到其内的wsgi.py这个文件
module=day13.wsgi
# 虚拟环境的根目录,也就是工作目录
home=/root/envs/venv/
# uwsgi的主进程,其他的uwsgi的进程都是这个主进程的子进程,当你kill时,杀掉的也是这个master主进程
master=true
# uwsgi并发时的工作进程的数量,官网的建议是:2 * cup核数 + 1
# 由这几个进程来分摊并发请求
processes=2
# 临时使用http,实际部署时,通过nginx反向代理,就要把http换成socket,这点别忘了改
http=0.0.0.0:8000
# socket=0.0.0.0:8000
# 当服务器退出时,自动删除unix socket文件和pid文件
vacuum=true
# 默认的请求的大小为4096,如果你接收到了一个更大的请求 (例如,带有大cookies或者查询字符串),那么超过4096的限制就会报错invalid request block size: 4547 (max 4096)...skip,所以我们这里提前调整下
# https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/Options.html#buffer-size
buffer-size=32768
# uwsgi的日志文件,调试的时候别写
#logto=/root/data/logs/uwsgi.log
因为我这里用的是sqlite,所以升级一下。不然得报错
cd /usr/local/src
wget https://www.sqlite.org/2023/sqlite-autoconf-3420000.tar.gz --no-check-certificate
tar -zxvf sqlite-autoconf-3420000.tar.gz
cd sqlite-autoconf-3420000
./configure
make && make install
export LD_LIBRARY_PATH="/usr/local/lib"
source /etc/profile
修改django源码
参考:
https://www.jianshu.com/p/e81d59ccb80d
测试一下
cd /root/data
/root/envs/venv/bin/uwsgi --ini ./script/uwsgi.ini
因为我们没有用nginx代理静态资源,所以没有样式
# 临时使用http,实际部署时,通过nginx反向代理,就要把http换成socket,这点别忘了改
#http=0.0.0.0:8000
socket=0.0.0.0:8000
#相关命令
# 相对路径启动,指定配置文件启动后端
uwsgi --ini ./uwsgi.ini # 启动
# 启动时会生成两个文件,分别为:
# PID文件 标识这个程序所处的状态
# SOCK文件 用来和其他程序通信的
uwsgi --stop uwsgi.pid # 停止
uwsgi --reload uwsgi.ini # 重置
nginx静态资源
#settings.py中有类似的字段
STATIC_ROOT = "/root/data/allstatic/"
cd data/
echo "yes"|python3 ./day13/manage.py collectstatic
#这里我用的yum install nginx
vim /etc/nginx/nginx.conf
#个人的配置习惯不同,
#这里/root/data/allstatic/是root的权限,所以
user root;
#根据个人的情况适当调整
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
charset utf-8;
gzip on;
gzip_static on;
gzip_min_length 1k;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 9;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/jpeg image/gif image/png image/svg+xml;
# 所有访问80端口的请求,都转发给8000端口的服务器,即uwsgi服务
location / {
include uwsgi_params;
uwsgi_pass 0.0.0.0:8000;
}
location /static {
#注意带上斜杠
alias /root/data/allstatic/;
}
}
}
cd /root/data
/root/envs/venv/bin/uwsgi --ini ./script/uwsgi.ini
#后台运行
cd /root/data
#把日志写到/dev/null, 最后的&表示后台运行
/root/envs/venv/bin/uwsgi --ini ./script/uwsgi.ini >/dev/null 2>&1 &
ssl配置
域名备案和解析
网站部署,最好的是要有个备案好的域名,然后让其域名和你的云服务器进行域名解析,这样我们可以通过域名访问我们的云服务器了。
购买域名
购买域名,一般原则是你买个哪个厂家的云服务器,就也买哪个厂家提供的域名。
域名备案
买完了域名,然后就要去其官网找域名备案功能,备案这个流程顺利的话需要十天半个月的。
整个备案过程也是很麻烦的,大概的流程就是填写备案申请。让你提交啥材料你就提交啥材料,然后提交到云服务器厂家审核,有问题的话会有小姐姐电话联系你说你哪里需要修改,然后你就修改之后,继续提交申请,继续审核,然后这个云服务器厂家审核通过了,会给你发短信提醒:
总之域名备案是个比较麻烦的步骤,比较费时费力。
作者暂时没搞过,可以自行搜索
域名解析
这一步相当于让域名和你云服务器的公网ID做个映射,让外部访问域名就能解析到你的云服务器公网IP上去。
备案成功之后,登录云服务器控制台,找到域名解析,将备案好的域名和你的服务器进行解析,腾讯云是这个地址:https://console.cloud.tencent.com/cns。
ssl证书申请并上传到服务器
这里以腾讯云服务器为例,去腾讯云官网申请免费证书,这个地址:https://console.cloud.tencent.com/ssl
下载到本地后,直接将压缩包上传到云服务器
nginx中配置证书
配置参考腾讯云官网:https://cloud.tencent.com/document/product/400/35244?from_cn_redirect=1
注意,云服务器中的安全组注意放开443端口。
拿到证书的绝对路径
server {
#SSL 默认访问端口号为 443
listen 443 ssl;
#请填写绑定证书的域名
server_name www.xxxx123.cc;
#请填写证书文件的相对路径或绝对路径
ssl_certificate /root/cert/xxx.crt;
#请填写私钥文件的相对路径或绝对路径
ssl_certificate_key /root/cert/xxx.key;
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
}
server {
listen 80;
#请填写绑定证书的域名
server_name www.xxxx123.cc;
#把http的域名请求转成https
return 301 https://$host$request_uri;
}
完事之后:
nginx -t
nginx -s reload