二、ubuntu+django+nginx+uwsgi+vue:部署django+vue前后端分离项目

一、创建用户和文件夹

#创建www文件夹,所有网站项目都放到这里
$ sudo mkdir /www
#创建用户组
sudo groupadd www -g 666
#创建用户
$ sudo useradd www -u 666 -g 666 -M -s /sbin/nologin
#查看
$ id wwwid
#设置www文件夹的所属组和所属用户
$ sudo chown -R www.www /www/  
#$ sudo chmod -R  666 某一目录,所有用户对一个目录的权限,用户组、所在用户,其他用户
#更新用户的密码
$ sudo passwd www
#输入要设置的密码:Huawei@123
切换到该用户

1、/www目录用来存放项目

2、www用户用来运行配置文件

二、切换到www用户下,在用户的家目录下创建虚拟环境。

1、安装python解释器

$~ sudo apt update  #更新软件源
$~ sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev wget
$~ wget https://www.python.org/ftp/python/3.7.9/Python-3.7.9.tgz     #官网下载压缩包
$~ sudo tar -xvzf Python-3.7.9.tgz  #解压
$~ cd Python-3.7.9   #进入python文件夹
$~ ./configure --with-ssl  prefix=/opt/python_exe/python37  #指定位置安装解释器
$~ make  #编译
$~ sudo make install #安装
#测试
$ cd /opt/python37 
$ python3  #看看能不能出来python解释器命令行

解释器安装到的路径:sudo  find / -name python3.7

2、将新安装的python3.7解释器加到环境变量最前面【不配置也不影响后面的部署】

#1、查看到python3.9解释器所在的位置
sudo find / -name python3.7
# 在 /usr/local/bin/  这是默认安装的位置
#我上面指定安装在/opt/python_exe/python37/
#2、查看环境变量
echo $PATH
#查看到所有环境变量: /usr/sbin/:...
#把环境变量复制,起来
#3、建立软连接
ln s /opt/python_exe/python37/bin/python3.7 /usr/local/bin/python
#4、设置环境变量,
sudo vi /etc/profile
添加
PATH=$PATH:/usr/local/bin/:拼接上第二步查到的路径
保存

#5、重启虚拟机

在任何位置输入python,显示的是python3.7.9的解释器

3、配置虚拟环境【一个项目配置一个虚拟环境】

#下载virtualenv依赖
 sudo apt install virtualenv
#virtualenv不是官方自带的包,需要pip安装
 pip install virtualenv
 pip install virtualenvwrapper
#到home目录下创建 .virtualenv文件夹
 sudo makedir $HOME/.virtualenvs
#打开 ~/.bashrc文件,并添加如下
#指定存放虚拟环境的路
vi ~/.bashrc
添加下面两条:虚拟环境存放的路径,/home/当前用户下/.virtualenvs
export WORKON_HOME=$HOME/.virtualenvs

source ~/.local/bin/virtualenvwrapper.sh
#运行
source ~/.bashrc

4、创建虚拟环境给待部署的项目

mkvirtualenv -p 解释器的安装位置 虚拟环境的名字
mkvirtualenv -p /opt/python_exe/python37/bin/python3.7 python37_django
#导入项目运行的依赖
1、切换到虚拟环境中
cd  ~/.virtualenvs
workon python37_django
2、给虚拟环境安装依赖包,该依赖包是在项目中,运行 pip freeze > requirement.txt 生成
pip install -r requirement.txt

三、项目上线前的准备

1、配置settings.py文件

#debug设置成False后,django不再处理静态文件
DEBUG = False
#项目允许启动的域名或IP,"*"代表所有都可以启动项目
ALLOWED_HOSTS = ['*']
#数据库还要修改,看你的数据库是否跟项目在一台机器,具体看情况设置数据库的连接IP
#静态文件,将所有静态文件都收集到static文件夹中
STATIC_URL = '/static/'
STATICFILES_DIRS=[
    #os.path.join(BASE_DIR,'static')
]
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

#用户资源,开放出一个窗口
MEDIA_URL='/media/'
MEDIA_ROOT=os.path.join(BASE_DIR,'media')
#要配置media还需要到总路由文件配置

2、配置总路由文件,项目同名下的urls.py[项目创建时就已经弄好的]

from .项目名 import settings
from django.conf.urls.static import static
urlpatterns+=static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)

3、收集静态文件

进入terminal执行:
python manage.py collectstatic

4、安装uwsgi

pip install uwsgi

5、生成项目的依赖文件

#方式一:使用pip来生成依赖文件
pip freeze > requirement.txt

#方式二:使用三方包来生成依赖文件
#先安装pipreps
pip install pipreqs
#导出依赖包,生成依赖文件,默认生成requirements.txt 
pipreqs ./ --encoding=utf-8

推荐使用pipreqs来生成依赖文件,只会将项目需要的依赖写进到文件中。

6、到二下执行步骤4,给虚拟环境安装依赖环境

1、切换到项目的虚拟环境
cd  ~/.virtualenvs
workon python37_django
2、给虚拟环境安装依赖包,该依赖包是在项目中,运行 pip freeze > requirement.txt 生成
cd /www/www.bbs.com/BBS14 #我的项目跟目录
pip install -r requirement.txt

7、迁移mysql数据库:mysql安装移步

1、生成sql文件,在cmd中执行:
>mysqldump -h 127.0.0.1 -uroot -pHuawei@123 oasystem > f:oasystem.sql
                               IP                                            待导数据库     导出的位置和名字
2、将该文件上传到待部署的服务器上,假设上传到/opt/mysql_data/中
3、在服务器的mysql中导入项目的数据库
#先创建项目的数据库,要跟项目中配置的数据库名一样

>create database oasystem;

#导入项目的数据库数据

>use oasystem;

> source /opt/mysql_data/oasystem.sql

#看到很多ok,再查询一下数据库表是否存在

>show tables;

8、将前端和后端项目都到服务器的/www/www.oasystem.com目录中

1、在前端项目中,设置访问后端ip和端口,我配置成http://192.168.138.2:8000/api
2、将vue前端项目进行打包
npm run serve
打包成功后会出现dist文件夹,前端只需要部署该文件夹
3、将dist移动到 /www/www.oasystem.com目录
4、将后端项目整个 移动到 /www/www.oasystem.com目录下

各种配置的文件目录:

nginx的配置文件:
/etc/nginx/nginx.conf  ,在这里是配置一些全局的
/etc/nginx/conf.d/    在这里创建 .conf文件,里面一般只写,server{}段,代表一个站点

nginx的默认日志:
/var/log/nginx/access.log
/var/log/nginx/error.log


#uwsgi相关,在后端项目根目录下创建uwsgi.ini,在这里配置启动相关参数

uwsgi.ini, 配置启动相关的参数,启动的IP和端口,进程数,日志的位置,pid文件的位置
uwsgi.log, 存储位置自己决定,一般都是跟uwsgi.ini一个位置,后端请求的日志
uwsgi.pid,存储位置自己决定,一般都是跟uwsgi.ini一个位置,用于重启和停止uwsgi进程



四、nginx配置

安装nginx

1、更新源
$> sudo apt update
2、安装nginx
$> sudo apt install nginx
3、查看版本
$> sudo nginx -v
nginx常用命令
前提:进入到nginx安装位置(ubuntu18默认在/etc/nginx/)
 
#nginx的配置文件,在/etc/nginx/
nginx.cong

配置nginx.conf

cd /etc/nginx/
sudo vi nginx.conf
#配置内容

user www; #设置运行用户
worker_processes auto;
pid /var/run/nginx.pid;

events {
	worker_connections 1024;
}

http {
	add_header 'Access-Control-Allow-Origin' 'origin-list';
	include /etc/nginx/mime.types;
	default_type application/octet-stream;
	#设置access日志的格式,名字是main
log_format main '$remote_addr-$remote_user [$time_local] "$request"'
'$status $body_bytes_sent "$http_referer"'
'"$http_user_agent" "$http_x_forwarded_for" ';
	#设置错误日志,等级是error
	error_log /var/log/nginx/error.log error;
	access_log /var/log/nginx/access.log main;
	sendfile on;
	keepalive_timeout 65;
	#gzip on;
	#将server段,写到各个文件中
	include /etc/nginx/conf.d/*.conf;
	#include导入该目录下的所有.conf配置文件
}

配置虚拟主机站点,一个项目一个虚拟主机

 cd /etc/nginx/conf.d
 vi www.oasystem.com.conf #虚拟主机配置名一个跟域名一样,这样好找 
 #配置内容
server{
	    #在js代码中,向后端请求的IP和端口
        listen 192.168.138.2:8000;
        server_name _;
        charset utf-8;
		location / {
	#浏览器访问192.168.138.2:8000时,返回/www/www.oasystem.com/html下的index.html ,其中是html是dist改名而来的
		root /www/www.oasystem.com/html;
        index index.html;
		#add_header Access-Control-Allow-Origin *;
		try_files $uri $uri/ /index.html;
		#解决单页面刷新出现404问题
                
		}

	location /api {
	#将192.168.138.2:8000/api的请求都转发给uwsgi_pass,后端
		include /etc/nginx/uwsgi_params;
        uwsgi_pass 192.168.138.2:8808;
        #端口要和uwsgi配置的一样,后端的启动ip和端口
        uwsgi_param UWSGI_SCRIPT oasystem.uwsgi;
        #wsgi.py所在目录的名字+.wsgi
        uwsgi_param UWSGI_CHDIR /www/www.oasystem.com/oasystem;
        #项目路径
	
	}
	#静态资源的访问
	location /static {
		alias /www/www.oasystem.com/oasystem/oasystem/static; 


	}
	#用户资源的访问,
	location /media {
	#通过 192.168.138.2:8000/media 就可以分为到下面目录下的资源了
		alias /www/www.oasystem.com/oasystem/oasystem/media;
	}
}

五、uwsgi配置

cd /www/www.bbs.com/BBS14 
vi uwsgi.ini
#配置内容
[uwsgi]
#django项目以下面的IP和端口启动
socket=192.168.138.2:8808
#socket = 192.168.138.2:8000
#http=0.0.0.0:8888
#配置项目根路径,项目的所在目录,改成linux电脑中的路径
chdir=/www/www.oasystem.com/oasystem
#配置wsgi接口模块文件路径,也就是wsgi.py这个文件所在的目录名,项目配置启动文件
wsgi-file=/www/www.oasystem.com/oasystem/oasystem/wsgi.py
#配置启动的进程数
processes=2
#配置每个进程的线程数
threads=2
#配置启动管理主进程
master=True
#配置存放主进程的进程号文件
pidfile=uwsgi.pid
#配置dump日志记录
daemonize=uwsgi.log
#如果使用的是虚拟环境,需要配置
#virtualenv = /home/lhz/.virtualenvs/python37_django
home=/home/lhz/.virtualenvs/python37_django
#plugins = python3
buffer-size=3276800

六、启动项目

启动端口:

#ubuntu默认不开启端口,需要自己开启
sudo ufw 8000  
sudo ufw 8808

1、启动nginx

#启动nginx需要root用户权限
cd /etc/nginx
sudo nginx

#重启
sudo nginx -s reload
#停止
sudo nginx -s stop

查看nginx运行情况
ps -aux|grep nginx

#强制删除nginx 
pkill -9 nginx

2、启动uwsgi

#操作uwsgi,要切换到项目的虚拟环境下,使用当前登录用户的权限就可以
#1、注意,必须切换到虚拟环境中,再启动uwsgi
cd ~/.virtualenvs
workon python37_django

#2、启动django项目
cd /www/www.bbs.com/BBS14
#启动
uwsgi --ini uwsgi.ini
#重启
uwsgi --reload uwsgi.pid
#停止
uwsgi --stop uwsgi.pid

启动成功:
[uWSGI] getting INI configuration from uwsgi.ini
#查看日志,如果最新的启动日志中,没有显示warning,最后的几行如下面所示就是成功了
cat uwsgi.log

spawned uWSGI master process (pid: 4621)
spawned uWSGI worker 1 (pid: 4626, cores: 2)
spawned uWSGI worker 2 (pid: 4627, cores: 2)

如果在浏览器中出现错误了,可以查看uwsgi.log,
cd /www/www.bbs.com/BBS14
cat uwsgi.log

报错:

在浏览器检查中报:
Failed to load resource: the server responded with a status of 502 (Bad Gateway)

可能问题:可能就是没有在虚拟环境下启动uwsgi
解决方法:
	pkill -9 uwsgi (公司部署的项目不要这么做)
	cd ~/.virtualenvs  #到虚拟环境所在目录
	workon python37_django #切换虚拟环境
	cd /www/www.oasystem.com/oasystem #进入后端项目
	uwsgi --ini uwsgi.ini #启动
	
	

你可能感兴趣的:(二、ubuntu+django+nginx+uwsgi+vue:部署django+vue前后端分离项目)