1 Preparación previa al despliegue
# 1 Empaquetado de archivos de logs
- Al ignorar los archivos de log, las carpetas vacías no son gestionadas por git, pero al crear un paquete serán gestionadas, por lo que necesitamos la carpeta logs
# 2 Creación de manage_pro.py
- En el servidor, la migración de base de datos: si ejecutamos python manage.py migrate, se utiliza la base de datos de entorno de pruebas
- En el servidor usamos manage_pro.py para migrar a la base de datos de producción
# 3 ¿Debemos enviar los registros de modificación de migrations a git?
- Sugerencia oficial: enviar
- Mi sugerencia: no enviar
- Después de modificar, queda registrado
- En el servidor:
python manage.py makemigrations
python manage.py migrate
- Supuesto:
Localmente, Juan añade un campo a la tabla user, registro de migrations
Localmente, Juan añade otro campo a la tabla user, registro de migrations
Se envía al remoto, el servidor ve dos registros de cambio
El servidor solo necesita ejecutar python manage.py migrate
- Mi sugerencia:
Localmente, Juan añade un campo a la tabla user, registro de migrations
Localmente, Juan añade otro campo a la tabla user, registro de migrations
No se envía al remoto, el servidor no tiene registros de cambio
El servidor solo necesita ejecutar
python manage.py makemigrations Solo genera uno
python manage.py migrate
# 4 En los archivos de configuración, modificar las direcciones de backend y frontend, cambiarlas por las del servidor de producción, aunque aún no existen
- Configurar correctamente la dirección de Alibaba Cloud en el archivo de configuración
# 5 Enviar el proyecto backend a git
# 6 Compilar el proyecto frontend localmente: html, css, js
- Modificar la dirección de ajax
export default {
BASE_URL:'http://106.15.177.33:8080/api/v1/'
}
- Compilar
npm run build
- Se crea una carpeta dist en la ruta del proyecto: html, css, js
2 Compra de servidor en Alibaba Cloud
# 1 Servidor: máquina virtual, comprar un servidor en la nube de Alibaba Cloud, equivalente a comprar una computadora en un centro comercial
# 2 Dirección IP pública: todos pueden acceder a través de la dirección IP
# 3 Dominio: Wanwang: resolución de dominio
# Compra de máquina:(Alibaba Cloud, Tencent, nuevos usuarios tienen precios muy bajos, máquina virtual)
- Pago anual: lo compra la empresa, por varios años
- Pago por uso: usar un rato, liberar después de usar: debe haber más de 100 en el saldo
- Instancia interrumpible: recursos inactivos, vendidos a precio reducido, cuando alguien compra normalmente, las instancias inactivas disminuyen, se liberan las instancias interrumpibles
- Elegir pago por tráfico
- 2 núcleos, 4GB
- Sistema CentOS 7.9
- Elegir IP pública
- Contraseña personalizada: usuario root y su propia contraseña
- Confirmar compra exitosa
# Conexión remota: xshell, finalshell
# Abrir estos puertos en el grupo de seguridad
80
8080
3306
6379
3 Diagrama de arquitectura del despliegue
# Proyecto backend desarrollado con Django
-mysql 5.7
-redis 5.x
-intérprete de python 3.8
-crear entorno virtual
# Proyecto frontend con Vue
# Software a instalar en el servidor en la nube
-mysql
-redis
-python3.8
-nginx: proxy para recursos estáticos
-git: para extraer código
-uwsgi: para ejecutar django
4 Instalación de Git
# Método uno:
yum install git -y
# Método dos: # Incluye git y otros software de desarrollo necesarios
yum -y groupinstall "Development tools"
# Instalación de código fuente para python y redis, necesita dependencias adicionales
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel -y
5 Instalación de MySQL en el servidor en la nube
# Pasos de instalación
1) Ir al directorio raíz del usuario
cd ~ # Cambiar al directorio home del usuario
2) Descargar mysql57
>: wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm
3) Instalar mysql57
>: yum -y install mysql57-community-release-el7-10.noarch.rpm
>: yum install mysql-community-server --nogpgcheck
4) Iniciar mysql57 y verificar el estado
>: systemctl start mysqld.service
>: systemctl status mysqld.service
5) Verificar la contraseña predeterminada e iniciar sesión
>: grep "password" /var/log/mysqld.log
Tl-5uKq&Z+tK
>: mysql -uroot -p
ftJd&i3>roih
6) Modificar contraseña
>: ALTER USER 'root'@'localhost' IDENTIFIED BY 'nueva contraseña';
>: ALTER USER 'root'@'localhost' IDENTIFIED BY 'Bxf12345?';
6 Instalación de Redis en el servidor en la nube
1) Ir al directorio raíz del usuario
>: cd ~
2) Descargar redis-5.0.5 (paquete de código fuente)
>: wget http://download.redis.io/releases/redis-5.0.5.tar.gz
3) Descomprimir el paquete de instalación
>: tar -xf redis-5.0.5.tar.gz
4) Entrar al archivo de destino
>: cd redis-5.0.5
5) Compilar el entorno (gcc compilación---》archivo ejecutable--》src---》archivo ejecutable)
# Redis está escrito en C, es un lenguaje compilado, necesita compilarse en diferentes plataformas para diferentes plataformas para poder ejecutarse
>: make
6) Copiar el entorno a la ruta especificada para completar la instalación
>: cp -r /root/redis-5.0.5 /usr/local/redis
7) Configurar redis para que pueda iniciar en segundo plano: modificar lo siguiente
>: vim /usr/local/redis/redis.conf
daemonize yes
8) Guardar la configuración modificada
>: esc
>: :wq
9) Crear enlace simbólico
>: 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) Ejecutar redis en segundo plano
>: cd /usr/local/redis
>: redis-server ./redis.conf &
# Verificar si el proceso está en ejecución: ps aux | grep redis
ctrl + c
11) Probar el entorno redis
>: redis-cli
ctrl + c
12) Cerrar servicio redis
# Conectarse al cliente y escribir shutdown
>: pkill -f redis -9
7 Instalación de Python desde código fuente en el servidor en la nube
# Se puede usar yum para instalar, pero no se especifica la versión
# Instalación desde código fuente, descargar código fuente de la versión especificada, compilar e instalar
# Todos los linux y mac vienen con python2: servicios del sistema, escritos en python
# CentOS de Alibaba Cloud viene con python3.6 por defecto
# python2, python3.6 python3.8
# Instalación de Python desde código fuente, necesita algunas dependencias de terceros como 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 Ir al directorio raíz del usuario
>: cd ~
#2 Descargar o subir Python3.8.6 en el terminal del servidor
wget https://registry.npmmirror.com/-/binary/python/3.8.6/Python-3.8.6.tgz
#3 Descomprimir el paquete de instalación
tar -xf Python-3.8.6.tgz
#4 Entrar al archivo de destino
cd Python-3.8.6
#5 Configurar ruta de instalación: /usr/local/python3
# Compilar e instalar python3.8.6 en la ruta /usr/local/python38
>: ./configure --prefix=/usr/local/python38
#6 Compilar e instalar, si hay error, significa que faltan dependencias
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 Crear enlace simbólico: la ruta /usr/local/python38 no está en la variable de entorno, comando python3, pip3 en el terminal
ln -s /usr/local/python38/bin/python3 /usr/bin/python3.8
ln -s /usr/local/python38/bin/pip3 /usr/bin/pip3.8
# 8 La máquina tiene múltiples comandos python y pip, la relación correspondiente es la siguiente
python 2.x pip
python3 3.6 pip3
python3.8 3.8 pip3.8
#9 Eliminar paquete e instalación:
>: rm -rf Python-3.8.8
>: rm -rf Python-3.8.8.tar.xz
8 Instalación de uwsgi
# Usar uwsgi para ejecutar django, en lugar de wsgiref para ejecutar django en la fase de pruebas
# uwsgi es un servidor web que cumple con el protocolo wsgi, escrito en C con alto rendimiento, debe usarse uwsgi para producción
# Pasos de instalación
1) Instalar en el entorno real
pip3.8 install uwsgi
# Se instala en la ruta bin de la ruta de instalación de python38
2) Crear enlace simbólico
ln -s /usr/local/python38/bin/uwsgi /usr/bin/uwsgi
9 Instalación de entornos virtualse
1) Instalar dependencias
>: pip3.8 install virtualenv
# python3.8 -m pip install --upgrade pip
# python3.8 -m pip install --upgrade setuptools
# pip3.8 install pbr
>: pip3.8 install -U virtualenvwrapper -i https://pypi.douban.com/simple/
>: pip3.8 install virtualenvwrapper
2) Crear enlace simbólico para entorno virtual
>: ln -s /usr/local/python38/bin/virtualenv /usr/bin/virtualenv
3) Configurar entorno virtual: ingresar el siguiente contenido
# ~/ significa ruta de usuario: para usuario root, es /root/.bash_profile
>: vim ~/.bash_profile
VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.8
source /usr/local/python38/bin/virtualenvwrapper.sh
4) Salir del estado de edición
>: esc
5) Guardar cambios y salir
>: :wq
6) Actualizar contenido del archivo de configuración
>: source ~/.bash_profile
7) Directorio raíz predeterminado para entorno virtual: ~/.virtualenvs
8) mkvirtualenv -p python3.8 proyecto_luffy
10 Instalación de Nginx
1) Ir al directorio raíz del usuario
>: cd ~
2) Descargar nginx1.13.7
>: wget http://nginx.org/download/nginx-1.13.7.tar.gz
3) Descomprimir el paquete de instalación
>: tar -xf nginx-1.13.7.tar.gz
4) Entrar al archivo de destino
>: cd nginx-1.13.7
5) Configurar ruta de instalación: /usr/local/nginx
>: ./configure --prefix=/usr/local/nginx
6) Compilar e instalar
>: make && make install
7) Crear enlace simbólico: comando nginx en terminal
>: ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
8) Eliminar paquete e instalación:
>: cd ~
>: rm -rf nginx-1.13.7
>: rm -rf nginx-1.13.7.tar.xz
9) Probar entorno Nginx, servidor ejecutando nginx, acceso local a IP del servidor
>: # Iniciar : nginx
# Detener: nginx -s stop
>: Dominio o IP del servidor:80
# netstat -nlp | grep 80
# ps aux | grep nombre_proceso
11 Despliegue del frontend Luffy
# Compilado a recursos estáticos en la carpeta dist
# Comprimir carpeta a zip, subir al servidor
# Instalar varios software
- Software para descomprimir zip: yum install -y unzip
- Software para subir/bajar: yum install lrzsz -y
#1 Modificar la dirección de envío de ajax del frontend al backend: dirección del proyecto
#2 Compilar proyecto vue a html, css, js
npm run build
#3 Se genera carpeta dist en la ruta raíz del proyecto (archivos compilados)
#4 Comprimir localmente a zip (no usar rar)
#5 Instalar software en el servidor: yum install lrzsz
#6 Arrastrar directamente dist.zip al servidor en la nube
#O en el servidor en la nube escribir rz y seleccionar para subir
#7 yum install unzip
unzip dist.zip
#8 Mover y renombrar
mv ~/dist /home/html
# 9 Ir al directorio de configuración de Nginx, respaldar configuración, actualizar completamente: ingresar siguiente contenido
#/usr/local/nginx/conf/nginx.conf es el archivo de configuración de nginx
# Especificar qué puerto escucha nginx al iniciar
# Hacer reenvío de solicitudes, balanceo de carga
# Hacer proxy de archivos estáticos
>: cd /usr/local/nginx/conf
>: mv nginx.conf nginx.conf.bak # Hacer respaldo
>: vim nginx.conf
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;
}
}
}
# 10 Ejecutar
# ps aux |grep nginx
nginx -s reload # Recargar archivo de configuración
#O
nginx -s stop
nginx
12 Despliegue del backend Luffy
12.1 Extracción de código más reciente desde git - Instalación de dependencias
# 1 Verificar que el archivo de configuración en wsgi.py use prod.py
#2 Exportar todas las dependencias del proyecto, las dependencias del entorno virtual actual son las del proyecto actual
pip freeze > requirements.txt
#3 Extraer proyecto
git clone http://dirección_del_repositorio_git
#4 Cambiar al entorno virtual proyecto_luffy
workon proyecto_luffy
#5 Instalar dependencias
pip install -r requirements.txt
# Primero comentar mysqlclient, instalar los demás, luego instalarlo
yum install mysql-devel -y
yum install python-devel -y
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
pip install mysqlclient
12.2 Configuración de base de datos
# Crear usuario de base de datos, base de datos, luego migrar tablas
1) Conectarse como administrador a la base de datos
>: mysql -uroot -p
2) Crear base de datos
>: create database proyecto_luffy default charset=utf8;
3) Configurar cuenta y contraseña: debe coincidir con la configuración del proyecto
>: grant all privileges on proyecto_luffy.* to 'usuario_db'@'%' identified by 'Contraseña123?';
>: grant all privileges on proyecto_luffy.* to 'usuario_db'@'localhost' identified by 'Contraseña123?';
>: flush privileges;
4) Salir de mysql
>: quit;
12.3 Migración de base de datos
# manage.py --->dev.py
# manage_pro.py --->prod.py
python manage_pro.py makemigrations
python manage_pro.py migrate
# Las tablas no tienen datos, agregar datos de prueba
# Importar datos de la base de datos de pruebas local
- Exportar localmente a sql
- En navicate, botón derecho---》Exportar a sql
- Importar en el remoto
- Botón derecho e importar
12.4 Inicio de Django con uwsgi
# 0 Antes de ejecutar con uwsgi, primero ejecutar
python manage_pro.py runserver 0.0.0.0:8080
En el navegador de máquinas externas: http://101.132.179.71:8080/api/v1/home/banner/ se puede acceder
# 1 Configurar servicio uwsgi, contenido siguiente
>: vim ./proyecto_luffy.xml # Archivo de configuración de uwsgi
<uwsgi>
<socket>127.0.0.1:8888</socket>
<chdir>/home/proyecto_luffy/</chdir>
<module>proyecto_luffy.wsgi</module>
<processes>2</processes>
<daemonize>uwsgi.log</daemonize>
</uwsgi>
# 2 Iniciar uwsgi
uwsgi -x ./proyecto_luffy.xml
# 3 Verificar procesos uwsgi
ps aux |grep uwsgi
# 4 Configurar nginx, reenviar solicitudes dinámicas del puerto 8080 al puerto 8888
vim /usr/local/nginx/conf/nginx.conf
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; # Resolver problema de rutas vue
}
}
# Nuevo server
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 proyecto_luffy.wsgi;
uwsgi_param UWSGI_CHDIR /home/proyecto_luffy/;
}
}
}
# Recargar nginx
nginx -s reload
13 Manejo de estilos de admniistración de Luffy
uwsgi solo reenvía solicitudes dinámicas, no gestiona recursos estáticos
1) Editar archivo de configuración en producción
>: vim /home/proyecto_luffy/proyecto_luffy/settings/prod.py
2) Modificar configuración static, añadir STATIC_ROOT, STATICFILES_DIRS
STATIC_URL = '/static/'
STATIC_ROOT = '/home/proyecto_luffy/proyecto_luffy/static'
STATICFILES_DIRS = (os.path.join(BASE_DIR, "../static"),)
3) Salir de edición
>: esc
>: :wq
4) Si no existe la carpeta static en el directorio del proyecto, crearla
>: mkdir /home/proyecto_luffy/static
5) Completar migración de archivos estáticos
>: python /home/proyecto_luffy/manage_pro.py collectstatic
6) 1) Modificar configuración nginx
>: vim /usr/local/nginx/conf/nginx.conf
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;
}
}
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 proyecto_luffy.wsgi;
uwsgi_param UWSGI_CHDIR /home/proyecto_luffy/;
}
location /static {
alias /home/proyecto_luffy/proyecto_luffy/static;
}
}
}