前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >django 项目部署详细教程 【uwsgi + nginx】

django 项目部署详细教程 【uwsgi + nginx】

原创
作者头像
ruochen
修改2021-05-13 14:32:55
3K0
修改2021-05-13 14:32:55
举报

项目部署

1. 环境搭建

<font color='red'>不使用 Anaconda 可直接跳到创建虚拟环境</font>

1.1 Anaconda 下载

1.2 Anaconda 安装

  • 下载好后传到Linux
    在这里插入图片描述
    在这里插入图片描述
  • 安装
代码语言:txt
复制
  root@iZwz9ijwralw5z37wd16xsZ:~# bash ~/Downloads/Anaconda3-5.3.1-Linux-x86_64.sh 
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uxvB4xoo-1596510168906)(C:\Users\user\AppData\Roaming\Typora\typora-user-images\image-20200726085008704.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uxvB4xoo-1596510168906)(C:\Users\user\AppData\Roaming\Typora\typora-user-images\image-20200726085008704.png)]
  • 回车安装到默认路径即可
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QVZgCMiB-1596510168908)(C:\Users\user\AppData\Roaming\Typora\typora-user-images\image-20200726085429443.png)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QVZgCMiB-1596510168908)(C:\Users\user\AppData\Roaming\Typora\typora-user-images\image-20200726085429443.png)]
  • 建议输入yes,输入No的话还需要自己手动添加路径,否则conda将无法正常运行
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xnxv4n7e-1596510168910)(C:\Users\user\AppData\Roaming\Typora\typora-user-images\image-20200726085610006.png)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xnxv4n7e-1596510168910)(C:\Users\user\AppData\Roaming\Typora\typora-user-images\image-20200726085610006.png)]
  • 是否安装VSCode,随便,我这里不安装
  • 启动服务root@iZwz9ijwralw5z37wd16xsZ:~# source ~/.bashrc
  • 输入conda list , 安装成功会显示包名

1.3 环境配置

  • 创建 anaconda 环境
  • conda create -n name python版本号
代码语言:txt
复制
```
代码语言:txt
复制
root@iZwz9ijwralw5z37wd16xsZ:~# conda create -n MyDjango python=3.6.2
代码语言:txt
复制
```

<span id='create'></span>

1.4 创建虚拟环境

  • 下载虚拟环境pip包
    • pip install virtualenv
    • pip install virtualenvwrapper
  • 修改 .bashrc 文件
代码语言:txt
复制
vim ~/.bashrc
# 添加下面代码
export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/workspace
source /usr/local/bin/virtualenvwrapper.sh

# 使 .bashrc 生效
source ~/.bashrc
  • 使用 anaconda环境/python环境 创建新虚拟环境
  • mkvirtualenv --python='指定路径' 环境名称
  • eg:
代码语言:txt
复制

mkvirtualenv --python='/root/anaconda3/envs/MyDjango/bin/python' MyDjango

代码语言:txt
复制

默认情况下,新创建的环境将会被保存在/Users/<user_name>/anaconda3/env目录下,其中,<user_name>为当前用户的用户名。 不指定python环境的话,默认会选择本地的python版本

  • 进入虚拟环境
  • workon MyDjango

2. 项目拉到服务器

2.1 项目迁移

2.1.1 方法一(Xftp)
  • 通过 Xftp 将项目文件从本机直接拉到服务器
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VIpr7KCT-1596510168912)(C:\Users\user\AppData\Roaming\Typora\typora-user-images\image-20200726094725914.png)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VIpr7KCT-1596510168912)(C:\Users\user\AppData\Roaming\Typora\typora-user-images\image-20200726094725914.png)]
2.2.2 方法二(git)

2.2 安装项目依赖包

  • 在本机项目中通过 pip freeze > requirement.txt 命令将项目所需包输出到 requirement.txt 文件中
  • 服务器端项目中。通过 pip install -r requirements.txt 命令安装包

3. uwsgi

  • 遵循 wsgi 协议的 web 服务器
在这里插入图片描述
在这里插入图片描述

3.1 uwsgi 的安装

  • pip install uwsgi

3.2 uwsgi 的配置

  • 项目部署时,需要修改 settings.py 文件
代码语言:txt
复制
```
代码语言:txt
复制
DEBUG=FALSE
代码语言:txt
复制
ALLOWED_HOSTS=['*']
代码语言:txt
复制
```
  • 在项目中新建一个文件 uwsgi.ini,方便启动/终止 uwsgi 服务
代码语言:txt
复制
```
代码语言:txt
复制
[uwsgi]
代码语言:txt
复制
# 使用nginx链接时使用
代码语言:txt
复制
# socket=127.0.0.1:8000
代码语言:txt
复制
# 直接做web服务器使用 python manage.py runserver ip:port
代码语言:txt
复制
http=127.0.0.1:8000
代码语言:txt
复制
# 项目目录 [pwd查看 直接填,不需要引号]
代码语言:txt
复制
chdir=
代码语言:txt
复制
# 项目中wsgi.py文件的目录,相对于项目目录
代码语言:txt
复制
wsgi-file=
代码语言:txt
复制
# 指定启动的工作进程数
代码语言:txt
复制
processes=4
代码语言:txt
复制
# 指定工作进程中的线程数
代码语言:txt
复制
threads=2
代码语言:txt
复制
# 进程中,有一个主进程
代码语言:txt
复制
master=True
代码语言:txt
复制
# 保存启动之后主进程的pid
代码语言:txt
复制
pidfile=uwsgi.pid
代码语言:txt
复制
# 设置uwsgi后台运行, uwsgi.log 保存日志信息
代码语言:txt
复制
daemonize=uwsgi.log
代码语言:txt
复制
# 设置虚拟环境的路径 [cd .virtualenvs]
代码语言:txt
复制
virtualenv=
代码语言:txt
复制
```

下面是我的uwsgi.ini 文件配置,可以参考一下。

代码语言:txt
复制
[uwsgi]
# 使用nginx链接时使用
socket=127.0.0.1:8000
# 直接做web服务器使用 python manage.py runserver ip:port
# http=127.0.0.1:8000
# 项目目录 [pwd查看 直接填,不需要引号]
chdir=/root/MyDjango
# 项目中wsgi.py文件的目录,相对于项目目录
wsgi-file=MyDjango/wsgi.py
# 指定启动的工作进程数
processes=4
# 指定工作进程中的线程数
threads=2
# 进程中,有一个主进程
master=True
# 保存启动之后主进程的pid
pidfile=uwsgi.pid
# 设置uwsgi后台运行, uwsgi.log 保存日志信息
daemonize=uwsgi.log
# 设置虚拟环境的路径 [cd .virtualenvs]
virtualenv=/root/.virtualenvs/MyDjango

3.3 uwsgi 的启动和停止

  • 启动: uwsgi --ini 配置文件路径
    • 例如: uwsgi --ini uwsgi.ini
    • 启动后,ps aux | grep uwsgi 命令可以查看uwsgi 进程
  • 停止: uwsgi --stop uwsgi.pid 路径
    • 例如: uwsgi --stop uwsgi.pid

这里有一个小问题,如果遇到可以看一下解决方法

问题:

执行启动后,报错信息 uwsgi: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory

解决方法:

sudo apt-get install libpcre3 libpcre3-dev # 安装需要的包

find / -name libpcre.so.3 # 找到libpcre.so.3(一般在根目录/lib/x86_64-linux-gnu下)

找到 /lib/x86_64-linux-gnu/libpcre.so.3

sudo ln -s /lib/x86_64-linux-gnu/libpcre.so.3 /usr/lib/libpcre.so.1 # 做软链接即可

仅仅使用uwsgi,首页的静态文件不能显示

解决方法:

在uwsgi前面在加一个nginx服务器

nginx中进行配置

如果是动态请求,转交请求给uwsgi

如果是静态请求,提前把项目用到的静态文件放到nginx所在电脑的某个目录中

根据配置,nginx就会去目录下方找到静态文件,直接返回给用户

4. nginx

在这里插入图片描述
在这里插入图片描述

4.1 nginx 配置转发请求给 uwsgi

  • uwsgi 需要更改配置文件
代码语言:txt
复制
```
代码语言:txt
复制
[uwsgi]
代码语言:txt
复制
# 使用nginx链接时使用
代码语言:txt
复制
socket=127.0.0.1:8080
代码语言:txt
复制
# 直接做web服务器使用 python manage.py runserver ip:port
代码语言:txt
复制
# http=127.0.0.1:8080
代码语言:txt
复制
# 项目目录 [pwd查看 直接填,不需要引号]
代码语言:txt
复制
chdir=
代码语言:txt
复制
# 项目中wsgi.py文件的目录,相对于项目目录
代码语言:txt
复制
wsgi-file=
代码语言:txt
复制
# 指定启动的工作进程数
代码语言:txt
复制
processes=4
代码语言:txt
复制
# 指定工作进程中的线程数
代码语言:txt
复制
threads=2
代码语言:txt
复制
# 进程中,有一个主进程
代码语言:txt
复制
master=True
代码语言:txt
复制
# 保存启动之后主进程的pid
代码语言:txt
复制
pidfile=uwsgi.pid
代码语言:txt
复制
# 设置uwsgi后台运行, uwsgi.log 保存日志信息
代码语言:txt
复制
daemonize=uwsgi.log
代码语言:txt
复制
# 设置虚拟环境的路径 [cd .virtualenvs]
代码语言:txt
复制
virtualenv=
代码语言:txt
复制
```
  • nginx配置转发请求给 uwsgi,配置路径为 /etc/nginx/sites-available/default
代码语言:txt
复制
```
代码语言:txt
复制
http{
代码语言:txt
复制
	server {
代码语言:txt
复制
		listen 80;
代码语言:txt
复制
		server_name localhost;
代码语言:txt
复制
		location / {
代码语言:txt
复制
            # 包含uwsgi的请求参数
代码语言:txt
复制
            include uwsgi_params;
代码语言:txt
复制
            # 转交请求给uwsgi
代码语言:txt
复制
            uwsgi_pass 127.0.0.1:8000  # uwsgi服务器的ip:port
代码语言:txt
复制
    	}
代码语言:txt
复制
	}
代码语言:txt
复制
}
代码语言:txt
复制
```
  • 下面是我的 default 配置信息,加了静态文件处理【静态文件处理请继续往下看】,可以参考一下 ``` upstream MyDjango { server 127.0.0.1:8000; }
代码语言:txt
复制
server {
代码语言:txt
复制
        listen 80;
代码语言:txt
复制
        server_name localhost;
代码语言:txt
复制
        location / {
代码语言:txt
复制
                include uwsgi_params;
代码语言:txt
复制
                uwsgi_pass MyDjango;
代码语言:txt
复制
        }
代码语言:txt
复制
        location /static {
代码语言:txt
复制
                alias /var/www/MyDjango/static;
代码语言:txt
复制
        }
代码语言:txt
复制
}
代码语言:txt
复制
```

ps aux | grep nginx # 查看是否有nginx进程

  • 启动nginx
    • /etc/init.d/nginx start 【终止命令为: /etc/init.d/nginx stop】也可以用如下命令 service nginx start service nginx stop service nginx restart service nginx reload
  • 启动uwsgi
    • uwsgi --ini uwsgi.ini

4.2 nginx配置处理静态文件

代码语言:txt
复制
http{
	server {
		listen 80;
		server_name localhost;
		
		location / {
            # 包含uwsgi的请求参数
            include uwsgi_params;
            # 转交请求给uwsgi
            uwsgi_pass 127.0.0.1:8080  # uwsgi服务器的ip:port;
    	}
    	
    	# 请求的路径中以static开头,就匹配下列地址
    	location /static {
    		# 指定静态文件存放的目录
    		alias 目录 例如: /var/xxx/static;
    						/var/www/MyDjango/static;
    	}
	}
}
  • django settings.py 中配置收集静态文件路径
代码语言:txt
复制
```
代码语言:txt
复制
# settings.py 中设置
代码语言:txt
复制
STATIC_ROOT=收集的静态文件路径  例如: /var/xxx/static
代码语言:txt
复制
# 例如,我的路径为 STATIC_ROOT = '/var/www/MyDjango/static'
代码语言:txt
复制
```
  • 创建文件夹
代码语言:txt
复制
`sudo mkdir -p /var/www/MyDjango/static`
代码语言:txt
复制
> 普通用户没有权限,需要修改文件权限
>
代码语言:txt
复制
> sudo chmod 777 /var/xxx/static/
  • django 收集静态文件的命令
    • python manage.py collectstatic
    • 执行上面的命令会把项目中所使用的静态文件收集到 STATIC_ROOT 指定的目录下
  • 重启nginx服务

/etc/init.d/nginx reload

到这里,项目就部署完成了,还有其他需求可以继续往下看。

4.3 nginx转发请求给另外地址

  • 在 location 对应的配置项中增加 proxy_pass 转发的服务器地址,

如当用户访问 127.0.0.1 时,在nginx 中配置把这个请求转发给 172.10.179.115:80(nginx)服务器,让这台服务器提供静态页面

  • nginx配置如下:
代码语言:txt
复制
```
代码语言:txt
复制
http{
代码语言:txt
复制
	server {
代码语言:txt
复制
		listen 80;
代码语言:txt
复制
		server_name localhost;
代码语言:txt
复制
		location / {
代码语言:txt
复制
            # 包含uwsgi的请求参数
代码语言:txt
复制
            include uwsgi_params;
代码语言:txt
复制
            # 转交请求给uwsgi
代码语言:txt
复制
            uwsgi_pass 127.0.0.1:8080  # uwsgi服务器的ip:port;
代码语言:txt
复制
    	}
代码语言:txt
复制
    	# 请求的路径中以static开头,就匹配下列地址
代码语言:txt
复制
    	location /static {
代码语言:txt
复制
    		# 指定静态文件存放的目录
代码语言:txt
复制
    		alias 目录 例如: /var/xxx/static;
代码语言:txt
复制
    	}
代码语言:txt
复制
    	# 等号为精确匹配
代码语言:txt
复制
    	location = / {
代码语言:txt
复制
    		# 传递请求给静态文件服务器上的nginx
代码语言:txt
复制
    		proxy_pass http://ip;
代码语言:txt
复制
    	}
代码语言:txt
复制
	}
代码语言:txt
复制
}
代码语言:txt
复制
```

4.4 nginx 配置 upstream 实现负载均衡

在这里插入图片描述
在这里插入图片描述
  • nginx 配置负载均衡时,在 server 配置的前面增加 upstream 配置项
代码语言:txt
复制
```
代码语言:txt
复制
http{
代码语言:txt
复制
    # 名称随便起
代码语言:txt
复制
    upstream ruochen {
代码语言:txt
复制
        server 127.0.0.1:8080;
代码语言:txt
复制
        server 127.0.0.1:8081;
代码语言:txt
复制
    }
代码语言:txt
复制
	server {
代码语言:txt
复制
		listen 80;
代码语言:txt
复制
		server_name localhost;
代码语言:txt
复制
		location / {
代码语言:txt
复制
            # 包含uwsgi的请求参数
代码语言:txt
复制
            include uwsgi_params;
代码语言:txt
复制
            # 转交请求给uwsgi
代码语言:txt
复制
            # uwsgi_pass 127.0.0.1:8080  # uwsgi服务器的ip:port;
代码语言:txt
复制
            uwsgi_pass ruochen;  # 上面名字是啥,这里就是啥
代码语言:txt
复制
    	}
代码语言:txt
复制
    	# 请求的路径中以static开头,就匹配下列地址
代码语言:txt
复制
    	location /static {
代码语言:txt
复制
    		# 指定静态文件存放的目录
代码语言:txt
复制
    		alias 目录 例如: /var/xxx/static;
代码语言:txt
复制
    	}
代码语言:txt
复制
    	# 等号为精确匹配
代码语言:txt
复制
    	location = / {
代码语言:txt
复制
    		# 传递请求给静态文件服务器上的nginx
代码语言:txt
复制
    		proxy_pass http://ip;
代码语言:txt
复制
    	}
代码语言:txt
复制
	}
代码语言:txt
复制
}
代码语言:txt
复制
```

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 项目部署
    • 1. 环境搭建
      • 1.1 Anaconda 下载
      • 1.2 Anaconda 安装
      • 1.3 环境配置
      • 1.4 创建虚拟环境
    • 2. 项目拉到服务器
      • 2.1 项目迁移
      • 2.2 安装项目依赖包
    • 3. uwsgi
      • 3.1 uwsgi 的安装
      • 3.2 uwsgi 的配置
      • 3.3 uwsgi 的启动和停止
    • 4. nginx
      • 4.1 nginx 配置转发请求给 uwsgi
      • 4.2 nginx配置处理静态文件
      • 4.3 nginx转发请求给另外地址
      • 4.4 nginx 配置 upstream 实现负载均衡
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档