项目上线

一、购买阿里云服务器

# 购买一台服务
	-项目跑在服务器上
    -购买公网ip:别人访问我们的ip,就能访问到我们的项目
    -购买域名:备案--->访问域名--->转发到你的ip
    
# 阿里云,华为云,腾讯云
	-按量付费
    -阿里云服务器地址:https://ecs.console.aliyun.com/home


# 链接linux服务器
	方式一:cmd窗口直接链接
    	管理员运行cmd
        ssh root@47.94.149.117
        输入密码
    方式二:用finalshell链接、Xshell链接
    
# 下载 finalshell ,远程链接linux服务器的
	http://www.hostbuf.com/t/988.html
# 我使用Xshell链接

内网穿透方案:https://zhuanlan.zhihu.com/p/370483324

链接

cmd链接

C:\WINDOWS\system32>ssh root@47.94.149.117
The authenticity of host '47.94.149.117 (47.94.149.117)' can't be established.
ECDSA key fingerprint is SHA256:X8vQYqD11vzPdcT9D6n3ZgY/K80h4XgvbYOU3IK7rBE.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '47.94.149.117' (ECDSA) to the list of known hosts.
root@47.94.149.117's password:

Welcome to Alibaba Cloud Elastic Compute Service !

Activate the web console with: systemctl enable --now cockpit.socket

[root@iZ2ze3wvcie3ks4ttycl4cZ ~]#
[root@iZ2ze3wvcie3ks4ttycl4cZ ~]#
# 已经进入到远程服务器中了

Xshell链接

cat>>/etc/profile.d/color.sh<<"EOF"
alias ll='ls -l --color=auto --time-style=long-iso'
PS1="\[\e[37;40m\][\[\e[32;1m\]\u\[\e[37;40m\]@\h \[\e[36;40m\]\w\[\e[0m\]]\[\e[32;1m\]\\$ \[\e[0m\]"
export HISTTIMEFORMAT='%F-%T '
EOF
source /etc/profile 

linux命令

hostname  # 主机名
cd ~ # 回到root家路径
cd   # 回到用户家路径
wget  # 下载命令
ls  # 查看当前目录下的文件,也可以指定查看目录
ll  # 也是查看,文件更多,可以查看到隐藏文件
rm -rf  # 删除
ps aux | grep nginx  # 查看nginx进程
:q  # 退出
:wq  # 保存退出
mv  # 移动文件

二、上线架构图

三、安装重要的配置

3.1 安装git

# 方式一:
	yum install git -y
    
# 方式二:(还会装开发会用的软件)
	yum -y groupinstall "Development tools"
	

# 执行下面这条,是安装一些依赖
	yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel -y

3.2 安装mysql

# mysql 5.7 
# 前往用户根目录
cd ~

# 下载mysql57
wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm


# 安装mysql57
yum -y install mysql57-community-release-el7-10.noarch.rpm
yum install mysql-community-server --nogpgcheck -y  # 不检查密钥安装mysql服务端


# 启动mysql57并查看启动状态
systemctl start mysqld
systemctl status mysqld

# 查看默认密码并登录
grep "password" /var/log/mysqld.log   # 9sWry%syd>9>
mysql -uroot -p

# 修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Lqz12345?';

Centos7上安装Mysq:https://zhuanlan.zhihu.com/p/616550551

3.3 安装redis

###### 官方下载编译好的reids
# 下载
wget https://packages.redis.io/redis-stack/redis-stack-server-6.2.6-v7.rhel7.x86_64.tar.gz

# 解压
tar -xf redis-stack-server-6.2.6-v7.rhel7.x86_64.tar.gz

# 重命名
mv redis-stack-server-6.2.6-v7/ redis

# 到bin目录下
cd redis/bin
# 启动redis
./redis-server   # 启动redis,使用默认配置启动的


# 想在任意路径下敲redis-server都能把服务运行,
	-方式一:把bin路径加入到环境变量
    -方式二:使用软连接, /usr/bin/本身在环境变量 ,在任意路径敲redis-server redis-cli都能找到 
    ln -s /root/redis/bin/redis-server /usr/bin/redis-server
    ln -s /root/redis/bin/redis-cli /usr/bin/redis-cli
    
#查看是否创建软连接成功
ls |grep redis

# 启动redis服务,后台运行
redis-server &

# 删除redis
rm -rf redis


###### 源码安装---->
# 下载redis-6.2.6
wget http://download.redis.io/releases/redis-6.2.6.tar.gz

# 解压安装包
tar -xf redis-6.2.6.tar.gz

# 进入目标文件
cd redis-6.2.6

# 编译环境 gcc   在src路径下把源码编译出  redis-cli  reidis-server
make   

# 复制环境到指定路径完成安装
cp -r ~/redis-6.2.6 /usr/local/redis

# 配置redis可以后台启动:修改下方内容
vim /usr/local/redis/redis.conf
daemonize yes

# 完成配置修改
esc
:wq

# 建立软连接
ln -s /usr/local/redis/src/redis-server /usr/bin/redis-server
ln -s /usr/local/redis/src/redis-cli /usr/bin/redis-cli

# 后台运行redis
cd /usr/local/redis
redis-server ./redis.conf

# 测试redis环境
redis-cli


# 关闭redis服务
pkill -f redis -9
redis-cli  shutdown

3.4 安装python

# 可以使用yum 安装,不能指定版本
# 源码安装,下载指定版本的源码,编译安装

# 所有linxu和mac,都自带python2:系统服务,是用python写的
# 阿里云的centos默认装了python3.6.8
# python2.7     python3.6.8     python3.9


#0 源码安装python,依赖一些第三方zlib* libffi-devel
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel zlib* libffi-devel  -y

#1 前往用户根目录
cd ~

#2 下载 或 上传 Python3.9.10  服务器终端
# https://registry.npmmirror.com/binary.html?path=python/
# wget https://registry.npmmirror.com/-/binary/python/3.8.6/Python-3.8.6.tgz
wget https://registry.npmmirror.com/-/binary/python/3.9.10/Python-3.9.10.tgz
# wget https://www.python.org/ftp/python/3.9.16/Python-3.9.16.tgz

#3 解压安装包
tar -xf Python-3.9.10.tgz 

#4 进入目标文件
cd Python-3.9.10

#5 配置安装路径:/usr/local/python3
# 把python3.9.10 编译安装到/usr/local/python38路径下
./configure --prefix=/usr/local/python39

# 如果报错,说明缺依赖
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel zlib* libffi-devel  -y

#6 编译并安装
make &&  make install

#7 建立软连接:/usr/local/python38路径不在环境变量,终端命令 python3,pip3
ln -s /usr/local/python39/bin/python3 /usr/bin/python3.9
ln -s /usr/local/python39/bin/pip3 /usr/bin/pip3.9

# 机器上有多个python和pip命令,对应关系如下
python       3.x      pip 
python3      3.6      pip3
python3.9    3.9      pip3.9

#8 删除安装包与文件:
rm -rf Python-3.9.10
rm -rf Python-3.9.10.tar.xz -r
# -r 表示递归删除,文件夹要写-r

3.5 安装虚拟环境


#1 安装依赖
pip3.9 install virtualenv
# 如果出现问题,解决方案:
# python3.9 -m pip install --upgrade pip
# python3.9 -m pip install --upgrade setuptools
# pip3.9 install pbr
pip3.9 install virtualenvwrapper

#2 建立虚拟环境软连接
ln -s /usr/local/python39/bin/virtualenv /usr/bin/virtualenv

#3 配置虚拟环境:填入下方内容
# ~/ 表示用户家路径:root用户,就是在/root/.bash_profile
vi ~/.bash_profile  
# 按 a
# 光标上下控制,粘贴上下面内容

VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.9
source /usr/local/python39/bin/virtualenvwrapper.sh

#4 退出编辑状态
esc

# 保存修改并退出
:wq

#5 更新配置文件内容
source ~/.bash_profile

# 虚拟环境默认根目录:/root/.virtualenvs


#6 创建luffy虚拟环境
mkvirtualenv -p python3.9 luffy



#7 进入虚拟环境
workon luffy

# 退出虚拟环境
deactivate

3.6 安装uwsgi

# django 项目上线需要使用uwsgi这个web服务器运行django项目,安装这个web服务器
# 使用uwsgi运行django,不再使用测试阶段的wsgiref来运行django了

# uwsgi是符合wsgi协议的web服务器,使用c写的性能高,上线要使用uwsgi

# 安装步骤
1)在真实环境下安装
pip3.9 install uwsgi
#安装到了python38的安装路径的bin路径下了

2)建立软连接
ln -s /usr/local/python39/bin/uwsgi /usr/bin/uwsgi

3)任意路径下,敲
uwsgi  # 有响应,就是安装成功

3.7 安装nginx

# 反向代理服务器
	- 做请求转发 
    - 静态资源代理
    - 负载均衡,一个nginx可以把请求转发给两个uwsgi
    
    
    
#1 前往用户根目录
cd ~

#2 下载nginx1.13.7
# wget http://nginx.org/download/nginx-1.13.7.tar.gz
wget http://nginx.org/download/nginx-1.20.0.tar.gz
    
#3 解压安装包
tar -xf nginx-1.20.0.tar.gz

#4 进入目标文件
cd nginx-1.20.0

#5 配置安装路径:/usr/local/nginx
./configure --prefix=/usr/local/nginx
# 缺少PCRE包,先安装上,再执行上面一句话
# yum -y install pcre-devel


#6 编译并安装
make &&  make install

#7 建立软连接:终端命令 nginx
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx

#8 删除安装包与文件:
cd ~
rm -rf nginx-1.20.0
rm -rf nginx-1.20.0.tar.gz

#9 测试Nginx环境,服务器运行nginx,本地访问服务器ip
nginx   # 启动nginx服务,监听80端口---->公网ip 80 端口就能看到页面了
服务器绑定的域名 或 ip:80

#10 静态文件放的路径
/usr/local/nginx/html

#11 查看nginx进程是否启动
ps aux | grep nginx


root     4108597  0.0  0.0  34356   380 ?        Ss   20:08   0:00 nginx: master process nginx
nobody   4108598  0.0  0.2  69108  4068 ?        S    20:08   0:00 nginx: worker process
root     4118269  0.0  0.0  12136  1040 pts/0    R+   20:11   0:00 grep --color=auto nginx

四、部署前端项目

4.1 本地操作

-修改前端访问的后端地址src/assets/js/settings.js
    export default {
        BASE_URL: 'http://8.130.18.221:8000/api/v1/'
    }
        
-把vue项目编译成 html,css,js
    npm run build  # 在项目目录下生成dist文件夹,内部就是咱们上线要用的

-把dist文件夹压缩成zip,待命

4.2 线上操作

# dist.zip 文件,在本地,上传到远程服务器。设置成访问nginx的静态文件,就显示前端的dist

#1 在远程服务器上
cd ~
yum install lrzsz -y   # 跟本地机器上传下载的软件
yum install unzip -y    #解压zip软件

# 在远程服务器上
rz  # 打开你本地的目录,选中dist.zip  上传到远端

#2 解压
unzip dist.zip

#3 移动文件  /home/html  下面有咱们的前端静态文件
mv /root/dist /home/html
    
    
#4 配置nginx 静态代理
cd  /usr/local/nginx/conf   # nginx.conf   配置文件
mv nginx.conf nginx.conf.bak
vi nginx.conf 
# 按 a  粘贴下面代码
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    server {
        listen 80;
        server_name  127.0.0.1;
        charset utf-8;
        location / {
            root /home/html;
            index index.html;
            try_files $uri $uri/ /index.html;
        }
    }
} 
#5 按 esc  :wq  回车

#6 修改配置文件后,要重启nginx
nginx -s reload


访问80端口时,nginx去/home/html中拿index.html返回。

五、部署后台项目

5.1 本地操作

  • 后端项目,修改好线上配置文件,确定项目可以跑起来,再把代码推送到git仓库

prod.py

  • 上线的配置文件,内容拷贝dev.py,前身就是settings.py
DEBUG = False

ALLOWED_HOSTS = ['*']  # 也可以直接写公网ip地址:47.94.149.117

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'luffy',  # 数据库名字
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'USER': 'luffy',  # 用户名和密码写死了,防止获取错误
        'PASSWORD': 'Luffy123?',
        'CHARSET': 'utf8',
    }
}

# 要上线了,地址换成公网地址
## 支付宝的设置
# 后台基URL
BACKEND_URL = 'http://47.94.149.117:8000'
# 前台基URL
LUFFY_URL = 'http://47.94.149.117:80'  # 公网ip地址80端口,端口号可以省略
# 支付宝同步异步回调接口配置
# 后台异步回调接口
NOTIFY_URL = BACKEND_URL + "/api/v1/order/success/"  # post回调地址--->配合接口--->修改订单状态
# 前台同步回调接口,没有 / 结尾
RETURN_URL = LUFFY_URL + "/pay/success"  # 给用户看的,Vue的组件

wsgi.py,asgi.py

# 上线是用uwsgi运行wsgi.py
# wsgi.py 
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy_api.settings.prod')

# asgi.py
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy_api.settings.prod')

# 创建一个manage_prod.py,该文件就是manage.py的一个副本
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffy_api.settings.prod')

导出项目环境

# 在pycharm的控制台
pip freeze > requirements.txt

项目提交到远程git仓库

#1 去向本地项目仓库
cd 项目根目录

#2 本地版本库操作
git status
git add .
git commit -m '项目上线'

#3 提交到远程版本库
git pull luffy_api master
git push luffy_api master

5.2 线上操作

安装插件

# 安装依赖(requirements)时可能会出错 mysqlclient装不上,可以先安装两个插件
yum install python3-devel -y
yum install mysql-devel --nogpgcheck -y

git拉取上线项目

# 创建存放后台项目的目录
mkdir /home/project
# 进入后台项目管理目录同步git仓库中的项目
cd  /home/project
git clone https://gitee.com/zh-jyao/luffy_api.git

    
git remote add origin git@gitee.com:zh-jyao/luffy_api.git
# 使用ssh拉取文件
ssh-keygen -t ed25519 -C "285462828@qq.com"
git clone git@gitee.com:zh-jyao/luffy_api.git

项目虚拟环境

# 进入到虚拟环境
workon luffy 

# 安装项目所有模块
cd /home/project/luffy_api
pip install -r requirements.txt  
# pip install mysqlclient

# 虚拟环境中也要安装uwsgi
pip install uwsgi

配置数据库

mysql -uroot -p
Lqz12345?

# 创建数据库
create database luffy default charset=utf8;

# 设置权限。账号密码要与项目中配置的一致
grant all privileges on luffy.* to 'luffy'@'%' identified by 'Luffy123?';
grant all privileges on luffy.* to 'luffy'@'localhost' identified by 'Luffy123?';
flush privileges;
#退出mysql
quit;


# 使用本地navicate链接阿里云的luffy库,使用luffy用户
远程连接
主机:公网ip
用户名:luffy
密码:Luffy123?


# 修改后端上传到gitee仓库
# 远程服务器可以
    -到luffy_api下
    -git pull git@gitee.com:zh-jyao/luffy_api.git

迁移表

cd /home/project/luffy_api/
# python manage.py makemigrations
python manage_prod.py migrate

# 如果出现问题,把项目中的makemigrations迁移文件删除,提交,远程

uwsgi 运行django

# 写一个uwsgi的配置文件,在项目路径下,新建一个  luffyapi.xml

<uwsgi>    
   <socket>127.0.0.1:8888</socket> <!-- 内部端口,自定义,监听8888端口 --> 
   <chdir>/home/project/luffy_api/</chdir> <!-- 项目路径 -->            
   <module>luffyapi.wsgi</module>  <!-- luffy_api下wsgi.py所在目录名--> 
   <processes>4</processes> <!-- 进程数 -->     
   <daemonize>uwsgi.log</daemonize> <!-- 日志文件 -->
</uwsgi>

<uwsgi>    
	<socket>127.0.0.1:8888</socket>
    <chdir>/home/project/luffy_api/</chdir> 
    <module>luffy_api.wsgi</module>
    <processes>4</processes>
    <daemonize>uwsgi.log</daemonize>
</uwsgi>

# 新建一个luffyapi.xml,复制上面的配置
vi /home/project/luffy_api/luffyapi.xml

# 使用uwsgi启动
uwsgi -x luffyapi.xml

# 查看是否正常运行
ps aux |grep uwsgi

配置nginx转发

# 打开ngnix的配置文件
cd /usr/local/nginx/conf
vi nginx.conf

# 新增一个server  
    server {
        listen 8000;
        server_name  127.0.0.1; # 改为自己的域名,没域名修改为127.0.0.1:80
        charset utf-8;
        location / {
           include uwsgi_params;
           uwsgi_pass 127.0.0.1:8808;  # 端口要和uwsgi里配置的一样
           uwsgi_param UWSGI_SCRIPT luffy_api.wsgi;  #wsgi.py所在的目录名+.wsgi
           uwsgi_param UWSGI_CHDIR /home/project/luffy_api/; # 项目路径
        }
    }
    
    
    server {
        listen 8000;
        server_name  127.0.0.1;
        charset utf-8;
        location / {
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:8888;
            uwsgi_param UWSGI_SCRIPT luffy_api.wsgi; 
            uwsgi_param UWSGI_CHDIR /home/project/luffy_api/;
        }
    }
    

# 重启nginx 
nginx -s reload



监听80跟8000端口,访问公网的80端口,nginx就会转成home/html/下的index.html文件
访问8000端口,nginx动态请求转发到127.0.0.1:8888中,8888端口跑着uwsgi

其他配置

# 导入数据
把本地的数据复制到远程,转储SQL文件,远程连接luffy打开后,直接运行这个SQL文件
# 配置域名解析

六、配置后台admin访问

# 浏览器访问http://8.130.18.221:8000/admin  发现没有样式
# 因为uwsgi不能给我们代理静态资源

# 收集静态资源,使用nginx代理
1) 进入prod
vi /home/project/luffy_api/luffy_api/settings/prod.py
# prod.py中加入
STATIC_ROOT = '/home/project/luffy_api/luffy_api/static/'

# 执行命令
2)进入虚拟环境
3)项目目录下需要新建 static 文件夹
mkdir /home/project/luffy_api/luffy_api/static

4)完成静态文件迁移
cd /home/project/luffy_api/
python manage_prod.py collectstatic



5)修改nginx配置文件

# 打开ngnix的配置文件
cd /usr/local/nginx/conf
vi nginx.conf

# 新增的配置静态文件
	server {
            listen 8000;
            server_name  127.0.0.1;
            charset utf-8;
            location / {
               include uwsgi_params;
               uwsgi_pass 127.0.0.1:8888;
               uwsgi_param UWSGI_SCRIPT luffy_api.wsgi; 
               uwsgi_param UWSGI_CHDIR /home/project/luffy_api/;
            }
           location /static {
            alias /home/project/luffy_api/luffy_api/static;
        	}
        }
     
6)重启nginx 
nginx -s reload

七、安全组

# 买的阿里云机器,默认会开放80 端口、22端口
# 但是,3306,6379 8000端口可能没打开
# 不打开安全组的端口,是访问不进来的

8888,8000,3306



# 查看远端服务器的开启端口
netstat -lntp

拓展

1.订单号是怎么生成的?

你们公司的订单号是如何生成的?
使用uuid生成的。我们使用的uuid没有出现重复的订单号,可能我们的数量比较小(几百条中不会有重复的)。如果真的会重复,可以使用当前时间拼接上uuid来生成订单号。

保证全局唯一的订单号方式:
1.使用uuid
2.数据库自增,BigInteger
3.当前时间+redis 自增(为什么不能只是用当前时间?集群节点中,可能同一时间有两个用户同时生)redis 自增只有一台服务器,单线程
4.雪花算法,生成分布式的唯一id
5.美团的leaf算法

# 只要你的数字足够长,重复的概率就很低

2.前端下单成功,生成支付链接,但此时后端的服务挂了

问题:用户是否能支付成功?
回答:能支付成功,此时前端使用的支付宝的链接,跟我的后端没有任何关系,只要支付宝的服务器没有挂掉,用户就能够支付成功。但是,我的后台挂掉了,支付宝get回调,掉前端的地址,用户的状态就会一直显示未支付状态,用户已经付过钱了,只是支付宝向我们发起的post请求,一直失败,没有修改表中的数据。
支付宝在24小时内会有8次回调。在这一天中,我们去解决后台挂掉的问题。
如果在一天后,还没有解决,或者用户电话联系,我们可以调出支付宝的对账功能,根据订单号查询订单状态,去手动修改支付状态。

3.127.0.0.1跟0.0.0.0

# 软件运行,监听地址
127.0.0.1
	只能访问 127.0.0.1  localhost  不能用本机ip地址访问,外部所有人都不能 访问你

0.0.0.0
	127.0.0.1  localhost 本机ip地址访问  同一个局域网内,都可以通过ip地址访问 

    
# 本地host解析
	输入网址--->www.baidu.com---->找本地host文件--->找跟ip地址的对应关系---->找到直接访问这个ip地址----如果找不到---->用你配置的dns解析
posted @ 2023-07-14 14:47  星空看海  阅读(20)  评论(0编辑  收藏  举报