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

1 篇文章 0 订阅
1 篇文章 0 订阅

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

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

  • 服务器:阿里云
  • 系统:ubantu16.04
  • web服务器:uWSGI
  • 静态文件文件服务器:nginx

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

Nginx:
是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势
uwsgi:
是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

运行过程:
nginx作为服务器的最前端,它将接受WEB的所有请求,统一管理请求。nginx把所有静态请求自己来处理(这是nginx的强项,静态文件像我们django博客项目中的static文件夹下面的图片,css,js)。然后nginx将所有的非静态请求(像显示文章的详细信息,通常这类信息都保存在数据库,因此需要调用数据库获取数据)通过uwsgi传递给Django,由django来处理,从而完成一次WEB请求。uwsgi的作用就类似一个桥接器,起到桥梁的作用

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

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

sudo adduser bamboo

给新用户添加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
sudo apt-get update#更新apt
sudo apt-get install python3-pip#安装pip3

并且更新pip

 sudo -H pip3 install --upgrade pip

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

安装制定版本的django

sudo -H pip3 install django==1.11.8

因为开发需要,我们还需要安装djangorestframework

sudo -H pip3 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

当然你也可以通过scp方式传送部分文件

scp /home/bamboo/project/db.sqlite3 bamboo@远程服务器地址:/home/bamboo/laboo_equipment/sbgl_jerrywang

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

成功启动后的页面

常见错误:

  • 端口被占用
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 mkdir -p /etc/uwsgi/sites
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

文件意思:

socket :指定项目执行的端口号
chadir :指定项目的目录
module :可以这么来理解,对于- myweb_uwsgi.ini文件来说,与它的平级的有一个easyblog目录,这个目录下有一个wsgi.py文件
master :允许主线程存在(true)
processes:开启的进程数量(这里是开启4个进程)
vacuum :当服务器退出的时候自动清理环境,删除unix socket文件和pid文件
配置文件的含义未完待续
uwsgi配置含义说明
uwsgi中文官方文档
我们已经完成了配置文件,但系统无法自动运行我们的服务。我还需要等待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 /media  {
        alias /path/to/project/media;
    }
    location /static {
        alias /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

7.1 为小程序配置https证书

阿里dns解析配置

SSL证书>证书控制台>下载>nginx

下载证书并解压
可以看到两个文件:xx.key, xx.pem

采用SCP将文件传送至服务器端

scp ./xx.pem root@x.x.x.x:/etc/nginx/certs/

重新修改nginx配置文件

server {
    listen 80;
    listen 443 ssl;
    ssl_certificate   /etc/nginx/certs/xx.pem;
    ssl_certificate_key  /etc/nginx/certs/xx.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

    server_name www.**.cn;

    location = /favicon.ico {access_log off;log_not_found off;}
    location /media {
        alias /home/bamboo/laboo_equipment/sbgl_jerrywang/media;
    }
    location /static {
        alias /home/bamboo/laboo_equipment/sbgl_jerrywang/collected_static;
    }

    location / {
        include       uwsgi_params;
        uwsgi_pass    unix:/run/uwsgi/sbgl_jerrywang.sock;
        client_max_body_size    2048m;  # 表示最大上传2G
    }
}

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 日志查看及分析

10.1 查看nginx日志

sudo find / -name nginx.conf
/etc/init/nginx.conf
/etc/nginx/nginx.conf
sudo vim /etc/nginx/nginx.conf
 ##
  # Logging Settings
 ##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
sudo tail -f /var/log/nginx/access.log
113.139.214.121 - - [21/Sep/2018:21:51:22 +0800] "GET /accounts/userlist/ HTTP/1.1" 200 617 "https://www.equipmentmaster.cn/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
113.139.214.121 - - [21/Sep/2018:21:51:23 +0800] "GET /message_system/user_notify_detail HTTP/1.1" 200 2 "https://www.equipmentmaster.cn/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
113.139.214.121 - - [21/Sep/2018:21:51:28 +0800] "GET /index05 HTTP/1.1" 200 13750 "https://www.equipmentmaster.cn/index" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
113.139.214.121 - - [21/Sep/2018:21:51:28 +0800] "GET /static/img/logo.png%20 HTTP/1.1" 404 209 "https://www.equipmentmaster.cn/index05" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"

1.100.109.195.91 :
$remote_addr : 客户端(用户)IP地址

2.[17/Feb/2017:00:08:11 +0800]:
‘$time_local’ :访问时间
3.“GET /data/upload/shop/common/loading.gif HTTP/1.0” :
$requestget请求的url地址(目标url地址)的host

4.200:
'$status请求状态(状态码,200表示成功,404表示页面不存在,301表示永久重定向等,具体状态码可以在网上找相关文章,不再赘述)
5. 134 :
$body_bytes_sent :请求页面大小,默认为byte

6.“http://www.mall121.com/” :
“$http_referer” : 来源页面,即从哪个页面转到本页,专业名称叫做“referer”
7.“Mozilla/4.0 (compatible; MSIE 8.0; Trident/4.0; Windows NT 6.1; SLCC2 2.5.5231; .NET CLR 2.0.50727; .NET CLR 4.1.23457; .NET CLR 4.0.23457; Media Center PC 6.0; MS-WK 8)”:
$http_user_agent:用户浏览器其他信息,浏览器版本、浏览器类型
8. “140.205.201.12” :
$http_x_forwarded_for"

2018/09/21 22:35:25 [error] 805#805: *30 open() "/home/bamboo/laboo_equipment/sbgl_jerrywang/collected_static/img/logo.png " failed (2: No such file or directory), client: 113.139.214.121, server: www.equipmentmaster.cn, request: "GET /static/img/logo.png%20 HTTP/1.1", host: "www.equipmentmaster.cn", referrer: "https://www.equipmentmaster.cn/sb_info/sbinfo"
2018/09/21 22:36:59 [error] 805#805: *63 open() "/home/bamboo/laboo_equipment/sbgl_jerrywang/collected_static/img/logo.png " failed (2: No such file or directory), client: 113.139.214.121, server: www.equipmentmaster.cn, request: "GET /static/img/logo.png%20 HTTP/1.1", host: "www.equipmentmaster.cn", referrer: "https://www.equipmentmaster.cn/index03"

未完待续,持续更新

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

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可以转移到不同的用户组
### 回答1: 1. 安装Python和Django 首先需要在Linux系统上安装Python和Django。可以使用以下命令: ``` sudo apt-get update sudo apt-get install python3 sudo apt-get install python3-pip sudo pip3 install django ``` 2. 创建Django项目 使用以下命令创建一个Django项目: ``` django-admin startproject projectname ``` 其中,projectname是你的项目名称。 3. 配置数据库 在settings.py文件中配置数据库连接。可以使用MySQL、PostgreSQL等数据库。 4. 运行Django项目 使用以下命令运行Django项目: ``` python3 manage.py runserver ``` 5. 部署Django项目 可以使用Apache或Nginx等Web服务器来部署Django项目。具体步骤可以参考相关文档。 ### 回答2: Linux是一款自由开放源代码的操作系统,可以作为服务器系统进行部署Web应用程序。而随着越来越多的Web应用程序使用Django框架构建,部署Django项目到Linux系统上也成为了一种非常重要的技术。 以下是几个部署Django项目到Linux系统上的步骤: 1. 安装所需软件和依赖项 在Linux系统上,需要安装Python解释器、Django框架、Web服务器软件(Nginx或Apache)等所需软件和依赖项。具体安装可使用Linux系统自带的包管理器进行安装。 2. 创建Django项目并配置settings 使用Django提供的命令创建Django项目,然后修改settings.py文件,根据实际需求配置数据库、静态文件路径、媒体文件路径等信息。 3. 配置Web服务器 选择合适的Web服务器软件(Nginx或Apache),并进行配置。配置需考虑到静态文件和媒体文件的处理方式,同时根据实际需求设置代理等。 4. 部署Django项目Django项目的代码部署到服务器指定目录中,并根据实际需求进行相关配置,如修改静态文件路径、媒体文件路径等。 5. 启动Web服务器和Django项目 启动Web服务器和Django项目,在浏览器中访问配置的地址,检查是否正常运行。 总之,部署Django项目到Linux系统上需要经历多个步骤和注意事项。建议在实践前进行充分准备和学习,并进行适当的测试和调试工作,以确保部署的稳定和可靠性。 ### 回答3: 在 Linux 操作系统上部署 Django 项目,需要进行如下步骤: 1. 安装 Linux 操作系统:选择一种 Linux 操作系统,例如:Ubuntu、CentOS 等,并进行安装。可以选择安装服务器版本或者桌面版本。 2. 安装 Python 环境:Django 是基于 Python 语言开发的,所以需要先安装 Python 环境。可以通过命令行输入 `python -V` 来查看已安装的 Python 版本。 3. 安装 Django:在 Python 环境下安装 Django,可以通过 `pip install django` 命令来进行安装。注意,如果你的 Django 项目使用了某些第三方库,则也需要同样地安装它们。 4. 配置项目环境:新建 Django 项目,进入项目目录,并修改 settings.py 文件中的数据库设置、静态文件设置等。 5. 启动 Django 项目:使用命令 `python manage.py runserver` 来启动 Django 项目。 6. 部署 Django 项目:将 Django 项目部署到服务器上,需要使用 WSGI 工具。使用 WSGI 工具将 Django 项目转换为可被服务器执行的 Python 应用程序。最常用的 WSGI 工具是 Gunicorn 和 uWSGI。 7. 使用 Nginx 或 Apache 配置反向代理来访问 Django 项目。通过反向代理能够实现将 Django 项目和服务器之间的访问统一在一个端口上面,同时还能提高网站访问的速度和安全性。常用的反向代理服务器有 Nginx 和 Apache。 总之,在使用 Linux 操作系统部署 Django 项目之前,需要先确定本地开发环境、Python 版本、Django 版本以及所需第三方库。然后,根据实际情况进行配置环境。最后,使用 WSGI 工具将 Django 项目部署到服务器上,并配置反向代理,完成部署
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值