Linux - Django项目上线服务器

1 上线架构图

image-20230314092732044

nginx:

① 请求转发

② 负载均衡

上线时候:前端是编译后的纯静态html、css、js

2 阿里云服务器

配置

-yum update -y
# 装了一堆开发用的工具,git

-yum -y groupinstall "Development tools" 

-yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel

3 云服务器安装mysql


1)前往用户根目录
>: cd ~  # 回到你家路径  /root

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


3)安装mysql57
>: yum -y install mysql57-community-release-el7-10.noarch.rpm
>: yum install mysql-community-server --nogpgcheck -y

4)启动mysql57并查看启动状态
>: systemctl start mysqld.service
>: systemctl status mysqld.service

5)查看默认密码并登录
>: grep "password" /var/log/mysqld.log
     # Hay(:PiB+9NE
     # Hay(:PiB+9NE

>: mysql -uroot -p

6)修改密码
>: ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password';
>: ALTER USER 'root'@'localhost' IDENTIFIED BY 'Root123?';

4 云服务器安装redis(源码安装)

1)前往用户根目录
>: cd ~

2)下载redis-5.0.5
>: wget http://download.redis.io/releases/redis-5.0.5.tar.gz

3)解压安装包
>: tar -xf redis-5.0.5.tar.gz

4)进入目标文件
>: cd redis-5.0.5

5)编译环境
>: make   # 在src路径下会有可执行文件:redis-server    redis-cli

6)复制环境到指定路径完成安装
>: cp -r ~/redis-5.0.5 /usr/local/redis

7)配置redis可以后台启动:修改下方内容
>: vim /usr/local/redis/redis.conf

daemonize yes

8)完成配置修改
>: esc
>: :wq

9)建立软连接(因为/usr/local/redis/src没有加到环境变量)
# /usr/bin/ 在环境变量中,所有以后直接敲redis-server就能找到了
>: ln -s /usr/local/redis/src/redis-server /usr/bin/redis-server
>: ln -s /usr/local/redis/src/redis-cli /usr/bin/redis-cli

10)后台运行redis
>: cd /usr/local/redis
>: redis-server ./redis.conf &

    
# 查看是否正常在运行:ps aux |grep redis

ctrl + c

11)测试redis环境
>: redis-cli
ctrl + c

12)关闭redis服务
>: pkill -f redis -9

5 云服务器安装python3.8(源码安装)

image-20230314170622291

# linux mac 系统服务是用python写的 python2 写的,所以这俩系统中默认自带了python2,不要写在

# 阿里云的centos 自动装了python3.6
# 你的云服务器上有python2 和python3.6 


# 自己装python3.8

# centos安装:yum install python  可以快速安装,但是不能指定版本,不能指定安装目录


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

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




###### 源码安装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.8.6  服务器终端
wget https://registry.npmmirror.com/-/binary/python/3.8.6/Python-3.8.6.tgz

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

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

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

#6  编译并安装,如果报错,说明缺依赖
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel zlib* libffi-devel  -y
make &&  make install

#7  建立软连接:/usr/local/python38路径不在环境变量,终端命令 python3,pip3
#没有吧/usr/local/python38/bin加入到环境变量
ln -s /usr/local/python38/bin/python3 /usr/bin/python3.8
ln -s /usr/local/python38/bin/pip3 /usr/bin/pip3.8

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

#8  删除安装包与文件:
>: rm -rf Python-3.8.8
>: rm -rf Python-3.8.8.tar.xz

image-20230314172128945

6 安装uwsgi

# django flask项目上线,需要使用uwsgi部署,性能高,符合wsig协议的web服务器


# 使用uwsgi运行django,不再使用测试阶段的wsgiref来运行django了

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

# 安装步骤
1)在真实环境下安装
pip3.8 install uwsgi
#安装到了python38的安装路径的bin路径下了
2)建立软连接
ln -s /usr/local/python38/bin/uwsgi /usr/bin/uwsgi


7 安装虚拟环境


1)安装依赖
>: pip3.8 install virtualenv

>: pip3.8 install -U virtualenvwrapper -i https://pypi.douban.com/simple/ 

>: pip3.8 install virtualenvwrapper

如果安装不了virtualenvwrapper,则试一试执行

# 升级pip版本
python3.8 -m pip install --upgrade pip    

#升级setuptools
python3.8 -m pip install --upgrade setuptools 

pip3.8 install pbr

执行完可以安装virtualenvwrapper

image-20230314173057521

接着安装


2)建立虚拟环境软连接
>: ln -s /usr/local/python38/bin/virtualenv /usr/bin/virtualenv

3)配置虚拟环境:填入下方内容
# ~/ 表示用户家路径:root用户,就是在/root/.bash_profile
>: vim ~/.bash_profile

VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.8
source /usr/local/python38/bin/virtualenvwrapper.sh

4)退出编辑状态
>: esc

5)保存修改并退出
>: :wq

6)更新配置文件内容
>: source ~/.bash_profile

7)虚拟环境默认根目录:~/.virtualenvs


8) mkvirtualenv -p python3.8 luffy

image-20230314182817496

8 安装nginx(源码安装)

# nginx:软件
	-Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器  ,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点
    -运行在服务器上,监听某个端口,可以向这个服务器发送http请求了
    
    -转发http请求,代理静态文件,负载均衡
    

# 安装nginx
1)前往用户根目录
>: cd ~

2)下载nginx1.13.7
>: wget http://nginx.org/download/nginx-1.13.7.tar.gz

3)解压安装包
>: tar -xf nginx-1.13.7.tar.gz

4)进入目标文件
>: cd nginx-1.13.7

5)配置安装路径:/usr/local/nginx
>: ./configure --prefix=/usr/local/nginx

6)编译并安装
>: make && sudo make install

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

8)删除安装包与文件:
>: cd ~
>: rm -rf nginx-1.13.7
>: rm -rf nginx-1.13.7.tar.xz

9)测试Nginx环境,服务器运行nginx,本地访问服务器ip
>: nginx
# 查看nginx服务 
ps aux |grep nginx
>: 服务器绑定的域名 或 ip:80


image-20230314185404291

nginx代理静态资源的页面:在 html 文件夹下

image-20230314185857489

9 路飞前端部署

9.1 前端部署前准备:

① 把ajax远程链接的地址改成服务器的地址

export default {
    BASE_URL: 'http://101.132.188.28:8080/api/v1'
}

② 把vue的项目编译成纯粹的静态文件

npm run build

编译后放在dist文件夹中

image-20230314190543287

9.2 编译后上传、解压dist文件

上传

- 在云服务器上安装上传下载的软件
yum install -y lrzsz
rz  选择上传就行

image-20230314191315331

解压

- 解压 zip  
yum install unzip -y
unzip dist.zip

image-20230314191410882

9.3 修改nginx配置文件,实现代理路飞前端

1)来到nginx安装目录的conf路径下
cd  /usr/local/nginx/conf

2)mv nginx.conf nginx.conf.bak

3)vim nginx.conf  # 写入配置 

4)写入
events {
worker_connections  1024;
}
http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        server {
            listen 80;
            server_name  127.0.0.1; # 改为自己的域名,没域名修改为127.0.0.1:80
            charset utf-8;
            location / {
                root /home/html; # html访问路径
                index index.html; # html文件名称
                try_files $uri $uri/ /index.html; # 解决单页面应用刷新404问题
            }
        }
    }
# 保存并退出
:wq
5)把dist下的所有内容,cp到 /home/html   # 注意路径  
cd 到根目录下

cp -r dist /home/html

6)重启ngixn   
nginx -s reload 
 
7)通过公网访问前端页面

http://101.132.188.28/  前端页面   

image-20230314193859069

此时通过公网访问的前端页面,就是home下的html中的index.html页面

image-20230314193958642

10 路飞后端部署

10.1 修改配置文件

① 修改上线用的配置文件 prod.py

将开发的配置文件 dev.py 复制到prod.py

# 1 修改DEBUG
DEBUG = False

# 2 ALLOWED_HOSTS改成 服务器地址
ALLOWED_HOSTS = ['101.132.188.28']

# 3 mysql 和 redis的地址都应改成对应的地址
DATABASES = {
    'default': {
				...
        'HOST': mysql服务器地址,
				...
    },
}

CACHES = {
    'default': {
				...
        "LOCATION": redis的服务器地址,
				...
    }
}

# 4 修改后端地址和前端地址

# 后端地址
BACKEND_URL = 'http://101.132.188.28:8090'
# 前端地址
LUFFY_URL = 'http://101.132.188.28'

② 修改上线用的运行文件manage_prod.py

修改上线用的配置文件 为 prod.py

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

③ 项目导出依赖包到requirements.txt

 pip freeze > requirements.txt

10.2 提交本地代码到git

推荐:将每个app下的migrations中的迁移记录删掉,防止多人协同开发的时候产生冲突

10.3 部署到服务器上

# 创建home下的project目录
mkdir /home/project

# 切换到project目录
cd /home/project

# git克隆 
git clone https://gitee.com/duoduosg/luffy_api.git/

10.4 配置luffy数据库

1)管理员连接数据库
>: mysql -uroot -p

2)创建数据库
>: create database luffy default charset=utf8;

3)设置权限账号密码:账号密码要与项目中配置的一致
>: grant all privileges on luffy.* to 'luffy'@'%' identified by 'Luffy123?';
>: grant all privileges on luffy.* to 'luffy'@'localhost' identified by 'Luffy123?';
>: flush privileges;

4)退出mysql
>: quit;
    
    
# 本地使用Navicate连接

10.5 安装项目依赖,迁移数据库

####### 在远端,安装项目依赖###########
进入到虚拟环境,进入到项目路径下,执行


workeon luffy


# 如果mysqlclient装不上,先把mysqlclient注释

pip install -r requirements.txt

如果mysqlclient安装不上,先在requirements.txt中将其注释掉,先安装其他的依赖

按照下面步骤安装

yum install mysql-devel -y
yum install python-devel -y
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
pip install mysqlclient

接着 要在虚拟环境中也安装uwsgi

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


#### 迁移数据库#### 
python manage_prod.py makemigrations
python manage_prod.py migrate



##### 迁移的记录文件,要不要提交到git上######
	-官方推荐:提交
    -我推荐:如果多人开发,不提交
    
    
    python manage_prod.py makemigrations
    python manage_prod.py migrate
    
    # 录入数据,我们由于是测试,把本地的sql导出,导入到远端

10.6 使用uwsgi启动django

# 运行django(个人经验,先用wsgiref运行起来,再用uwsgi跑)
	-原来测试阶段,使用wsgiref运行
    	-跑起来,访问测试一下,你们可能访问不到
        -原因是:安全组开启 8888和8080端口
        -最后期:只留22,3306,6379,80,8080
    -上线使用uwsgi

# 使用uwsgi步骤
	-写一个uwsgi的配置文件(ini,【xml】)
    vim luffyapi.xml
    <uwsgi>    
       <socket>127.0.0.1:8888</socket> <!-- 内部端口,自定义 --> 
       <chdir>/home/project/luffy_api/</chdir> <!-- 项目路径 -->            
       <module>luffy_api.wsgi</module>  <!-- luffyapi为wsgi.py所在目录名--> 
       <processes>4</processes> <!-- 进程数 -->     
       <daemonize>uwsgi.log</daemonize> <!-- 日志文件 -->
    </uwsgi>
    
# 使用uwsgi启动djagno
    uwsgi -x ./luffyapi.xml
    ps aux |grep uwsgi  # 看到有四个进程说明没问题

# 现在访问8888,没有响应
	-uWSGI:配置文件是socket,说明它只能监听 uwsgi协议,浏览器发出去的是http协议,它不能响应
    -只能http请求发送到nginx上,使用nginx把http请求,转发到uwsgi,nginx支持把http协议转成uwsgi
    
# 修改nginx 配置文件,完成对http请求的转发


    server {
        listen 8080;
        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


# 访问前端,查看
  • 修改项目后,重新使项目生效,需要重启uwsgi

① 关闭uwsgi的进程

pkill -9 uwsgi

② 进入项目目录下然后启动uwsgi的配置文件 xml

uwsgi -x luffyapi.xml 

--------[显示如下即可]--------
[uWSGI] parsing config file luffyapi.xml
  • 当项目上线出错了之后

① 先用wsgiref运行起来,如果项目都运行不起来就是项目的问题

② 排查nginx的问题,查看日志文件,是否是nginx代理配置问题

③ 排查uwsgi的问题,查看日志文件,是否是uwsgi的问题

④ 在排查项目的log日志文件

posted @ 2023-03-15 19:12  Duosg  阅读(64)  评论(0编辑  收藏  举报