在阿里云上使用 Ubuntu16.04+Nginx + Gunicorn部署Django项目

喜你入骨 提交于 2019-12-01 06:46:30

在阿里云上使用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文件夹下的

    1. 启动配置文件
    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

完成项目上线,通过域名可以进行访问。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!