在阿里云上使用Ubuntu16.04 + Nginx + Gunicorn部署Django项目
在本机上访问Django项目和在线上访问Django项目是两种不同的需求体验,前者主要要求是可以进行调试,通常是个人访问;但部署在后者上则会有人来访问,需要考虑并发问题,因此使用Django自带的runserver不能满足需要。
环境:阿里云服务器、已购买域名并备案、python 3.6.4 虚拟环境、Ubuntu16.04
请先参照我的这篇文章完成虚拟环境配置再进行以下操作。
https://blog.csdn.net/u014793102/article/details/80302975
0 生成requirements.txt
在开始之前,确保你自己的电脑是可以运行项目的。请在自己的电脑上进入虚拟环境后,使用 pip freeze > requirements.txt 命令生成requirements.txt。
(venv)duke@coding:/myproject$ pip freeze > requirements.txt
项目所需要的依赖环境都会在这个txt里,将此txt上传至git项目中,以便于在阿里云服务器中使用这些依赖环境。
1.1 阿里云安全组设置
通过阿里云控制台进行安全组的设置,开放以下端口。
开放端口后,需要在控制台重启服务器(不是进入服务器重启)。
1.2 安装相关软件
- 安装mysql
root@coding:~# apt-get update
root@coding:~# apt-get install mysql-server
The following NEW packages will be installed:
libcgi-fast-perl libcgi-pm-perl libencode-locale-perl libevent-core-2.0-5
libfcgi-perl libhtml-parser-perl libhtml-tagset-perl libhtml-template-perl
libhttp-date-perl libhttp-message-perl libio-html-perl
liblwp-mediatypes-perl liburi-perl mysql-client-5.7 mysql-client-core-5.7
mysql-common mysql-server mysql-server-5.7 mysql-server-core-5.7
0 upgraded, 19 newly installed, 0 to remove and 115 not upgraded.
Need to get 18.6 MB of archives.
After this operation, 162 MB of additional disk space will be used.
Do you want to continue? [Y/n]
Y
#输入两次MySQL密码
安装nginx
root@coding:~# apt-get install nginx The following NEW packages will be installed: fontconfig-config fonts-dejavu-core libfontconfig1 libgd3 libvpx3 libxpm4 libxslt1.1 nginx nginx-common nginx-core 0 upgraded, 10 newly installed, 0 to remove and 115 not upgraded. Need to get 2715 kB of archives. After this operation, 8752 kB of additional disk space will be used. Do you want to continue? [Y/n] Y
1.3 项目准备
首先要把本地项目放到服务器上,一种是直接用scp命令把本地项目复制到服务器上,另外一种是用git。在这里我建议大家使用git,至于其中的方便和好处实在太多,可以自己去多了解以下。
项目主页:https://coding.net/u/ssh_jie/p/b2c-shop(我这个是私有项目,因此下面要输入名户名和密码,如果你的项目是公有项目,会直接clone)
#创建项目
root@coding:~# mkdir -p /opt/duke
root@coding:~# cd /opt/duke
root@coding:/opt/duke# git init
Initialized empty Git repository in /opt/duke/.git/
root@coding:/opt/duke# git config --global user.email "123456@qq.com"
root@coding:/opt/duke# git config --global user.name "123456"
root@coding:/opt/duke# git checkout -b xadmin #项目中的分支是xadmin
Switched to a new branch 'xadmin'
#在master主分支clone,直接git clone 地址即可,我的项目是在xadmin分支,因此需要加参数-b xadmin
root@coding:/opt/duke# git clone -b xadmin https://git.coding.net/ssh_jie/b2c-shop.git
Username for 'https://git.coding.net':#输入用户名(公有项目没有这项)
Password for 'https://duke276877855@git.coding.net':#输入密码(公有项目没有这项)
- 使用virtualenv创建项目的虚拟环境
一个项目创建一个virtualenv的虚拟环境,在这个环境中,可以用pip安装项目所需的库,不会影响其他项目。切记一个项目一个虚拟环境,否则可能会发生莫名的错误。
#1.创建虚拟环境
root@coding:/opt/duke# virtualenv --no-site-package venv
Using base prefix '/root/.pyenv/versions/3.6.4'
New python executable in /opt/duke/venv/bin/python3.6
Also creating executable in /opt/duke/venv/bin/python
Please make sure you remove any previous custom paths from your /root/.pydistutils.cfg file.
Installing setuptools, pip, wheel...done.
#2.切换到虚拟环境
root@coding:/opt/duke# source venv/bin/activate
(venv) root@coding:/opt/duke# # (venv)表示该项目处于虚拟环境中
#安装依赖环境
(venv) root@coding:/opt/duke# cd b2c-shop/
(venv) root@coding:/opt/duke/b2c-shop# pip install -r requirements.txt
#创建数据库
(venv) root@coding:/opt/duke/b2c-shop# mysql -uroot -p
Enter password:
mysql> create DATABASE xadmin DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
Query OK, 1 row affected (0.00 sec)
#修改数据库配置
mysql> use mysql;
Database changed
mysql> update user set host="%" where user="root";
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> exit
Bye
#修改mysql配置
(venv) root@coding:/opt/duke/b2c-shop# apt-get install vim
(venv) root@coding:/opt/duke/b2c-shop# cd /etc/mysql/mysql.conf.d/
(venv) root@coding:/etc/mysql/mysql.conf.d# vim mysqld.cnf
#找到这一行,在其前面加入#注释这一句
bind-address = 127.0.0.1
#bind-address= 127.0.0.1
:wq 保存退出vim
(venv) root@coding:/etc/mysql/mysql.conf.d# service mysql restart
#返回原目录
(venv) root@coding:/etc/mysql/mysql.conf.d# cd -
/opt/duke/b2c-shop
(venv) root@coding:/opt/duke/b2c-shop#
(venv) root@coding:/opt/duke/b2c-shop# cd fruits_b2c/
(venv) root@coding:/opt/duke/b2c-shop/fruits_b2c# vim settings.py
- 修改配置文件
#部署到服务器上必须要关闭DEBUG,域名放到host里
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
ALLOWED_HOSTS = ['.liuzq.xin']
#修改database
# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST':'',#输入阿里云IP地址,公有地址,不要输入私有地址
'PORT':'3306',
'USER':'root',
'PASSWORD':'',#输入数据库密码
'NAME':'xadmin'
}
}
:wq
保存退出vim
#创建数据库中表
#方法一
(venv) root@coding:/opt/duke/b2c-shop/fruits_b2c# cd ..
(venv) root@coding:/opt/duke/b2c-shop# mysql -uroot -p
Enter password:
mysql> use xadmin;
Database changed
mysql> source /opt/duke/b2c-shop/dumps.sql;#会将所有数据导入
mysql> exit
Bye
#方法二(创建的是空的表)
(venv) root@coding:/opt/duke/b2c-shop# python manage.py makemigrations
(venv) root@coding:/opt/duke/b2c-shop# python manage.py migrate
(venv) root@coding:/opt/duke/b2c-shop# python manage.py createsuperuser
#收集静态资源
(venv) root@coding:/opt/duke/b2c-shop# python manage.py collectstatic
#如果你使用xadmin后台,没有使用django自带的admin后台,执行这条命令,否则不需要执行这句
(venv) root@coding:/opt/duke/b2c-shop# cp -R xadmin/static/xadmin/ static/
2 开始部署
2.1 安装和配置 Gunicorn
1.安装Gunicorn
(venv) root@coding:/opt/duke/b2c-shop# pip install gunicorn
#退出虚拟环境
(venv) root@coding:/opt/duke/b2c-shop# deactivate
2.配置Gunicorn
root@coding:/opt/duke/b2c-shop# vim /etc/systemd/system/gunicorn_duke.service
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=root
Group=root
WorkingDirectory=/opt/duke/b2c-shop
ExecStart=/opt/duke/venv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/opt/duke/b2c-shop/fruits_b2c.sock fruits_b2c.wsgi:application
#fruits_b2c是我项目名称,你要替换为你自己的项目名。wsgi.py和settings.py并列
[Install]
WantedBy=multi-user.target
#保存退出
:wq
上面的配置信息中需要根据自己的项目改的有以下几个地方:
- User 填写自己当前用户名称
- WorkingDirectory 填写项目的地址
- ExecStart 中第一个地址是虚拟环境中 gunicorn 的目录,所以只需要改前半部分虚拟环境的地址即可
- workers 3 这里是表示3个进程,可以自己改
- unix 这里的地址是生成一个 sock 文件的地址,直接写在项目的根目录即可
fruits_b2c.wsgi 表示的是项目中 wsgi.py 的地址,我的项目中就是在 fruits_b2c文件夹下的
- 启动配置文件
root@coding:/opt/duke/b2c-shop# systemctl start gunicorn_duke root@coding:/opt/duke/b2c-shop# systemctl enable gunicorn_duke root@coding:/opt/duke/b2c-shop# systemctl status gunicorn_duke #成功的话会在文件夹中看到fruits_b2c.sock这个文件,或如图所示
4.后续如果对 gunicorn 配置文件做了修改后,使用以下命令
root@coding:/opt/duke/b2c-shop# systemctl daemon-reload
root@coding:/opt/duke/b2c-shop# systemctl restart gunicorn_duke
2.2 配置nginx
在b2c-shop中创建文件夹logs,然后创建两个log文件。
root@coding:/opt/duke/b2c-shop# mkdir logs
root@coding:/opt/duke/b2c-shop# cd logs
root@coding:/opt/duke/b2c-shop/logs# touch nginx.access.log
root@coding:/opt/duke/b2c-shop/logs# touch nginx.error.log
创建nginx配置文件
root@coding:/opt/duke/b2c-shop# cd ..
root@coding:/opt/duke/b2c-shop# vim /etc/nginx/sites-available/mynginx
修改配置,我的域名是www.liuzq.xin,参照我的配置,将域名替换为你的备案过的域名。
server {
# 端口和域名
listen 80;
server_name www.liuzq.xin;
# 日志
access_log /opt/duke/b2c-shop/logs/nginx.access.log;
error_log /opt/duke/b2c-shop/logs/nginx.error.log;
# 不记录访问不到 favicon.ico 的报错日志
location = /favicon.ico { access_log off; log_not_found off; }
# static 和 media 的地址
location /static/ {
root /opt/duke/b2c-shop;
}
location /media/ {
root /opt/duke/b2c-shop;
}
# gunicorn 中生成的文件的地址
location / {
include proxy_params;
proxy_pass http://unix:/opt/duke/b2c-shop/fruits_b2c.sock;
}
}
server {
listen 80;
server_name liuzq.xin;
rewrite ^(.*) http://www.liuzq.xin$1 permanent;
}
保存退出
进行nginx链接
root@coding:/opt/duke/b2c-shop# cd /etc/nginx/sites-enabled/
删掉你以前创建的软链接,不然不能正常显示,default软链接可删可不删。
root@coding:/etc/nginx/sites-enabled# ln -s /etc/nginx/sites-available/mynginx
检查配置是否正确
root@coding:/etc/nginx/sites-enabled# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重启nginx服务器,完成配置
root@coding:/etc/nginx/sites-enabled# systemctl restart nginx
后续如果对nginx配置文件进行修改
#后续对nginx修改后
root@coding:/etc/nginx/sites-enabled# nginx -t
root@coding:/etc/nginx/sites-enabled# systemctl restart nginx
完成项目上线,通过域名可以进行访问。
来源:CSDN
作者:程序员duke
链接:https://blog.csdn.net/u014793102/article/details/80308778