Django在线教育平台项目完整实现(五)
九、生产环境部署
购买阿里云服务器ECS,镜像选择CentOS 7.6 64位
使用Nginx进行端口转发
使用uwsgi为容器,拉取Django
1.安装python3.7
1.安装依赖包
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel gcc gcc-c++ openssl-devel libffi-devel python-devel mariadb-devel
2.下载python源码
下载到root文件夹下
wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tgz
3.将源码进行解压
tar -xzvf Python-3.7.3.tgz -C /tmp
进入解压目录
cd /tmp/Python-3.7.3/
4.将python3.7安装到/usr/local目录
./configure --prefix=/usr/local
make
make altinstall
5.更改/usr/bin/python链接,配置全局命令指向python3的可执行文件
-s参数为软链接,前面为源文件,后面为软链接文件(可理解为新建的快捷方式)
ln -s /usr/local/bin/python3.7 /usr/bin/python3
输入
python3
会进行版本号的显示,可按CTRL+D退出。
2.mariadb和redis
mariadb与mysql的接口完全一致
1.安装
sudo yum install mariadb-server
2.启动,重启
sudo systemctl start mariadb
sudo systemctl restart mariadb
查看mysql的进程
ps aux|grep mysql
设置安全规则,配置mysql的端口
3.设置bind-ip
vim /etc/my.cnf
按i
在[mysqld]
中:
# instructions in http://fedoraproject.org/wiki/Systemd
下面加一行:
bind-address = 0.0.0.0
使得可以监听外部连接的请求
按ESC然后:wq
4.设置外部ip可以访问
先进入mysql
mysql -uroot
使得可以进行连接
*.*
表示对所有库的所有表,root
为用户名,%
代表远程连接,123456
为密码
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;
按CTRL+C退出。
再进行访问:
mysql -uroot -p
输入密码:123456
可进行访问。按CTRL+C退出。
重新启动:
sudo systemctl restart mariadb
5.设置阿里云的对外端口
在阿里云控制台中的实例-网络和安全组-安全组配置-配置规则-入方向-快速添加,规则方向选择入方向,授权策略选择允许,勾选22、23、80、443、3306、6379端口。
在入方向中手动添加,授权策略选择允许,优先级选1,协议类型选择自定义TCP,目的输入8000/8000,源填入0.0.0.0/0。
使用本地的Navicat尝试是否可以成功连接数据库。(端口输入3306)。
6.安装mysqlclient
pip install mysqlclient
7.安装redis
yum install redis
将redis启动
service redis start
查看redis进程
ps aux|grep redis
进入redis:
redis-cli
CRTL+C可退出。
3.安装Nginx
sudo yum install epel-release
sudo yum install nginx
sudo systemctl start nginx
查看nginx进程:
ps aux|grep nginx
4.配置虚拟环境
安装依赖包:
yum install python-setuptools python-devel
安装virtualenvwrapper:
由于直接使用pip安装会出现问题,使用pip3.7来建立软链接进行安装:
ln -s /usr/local/bin/pip3.7 /usr/bin/pip3
pip3 install --upgrade pip
pip3 install virtualenvwrapper
编辑.bashrc文件
查找文件位置:
sudo find / -name virtualenvwrapper.sh
记住此路径。
此路径为下面结尾处添加中第二行中的路径,若出现问题,可按显示的路径进行修改。
vim ~/.bashrc
按i,在结尾处添加:
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh
这里为source /上述路径/virtualenvwrapper.sh
ESC,输入:wq再回车。
重新加载.bashrc文件
source ~/.bashrc
使用python3来新建虚拟环境
mkvirtualenv -p python3 mxonline
进入虚拟环境
workon mxonline
退出虚拟环境
deactivate
可使用Pycharm专业版进行上传:
菜单栏-Tools-Deployment-Configuration
添加SFTP,输入服务器名mxonlineserver,输入IP,账号密码等
在Mapping中设置本地和服务器的映射文件夹,点击Deployment path右侧可连接到服务器选择文件夹,
在root目录下新建MxOnline文件夹(和本地项目文件名保持一致),然后选中该文件夹-OK
当进行项目文件的上传时:
选中要上传的文件夹-菜单栏-Tools-Deployment-Upload to mxonlineserver,
便会上传到服务器中的相应文件夹,并且和当前项目的路径保持一致
如果只修改了其中一个文件,选中该文件进行上传便会自动覆盖。
将整个项目文件进行上传。
先安装xadmin的依赖包
cd /root/MxOnline/xadmin/
workon mxonline
pip install -r requirements.txt
其内容为:
django-crispy-forms==1.10.0
django-import-export==2.5.0
django-reversion==3.0.8
django-formtools==2.2
future==0.18.2
httplib2==0.9.2
six==1.15.0
xlwt==1.3.0
xlsxwriter==1.3.7
requests==2.25.1
再返回上级目录安装项目的依赖包
cd ..
pip install -r requirements.txt
其内容为:
django==2.2
mysqlclient
pillow
django-pure-pagination
redis
django-simple-captcha
alibabacloud_dysmsapi20170525==2.0.9
进行数据库的数据同步:
在Navicat中连接的远程数据库中新建一个mxonline数据库,选择本地的mxonline库,右键-数据传输,目标选择远程的数据库将数据进行同步。
在MxOnline/settings.py中:
修改数据库名和密码
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "mxonline",
'USER': "root",
'PASSWORD': "123456",
# 若是线上的可以指向线上的地址
'HOST': "127.0.0.1"
}
}
选中settings.py,菜单栏-Tools-Deployment-Upload to mxonlineserver
在此链接进行下载:https://github.com/twz915/DjangoUeditor3
复制文件夹里面的DjangoUeditor文件夹,放到环境下的lib/site-packages/下
服务器上的为:/root/.virtualenvs/mxonline/lib/python3.7/site-packages/
使用FileZilla将该路径下的DjangoUeditor进行替换
进行项目的运行:
要在项目的根目录下运行此命令
python manage.py runserver 0.0.0.0:8000
访问:公网IP:8000,即可看到网站。输入:公网IP:8000/xadmin,即可看到网站后台管理系统,关闭服务器命令行端口后便无法访问。
5.安装uwsgi
pip install uwsgi
6.测试uwsgi
要在虚拟环境下,项目的根目录下运行此命令
拉起项目
uwsgi --http :8000 --module MxOnline.wsgi
此时访问:公网IP:8000,页面便可访问,但会出现静态文件缺失的情况。
按CTRL+C可退出。
7.配置Nginx
在项目的根目录下新建conf文件夹,再在其中新建一个nginx和uwsgi子文件夹
在nginx文件夹下新建一个File,命名为uc_nginx.conf
在conf/nginx/uc_nginx.conf中:
# the upstream component nginx needs to connect to
# nginx遇到端口转发时,转发到8001端口
upstream django {
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
# configuration of the server
server {
# the port your site will be served on
listen 80;
# the domain name it will serve for
# 公网ip地址
server_name 填入IP地址; # substitute your machine's IP address or FQDN
charset utf-8;
# max upload size
client_max_body_size 75M; # adjust to taste
# Django media
# 使用nginx来配置时,静态文件不再由Django进行代理
# /填入目录/MxOnline/media
location /media {
alias /root/MxOnline/media; # 指向django的media目录
}
location /static {
alias /root/MxOnline/static; # 指向django的static目录
}
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass django;
include uwsgi_params; # the uwsgi_params file you installed
}
}
在uwsgi文件夹下新建一个File,命名为uwsgi.ini
在conf/uwsgi/uwsgi.ini中:
# mysite_uwsgi.ini file
[uwsgi]
# Django-related settings
# the base directory (full path)
# The root directory of the project
chdir = /root/MxOnline
# Django's wsgi file
module = MxOnline.wsgi
# the virtualenv (full path)
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 10
# the socket (use the full path to be safe
socket = 127.0.0.1:8001
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
# Path to the virtual environment
virtualenv = /root/.virtualenvs/mxonline
# Path for storing logs
#logto = /tmp/mylog.log
可使用命令查看虚拟环境的路径
ls ~/.virtualenvs/
选中conf文件夹,菜单栏-Tools-Deployment-Upload to mxonlineserver
启动uwsgi:
切换到uwsgi.ini文件所在目录下:
cd /root/MxOnline/conf/uwsgi/
uwsgi -i uwsgi.ini
使用Nginx来访问uwsgi:
新开一个服务器命令行端口
将uc_nginx.conf放到nginx的配置文件路径中,再重启一下nginx,就会加载此配置文件。
cd /root/MxOnline/conf/nginx/
将该配置文件加入到nginx的启动配置文件路径中
cp uc_nginx.conf /etc/nginx/conf.d/
更改nginx的配置文件:
vim /etc/nginx/nginx.conf
按i进行修改
将
user nginx;
worker_processes auto;
改为:
user root;
worker_processes auto;
ESC后输入:wq,保存退出。防止出现权限问题。
重新启动nginx:
sudo systemctl restart nginx
直接访问公网IP可看到网站。
但访问公网IP/xadmin,静态文件显示还有问题,因为xadmin的静态文件在xadmin文件夹的根目录下。
此时,拉取所有需要的static file到同一个目录:
在MxOnline/settings.py中:
# 省略
MEDIA_URL = "/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
# 配置静态文件的访问,在本地开发时注释掉
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
# 省略
注:若在本地运行项目,注释掉STATIC_ROOT = os.path.join(BASE_DIR, 'static')
选中settings.py文件夹,菜单栏-Tools-Deployment-Upload to mxonlineserver
到项目的根目录下:
cd /root/MxOnline/
可将各个app下的静态文件拉取到同一个目录之下:
python manage.py collectstatic
提示文件夹已存在,是否要覆盖,输入yes,回车。(若输入错误按CTRL+BACKSPACE进行删除)
再访问公网IP/xadmin,可看到静态文件已完全展示。
若访问页面时出现502,是uwsgi挂掉,重新启动uwsgi即可。
查看uwsgi进程:
ps aux|grep uwsgi
关闭uwsgi:
pkill -f uwsgi -9
关闭所有的uwsgi:
killall -s INT uwsgi
重启uwsgi,kill掉进程,uwsgi会自动进行重启。(修改代码之后需要重新启动)
pkill -f uwsgi
即使关掉命令行窗口,该IP依然可以进行网站的访问,因为uwsgi在启动之后做了后台运行的逻辑。
通过域名方式访问网站:
可在万网进行域名的购买,然后进行ICP备案,之后点入阿里云域名控制台,点击域名的解析-添加记录,记录类型选择A,输入主机记录(即子域名),记录值填入公网IP,TTL选择默认10分钟即可。
此时访问主机记录.购买的域名
或直接访问购买的域名
,会跳转到网站。
8.补充注意
在MxOnline/settings.py中:
DEBUG改为False
# SECURITY WARNING: don't run with debug turned on in production!
# 设置为False,便不会进行静态文件的代理,在本地开发时设置为True
DEBUG = False
若为True,在访问网站时输入一个错误的URL后缀,会显示Django的异常栈,这些信息比较敏感,会造成泄露。
选中settings.py文件夹,菜单栏-Tools-Deployment-Upload to mxonlineserver
重启uwsgi:
pkill -f uwsgi
此时再访问网站,输入一个错误的URL后缀,就会看到自己定义的404页面。
在本地开发时要设置为True,不然异常无法看到。且要注释掉STATIC_ROOT = os.path.join(BASE_DIR, 'static')
,数据库密码修改回root。
在每次迭代更新时,若有静态文件的变更(css、js)需要运行python manage.py collectstatic
命令。
查看nginx的日志文件
cd /var/log/nginx/
正常情况下可看访问日志:
tail -f access.log
可按CTRL+C退出。
异常可看错误日志:
tail -f error.log
可按CTRL+C退出。
Django报的错误会显示到uwsgi的日志中:
在conf/uwsgi/uwsgi.ini中:
可指定日志文件的存放位置
# Path for storing logs
logto = /tmp/mylog.log
查看日志:
cd /tmp/
tail -f mylog.log
GitHub地址:OnlineEducationPlatform