阿里云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 [email protected]:项目名称.git

3.3 自动拉取远程库的代码

**后期更新**

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/aHR0cHM6Ly9ib…) **常见错误:**
  • 端口被占用
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 总结

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

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可以转移到不同的用户组
文章来源: 阿里云ubantu16.04+uWSGI + Nginx部署django项目

人吐槽 人点赞

猜你喜欢

发表评论

用户名: 密码:
验证码: 匿名发表

你可以使用这些语言

查看评论:阿里云ubantu16.04+uWSGI + Nginx部署django项目