一学就会的django项目服务器部署nginx-uwsgi-django/build

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 一、前言需要在阿里云服务器部署Django-restframework框架,一开始不清楚情况,网上找了很多的文章和办法,东拼西凑也没有能够完全实现nginx和uwsgi的互通。

一、前言

需要在阿里云服务器部署Django-restframework框架,一开始不清楚情况,网上找了很多的文章和办法,东拼西凑也没有能够完全实现nginx和uwsgi的互通。

想学会?

你需要找一个干干净净的、没有安装其他东西的Linux服务器(Centos系统)来跟着这篇文章做。

参考过的文章有

-视频:Nginx + uWsgi 部署 Django + Mezzanine 生产服务器

-文章:uWSGI+django+nginx的工作原理流程与部署历程

-文章:uwsgi官方文档

-文章:Django Nginx+uwsgi 安装配置

-文章:centos7 下通过nginx+uwsgi部署django应用

二、网上文章的遗漏

因为是东拼西凑,所以无论是网上的文章还是自己拼凑的配置,都是没有办法打通的。后来红包求助,才了解到有这几个地方:

1、nginx执行权限

2、uwsgi配置

3、uwsgi设置虚拟环境

4、uwsgi安装问题及插件安装问题

5、django静态文件收集处理

三、部署安装记录

1、创建非管理员账户

由于安全需求,还是配置一个非管理员(自己操作,增加sudo授权)账户操作,通过命令创建用户名密码

adduser quinns  # 新增用户

passwd quinns  # 为quinns设置密码

设置好之后,还需要开启sudo权限,通过命令:

vi /etc/sudoers

然后找到有 root ALL=(ALL)那一行,然后在下面增加一行:

quinns ALL=(ALL)  ALL

保存即可。

下面的操作,用新用户quinns登录来操作。

2、安装依赖

uwsgi和nginx以及anaconda的安装会存在一些报错问题,这里为了避免出现这情况,所以先安装好依赖。

sudo yum install gcc-c++

sudo yum install wget openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel

sudo yum install uwsgi-plugin-python

sudo yum install libxml*

sudo yum install -y bzip2

sudo yum -y install pcre-devel

sudo yum install python-devel

sudo yum install build-essential python-dev

3、安装软件

通过quinns账户登录,然后到quinns用户目录(/home/quinns)下新建一个utils目录,把一些软件下载在utils目录下。

3.1安装anaconda

通过wget方式下载anaconda(官网)

wget https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh

如果想更快,就安装国内源(清华镜像):

wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.1.0-Linux-x86_64.sh

下载好之后sh安装

sh Anaconda3-5.0.1-Linux-x86_64.sh

一路默认,到之后面安装完的时候会提示是否添加环境变量,输入yes即可。

如果想要后面使用更快,可以更改仓库镜像:

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --set show_channel_urls yes

这样的话安装软件都是国内源,速度比较快

3.2验证是anaconda否成功安装

通过命令:

conda list

来验证是否成功安装并加入环境变量,如果出现list列表则代表成功,如果出现报错提示信息则需要用命令:

source ~/.bashrc

来添加,然后重复conda list命令。如果还是不行,则编辑/etc/profile文件,在底部添加环境变量及指向:

export PATH=/home/quinns/anaconda3/bin:$PATH

通过文件添加的环境变量需重启服务器才能生效

3.3安装uwsgi

在确认安装好anaconda之后,先不着急新建虚拟环境,直接在linux下输入python,检查默认python是否已自动替换为python3.6。接着通过pip安装uwsgi:

pip install uwsgi

待有安装成功的提示出来,再通过命令:

uwsgi --version

来确认是否成功安装。

3.4创建虚拟环境

通过anaconda来创建python虚拟环境:

conda create --name envname python=3.6.3

(亲身经历 3.6.5无法启动uwsgi,最好还是3.6.3)

观察过程,无报错即完成安装。

3.5安装nginx

直接通过yum来安装nginx即可,如果想安装新版,可以在网上寻找新方法。

sudo yum install nginx

安装完成后应该是自动启动服务,在浏览器输入ip即可访问nginx的欢迎页面。如果没有,通过命令:

sudo service nginx start/restart

来启动或者重启nginx服务。

3.6安装mysql

先下载mysql的repo源

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm

接着安装mysql-community-release-el7-5.noarch.rpm包

sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm

安装这个包后,会获得两个mysql的yum repo源:/etc/yum.repos.d/mysql-community.repo,/etc/yum.repos.d/mysql-community-source.repo。

最后执行安装

sudo yum install mysql-server

3.7重置mysql密码

先授权

sudo chown -R root:root /var/lib/mysql

service mysqld restart  # 然后重启

接着重置密码

mysql -u root  //直接回车进入mysql控制台
mysql > use mysql;
mysql > update user set password=password('quinns') where user='root';
mysql > exit;

service mysqld restart  # 然后再重启一次服务

3.8开启远程访问

mysql默认是不开启远程访问的,想要在本地连接服务器的mysql,必须开启:

mysql -u root -p

mysql> use mysql;
mysql> update user set host = '%' where user = 'root';

service mysqld restart  # 这里也要重启一次服务

(过30秒或者1分钟再测试远程连接)如果不行的话,接着重启服务一次。

四、uwsgi服务测试

安装好这些软件后,需要确保独立服务都是正常运行的。

在/home/quinns目录下新建wwwroot目录,然后在里面新建一个测试文件uwsgitest.py

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World, This uwsgi server is running"]

保存后通过命令来启动

uwsgi --http :8000 --wsgi-file uwsgitest.py

看到服务启动后,就可以在浏览器访问8080端口,如果能够正常显示文字内容,则代表uwsgi单独服务是可以正常运行的。如果没有,根据报错找原因。

五、上传django-rest项目

可以在本地,通过ssh对服务器进行连接,其中也包括上传下载服务。

本地打开终端后输入:

scp -r djangoName quinns@47.98.xxx.xxx:/home/quinns/wwwroot

将当前目录的djangoName文件夹通过quinns账户上传到/home/quinns/wwwroot目录内。回车执行后输入quinns的密码即可看到上传到指定的wwwroot目录内。

六、配置django

本地开发环境下的django和服务器的设置有些许不一样。

首先要开放ALLOWED_HOSTS,使得程序可以远程访问,然后再设置静态文件,最后再通过命令来测试是否可以顺利启动。

开启drf远程访问及静态设置

找到django项目的settings.py文件,里面有个ALLOWED_HOSTS,是接收一个空列表,现在要将服务器地址或者域名添加进去(也可以放*号,代表所有都可以指向这里,但是不推荐这么做):

ALLOWED_HOSTS = ['47.98.xxx.xxx']

上面就算是开启了远程访问,接着设置静态(drf有一些样式,如果不设置,通过uwsgi启动是无法加载的)。同样是在settings.py文件中,下部分代码中有个STATIC_URL = '/static/',在它下面新增一行:

STATIC_ROOT = os.path.join(BASE_DIR, "static/")

保存文件,然后在虚拟环境下执行命令:

python manage.py collectstatic

这样django就会收集静态文件,放到指定目录内,也就是(static目录内)

七、编写uwsgi配置

uwsgi可以通过命令来启动django项目,也可以通过配置文件ini或者xml来启动。这里已ini为例。

在项目根目录(manage.py同目录,其实哪个目录都可以,这里是方便寻找)新建文件夹conf,然后再在conf下新建uwsgi文件夹(这俩文件夹什么名字无所谓)。接着新建uwsgi的配置文件,这里暂且叫做lagou_uwsgi.ini 里面写上uwsgi与项目的配置信息:

ite_uwsgi.ini file`
    [uwsgi]

    # Django-related settings
    # the base directory (full path)
    chdir           = /home/quinns/wwwroot/GamesAPI
    # Django's wsgi file
    module          = GamesAPI.wsgi
    # the virtualenv (full path)

    # process-related settings
    # master
    master          = true
    # maximum number of worker processes
    processes       = 4
    threads         = 2
    # the socket (use the full path to be safe
    socket          = 127.0.0.1:8001
    # ... with appropriate permissions - may be needed
    # chmod-socket    = 664
    # clear environment on exit
    vacuum          = true
  virtualenv = /home/quinns/anaconda3/envs/envgames
    python-autoreload=1

    logto = /home/quinns/wwwroot/GamesAPI/uwsgilog.log

    stats = %(chdir)/conf/uwsgi/uwsgi.status
    pidfile = %(chdir)/conf/uwsgi/uwsgi.pid

具体的含义在uwsgi文档都有,这里记录一下:

chdir # 项目绝对路径

module  # 项目内的uwsgi.py文件,其实与项目同名即可

master

processes

threads

socket # 服务启动地址及端口

vacuum

virtualenv # 这个就很重要了,python虚拟环境地址

python-autoreload=1 # python自启动

logto # 自动生成日志文件及存放路径

stats

pidfile

这就算是编写好uwsgi的配置文件了,接着编写nginx的配置。

八、单项目nginx配置

最好不要改动原有的ningx,来新建一个新的.conf配置文件吧。同样在项目目录的conf目录内新建nginx文件夹,然后再在nginx文件夹里新建lagou.conf配置文件,里面写上nginx的配置:

upstream games {
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8001; # uwsgi的端口
}
# configuration of the server

error_log  /home/quinns/wwwroot/nginxerror.log;#错误日志
server {
# the port your site will be served on
listen      8080;
# 端口
server_name 47.98.xxx.xxx ; # 服务器ip或者域名
charset     utf-8;

# max upload size
client_max_body_size 75M;   # adjust to taste


# Django media
location /media  {
    alias  /home/quinns/wwwroot/GamesAPI/media;  # 指向django的media目录
}

# Django static
location /static  {
    alias  /home/quinns/wwwroot/GamesAPI/static;  # 指向django的static目录
}

# Finally, send all non-media requests to the Django server.
location / {
    uwsgi_pass  games;
    include     uwsgi_params; # uwsgi服务
}
}

里面都有说明了,我就不写了。其的upstream games中的games是自定义名称,但是要与下面的uwsgi_pass games中games名称相同。

注意: .conf文件建立好后,要与让nginx知道并承认,所以需要通过软连接来链接到/etc/nginx/conf.d/目录下,如果不知道软连接怎么做,可以把这个文件copy到这个目录下。

然后重启服务器

sudo service nginx restart

如果没有报错,应该就是可以了。

如果有报错,没有重启ng服务器,那肯定是配置文件写错了,得去看一下。

九、启动项目

既然uwsgi也配置好了,django项目的虚拟环境也pip install -r requirements.txt过了,ng的配置文件也写好了。那就可以启动服务了。

nginx的服务启停

通过linux命令来进行启停

sudo service nginx restart/start/stop

如果之前启动过,就不用重启了。

uwsgi启动项目

找到刚才编写的lagou_uwsgi.ini配置文件目录,通过命令来启动:

uwsgi -i lagou_uwsgi.init &

如果没有报错,就代表启动了。就可以在浏览器访问之前.conf配置文件配置的8080端口了。

十、nginx配置静态

后端api没有问题后,前端也要部署。

前端通过npm run build打包之后,将build文件通过ssh上传到wwwroot目录下:

scp -r build quinns@xx.xx.xx.xx:/home/quinns/wwwroot

等到上传完成后,就到nginx那里进行静态的部属配置

cd /etc/nginx

然后打开nginx.conf文件进行编辑。

首先要给nginx文件进行访问授权,否则有些目录是会报错403的。其配置文件中有:

user nginx;

这里得给他改成用户的权限,如quinns或者root

user quinns;

看到server部分的代码:

server {
    listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;
        
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {

        }
……
    ……
}

是这样的,访问网址80端口默认指向/usr/share/nginx/html目录下的index.html

因为静态打包后build也是由index.html来作为主入口的。所以这里只需要把root的指向改过来即可:

server {
    listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        #root         /usr/share/nginx/html;
        root          /home/quinns/wwwroot/build;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {

        }
……
    ……
}

将原来的root指向注释掉,增加build文件夹的指向

然后重启nginx服务,打开浏览器访问,就可以看正常的页面了。

心中一阵窃喜,这个坑终于是填上了。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
9天前
|
Java Linux
Springboot 解决linux服务器下获取不到项目Resources下资源
Springboot 解决linux服务器下获取不到项目Resources下资源
|
24天前
|
定位技术
GPS北斗卫星同步时钟(时间同步服务器)建设施工部署方案
GPS北斗卫星同步时钟(时间同步服务器)建设施工部署方案
GPS北斗卫星同步时钟(时间同步服务器)建设施工部署方案
|
16天前
|
前端开发 应用服务中间件 nginx
Nginx配置详解Docker部署Nginx使用Nginx部署vue前端项目
Nginx配置详解Docker部署Nginx使用Nginx部署vue前端项目
78 0
|
24天前
|
前端开发 应用服务中间件 nginx
使用Docker快速搭建Web服务器Nginx
本文指导如何使用Docker快速搭建Nginx服务器。首先,通过`docker pull`命令获取Nginx镜像,然后以容器形式运行Nginx并映射端口。通过挂载目录实现本地文件与容器共享,便于自定义网页。使用`docker ps`检查运行状态,访问IP:8088确认部署成功。最后,介绍了停止、删除Nginx容器的命令,强调Docker简化了服务器部署和管理。
39 0
|
1天前
|
弹性计算 JavaScript Java
阿里云服务器搭建部署宝塔详细流程
以下是内容的摘要: 本文主要介绍了在阿里云上创建和配置服务器环境的步骤,包括注册阿里云账号、实名认证、购买和设置服务器、域名的获取与备案、以及使用宝塔面板安装和配置环境。首先,用户需要注册阿里云账号并进行实名认证,选择合适的服务器配置。接着,购买服务器后,要准备并备案域名,以便通过友好的网址访问网站。在服务器上安装宝塔面板,可以方便地管理和配置LAMP/LNMP/Tomcat/Node.js等应用环境。完成这些步骤后,用户还需要在宝塔面板中安装MySQL、Redis等数据库,部署Java或Vue项目,并配置相关端口。最后,将前端项目打包上传至服务器,并设置站点,即可实现网站的上线。
|
1天前
|
应用服务中间件 Linux 开发工具
如何在阿里云服务器快速搭建部署Nginx环境
以下是内容的摘要: 本文档主要介绍了在阿里云上购买和配置服务器的步骤,包括注册阿里云账号、实名认证、选择和购买云服务器、配置安全组、使用Xshell和Xftp进行远程连接和文件传输,以及安装和配置Nginx服务器的过程。在完成这些步骤后,你将能够在服务器上部署和运行自己的网站或应用。
|
3天前
|
NoSQL 关系型数据库 MySQL
阿里云服务器部署项目流程
本文主要讲解阿里云服务器的部署,如何选择配置等
|
6天前
|
弹性计算 应用服务中间件 Linux
阿里云ECS服务器上从零开始搭建nginx服务器
阿里云ECS服务器上从零开始搭建nginx服务器
|
6天前
|
Java 应用服务中间件 Linux
阿里云服务器部署多个tomcat
阿里云服务器部署多个tomcat
|
28天前
|
前端开发 应用服务中间件 nginx
nginx中配置不输入端口(指定地址)访问项目的方法
nginx中配置不输入端口(指定地址)访问项目的方法
23 0