背景
有一个Django项目,前端、后端和模型连接测试通过,数据库使用的是SQLite,但这只是一个开发环境,性能不能满足生产需要,故使用nginx+uwsgi+MariaDB进行加强。
环境
Ubuntu 16.04
-
Nginx安装
Nginx是一个高性能的HTTP和反向代理web服务器,优点是轻量级;占有内存少;处理并发能力强;支持热部署,可以不间断运行。
Nginx处理静态页面能力强,但处理动态能力不足,一般是搭配其他模块进行处理。本实验的处理流程示意图。
Ubuntu的安装命令如下:
sudo apt install nginx
安装之后需要对nginx进行配置,在Ubuntu 16.04下查看/etc/nginx/nginx.conf
可以看到配置文件是conf.d和sites-enabled文件夹下配置文件,其中sites-enabled文件夹下的所有文件都是配置文件。本实验修改的是sites-enabled文件夹下的default文件,修改为:
server {
listen 80;
server_name # 域名
location /static/ {
alias # django项目中静态资源目录
autoindex off;
}
location / {
include uwsgi_params;
uwsgi_pass # uwsgi配置文件中的socket;例如yourproject.sock
}
}
比较重要的是location,/static获取django的静态资源目录,/则负责和uwsgi相连接;在django项目目录下静态资源生成代码:
python manage.py collectstatic
配置好uwsgi和nginx的config文件之后再启动。
启动Nginx服务并启用自动启动:
sudo systemctl start nginx
sudo systemctl enable nginx
nginx检测配置文件是否修改成功:
sudo nginx -t
查看服务状态:
sudo systemctl status nginx.service
2. 安装和配置uwsgi
通过pip install uwsgi失败,之后通过conda安装成功:
conda install -c conda-forge uwsgi
在django项目目录下创建一个uwsgi.ini的配置文件:
module = yourproject.wsgi:application
master = true
processes = 5
socket = yourproject.sock
chmod-socket = 664
vacuum = true
die-on-term = true
其中,yourproject为实际的django项目名称。之后创建一个systemd服务文件。
sudo vim /etc/systemd/system/yourproject.service
写入以下内容:
[Unit]
Description=uWSGI instance to serve yourproject
After=network.target
[Service]
User=youruser
Group=www-data
WorkingDirectory=/path/to/your/project/root
Environment="PATH=/path/to/your/virtualenv/bin"
ExecStart=/path/to/your/virtualenv/bin/uwsgi --ini uwsgi.ini
[Install]
WantedBy=multi-user.target
将youruser改为实际系统用户名,WorkingDirectory为django项目路径,Environment为虚拟环境路径。
启动uwsgi服务:
sudo systemctl start yourproject
sudo systemctl enable yourproject
启动后在django项目目录下后出现yourproject.sock文件,把这个文件名填写到nginx配置文件中的uwsgi_pass,启动nginx,完成nginx、uwsgi、diango的连接。
3.MariaDB安装
下载命令:
sudo apt install mariadb-server
查看数据库是否运行:
sudo systemctl status mariadb
安装命令:
sudo mysql_secure_installation
会提问是否设置root秘密,按需选择,本实验选择n,之后几个选择都选y。
以root用户身份进行数据库:
sudo mysql
创建一个用户,用于连接django:
GRANT ALL PRIVILEGES ON *.* TO 'yourname'@'localhost' IDENTIFIED BY 'yourpassword';
创建数据库:
create database yourDB;
安装pymysql:
pip install pymysql
在django项目目录下的/core/__init__.py文件下添加以下两行,使用pymysql进行处理。
import pymysql
pymysql.install_as_MySQLdb()
修改core/settings.py中的数据库部分的内容:
DEBUG = False
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'youriDB',
'USER': 'yourUser',
'PASSWORD': 'yourPassword',
'HOST': 'localhost',
'PORT': '3306',
'OPTIONS': {
'charset': 'utf8mb4',
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
},
}
}
同步新数据库:
python manage.py migrate
如果需要将旧数据库的内容迁移至新数据库,应该先修改core/settings.py中的DATABASES,改为原来数据库设置,使用以下代码将数据库中的数据打包:
python manage.py dumpdata --output=data.json
再次修改DATABASES为新据库设置,将data.json数据迁移至新数据库:
python manage.py loaddata data.json
结尾
记录下项目部署的步骤,期间遇到很多错误,是因为没有清楚代码的具体含义,应该要加强下linux系统的学习和逻辑能力。
有任何错误,欢迎指正和讨论。