阅读背景:

阿里云ubantu16.04+uWSGI + Nginx部署django项目

来源:互联网 

阿里云ubantu16.04+uWSGI + Nginx部署django项目

django因其开发速度快,功能齐全受到开发者的青睐。本文旨在指导大家从零开始,完成整个项目的部署。工具选择:

  • 服务器:阿里云
  • 系统:ubantu16.04
  • web服务器:uWSGI
  • 静态文件文件服务器:nginx
    估计绝大数人都有一个很大的疑惑,为什么要用这么多工具,用这么大的篇幅配置。我们开发的时候,当你敲下 runserver这个命令django的会自动构建一个开发服务器.但是,这个不能用于生产环境。主要是两个原因,一是在真正的部署以后,用户的请求量大,稳定性要求比较高,测试服务器满足满足不了。二是,测试服务是无法长期保持进程。当你的回话关闭后,服务也随着停止。

1 创建拥有sudo 权限的非root用户

你首先得购买一个阿里云的服务器,并且完成安全组等的配置。同时,root账号拥有更改系统文件的权限,在其账号下直接部署项目有非常大的安全风险。一般情况下,需要专门建立一个用户部署你的项目。 本着不重复造轮子的原则,请参照我之前一篇博文。[从零开始配置阿里云GPU服务器训练深度学习模型](https://blog.csdn.net/lo_bamboo/article/details/78601328),其中详细说明了其配置方法。 给新用户添加sudo权限
usermod -aG sudo bamboo 
给新用户添加root权限
usermod -aG root bamboo 

2 安装django及其相关的包

阿里云服务器默认安装的python2.7版本。但我们为了后期维护的方便性,我们使用python3版本的django,因此,为了不影响其他软件的使用。需要创建一个环境专门管理我们的系统。这样也方便后期一个服务器上部署多个系统。创建虚拟环境有很多方法,有virtual、anaconda等,也可以直接讲系统默认python切换为python3.

2.1 python2和python3的切换

将默认python版本切换为python3
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 150
并且更新pip
 sudo -H pip3 install --upgrade pip

2.2 安装django及其其他依赖的包

安装制定版本的django
sudo -H pip install django==1.11.8
因为开发需要,我们还需要安装djangorestframework
pip install djangorestframework

3 clone项目到阿里云服务器

我们的项目都是在开发服务器开发完成,最后在云服务器上进行部署。直接将github上的代码clone到云服务器。并配置代码更新时,手动或自动拉取远程库的代码,并重启服务。

3.1 设置部署公钥

首先需要生成公钥并粘贴到远程服务器中 生成公钥
ssh-keygen -t rsa -C "邮箱名称"
查看公钥
cat /home/用户名/.ssh/id_rsa.pub 
在远程库配置云服务器公钥

3.2 clone项目

将项目clone到云服务器
git clone git@gitee.com:项目名称.git

4 修改setting.py文件

为了配置程序的访问地址,修改setting文件。这其中就包含默认地址,静态文件的地址,还有网址。

4.1 设置访问地址

# 设置可以访问的域名
ALLOWED_HOSTS = ['*', 'www.域名.com','127.0.0.1','远程ip地址']

4.2 设置静态文件地址

STATIC_URL = '/static/'
部署时用 python manage.py collectstatic 就可以把各应用下及公共的静态文件收集到(复制到) STATIC_ROOT 目录
STATIC_ROOT = os.path.join(BASE_DIR, 'collected_static')

5 通过django开发服务器测试

5.1 收集静态文件

在开发服务器中,会自动按照STATICFILES_DIRS》》》各应用下static文件查找css,js文件。当部署到生产服务器时,直接到STATIC_ROOT中查找,而不去其他地方查找。
python manage.py collectstatic

5.2 启动django开发服务器

在启动开发服务器之前,必须采用查看安全组是否已经开放其端口,并且查看防火墙是不是已经开放这个端口。当端口号小于1024时,需要root权限才能访问。因此,不要设置端口号小于1024
python manage.py runserver 0.0.0.0:8081
![成功启动后的页面](https://img-blog.csdn.net/20180519160503992?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xvX0JhbWJvbw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) **常见错误:**
  • 端口被占用
Error: That port is already in use.

解决方法:
查看开放的端口,选择一个未被占用的端口

sudo netstat -nlp#查看端口情况
  • 没有权限访问该端口
Error: You don't have permission to access that port.

解决方法:
不要设置端口号小于1024

  • 没有报错,远程就是无法访问

解决方法:
查看防火墙状态

sudo ufw status

开启对应的端口号,如8080端口

sudo ufw allow 8080

其次,查看阿里云安全组设置,是否开启相关的端口号。

以上所有内容主要是为了测试django是否安装正确,系统能否正常访问。启动服务还是采用开发服务器启动的。下面将正式通过服务器程序管理django程序。

6 启动uWSGI 应用服务

首先,就需要安装uwsgi

6.1 安装uWSGI

sudo -H pip install uwsgi

安装成功后

......
Installing collected packages: uwsgi
Successfully installed uwsgi-2.0.17

6.2 快速测试uWSGI

我们可以通过命令行快速测试uwsgi是否工作。

#无虚拟环境的情况下
uwsgi --http :8081 --chdir /home/bamboo/welldaq -w wellDAQ.wsgi
#有虚拟环境的情况下
uwsgi --http :8081 --home /home/bamboo/anaconda3/envs/welldaq --chdir /home/bamboo/welldaq -w wellDAQ.wsgi
  • http 配置我们监听端口
  • home 虚拟环境地址,我们在conda中建立的虚拟环境。如果在
  • chdir wsgi.py文件地址

输出以下内容:

*** Starting uWSGI 2.0.17 (64bit) on [Sat May 19 17:13:00 2018] ***
compiled with version: 5.4.0 20160609 on 19 May 2018 08:29:28
os: Linux-4.4.0-121-generic #145-Ubuntu SMP Fri Apr 13 13:47:23 UTC 2018
nodename: laboo_aliyun
.......

如果不报错,就是正常。
并在浏览器中,测试一下是否是通的。你会发现页面没有css和静态文件

通过以上操作,已经完全可以访问页面了。但是存在一个问题,无法长期访问,无法自动配置多线程。且无法访问静态文件。下面所有内容均是为了解决以上问题。

6.3 创建配置文件

以上通过命令启动的uwsgi服务,每次启动都需要敲一遍命令。也无法自动化运行。因此,我们需要写一个配置文件把启动内容固化下来。

sudo vim /etc/uwsgi/sites/welldaq.ini

创建文件,并写入编辑配置文件

[uwsgi]
project=wellDAQ
uid=bamboo
base=/home/%(uid)
projectdir=welldaq

chdir=%(base)/%(projectdir)
home=%(base)/anaconda3/envs/%(projectdir)
module=%(project).wsgi:application

master=true
processes=5

socket=/run/uwsgi/%(project).sock
chown-socket=%(uid):www-data
chmod-socket=660
vacuum=true

配置文件的含义未完待续
我们已经完成了配置文件,但系统无法自动运行我们的服务。我还需要等待nginx配置完成。

6.4 为uWSGI 创建一个系统单元文件

配置文件已经完成,我们需要配置一个系统文件,让其自动管理我们的uwsgi服务。
更多推荐阅读Linux 系统启动过程,将会详细解析,linux系统管理的相关内容。

sudo vim /etc/systemd/system/uwsgi.service
[Unit]
Description=uWSGI Emperor service

[Service]
ExecStartPre=/bin/bash -c 'mkdir -p /run/uwsgi; chown bamboo:www-data /run/uwsgi'
ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/sites
Restart=always
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all

[Install]
WantedBy=multi-user.target

配置文件的含义未完待续

7 安装并配置Nginx作为反向代理服务器

安装nginx

sudo apt-get install nginx

编辑nginx配置文件

sudo vim /etc/nginx/sites-available/welldaq
server {
    listen 80;
    server_name 47.*.*.*;

    location = /favicon.ico {access_log off;log_not_found off;}
    location /static {
        root /home/bamboo/welldaq/collected_static;
    }

    location / {
        include uwsgi_params;
        uwsgi_pass    unix:/run/uwsgi/wellDAQ.sock;
    }
}

配置文件的含义未完待续
连接配置文件

sudo ln -s /etc/nginx/sites-available/welldaq /etc/nginx/sites-enabled/

配置文件语法检查

sudo nginx -t

检查结果如下,表用语法正常

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

重启nginx服务

sudo systemctl restart nginx

8 设置uWSGI 和Nginx自动运行

现在我们可以启动我们的uwsgi服务了

sudo systemctl start uwsgi

如果以上所有配置正常,就可以正常访问了。但是,很多情况下,会出现一些错误。这是,根据错误提示,进行错误排查就非常重要了。

9 版本更新

网站上线后,不可避免的,要进行版本迭代和更新。通过git进行版本管理是个非常好的方法。在代码更新后,进行相应的操作,让系统重新运行起来。

9.1 通过git pull 同步远程库代码

在正常开发过程中,采用git做版本管理时。我在开发分支进行程序开发。测试无误之后才将代码合并到主分支。在拉取代码前,请检查pull的远程分支是否正确。

git pull#默认拉取默认分支

9.2 自动拉取远程库的代码

9.3 静态文件收集

如果程序更新时,静态文件发生变化,重新收集一下静态文件。

python manage.py collectstatic

9.4 重启服务

重启服务最简单的方法就是重启一下服务器。如果服务器上有其他应用无法重启。你可以重启一下服务。

sudo systemctl restart nginx
sudo systemctl restart uwsgi

10 总结

未完待续,持续更新

常见错误总结及其排查方法

Job for uwsgi.service failed because the control process exited with error code. See "systemctl status uwsgi.service" and "journalctl -xe" for details.
systemctl status uwsgi.service
● uwsgi.service - uWSGI Emperor service
   Loaded: loaded (/etc/systemd/system/uwsgi.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
 uwsgi.service: Failed at step EXEC spawning /usr/local/bin/uwsgi: No such file or directory
sudo systemctl enable nginx
Synchronizing state of nginx.service with SysV init with /lib/systemd/systemd-sysv-install...
Executing /lib/systemd/systemd-sysv-install enable nginx
sudo systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/uwsgi.service to /etc/systemd/system/uwsgi.service.
sudo tail -F /var/log/nginx/error.log #查看输出错误
sudo systemctl status uwsgi 

一些基础知识的补充

chown -R lamport:users *
功能:更改某个文件或目录的属主和属组。这个命令也很常用。例如root用户把自己的一个文件拷贝给用户xu,为了让用户xu能够存取这个文件,root用户应该把这个文件的属主设为xu,否则,用户xu无法存取这个文件。
语法:chown [选项] 用户或组 文件
说明:chown将指定文件的拥有者改为指定的用户或组。用户可以是用户名或用户I D。组可以是组名或组ID。文件是以空格分开的要改变权限的文件列表,支持通配符。 该命令的各选项含义如下:
-R 递归式地改变指定目录及其下的所有子目录和文件的拥有者。
-v 显示chown命令所做的工作。
chgrp和chown 的都是转移文件属主 但是chown只能在同一个用户组里面转换而chgrp可以转移到不同的用户组

分享到: