Ubuntu + Django + Uwsgi + Nginx 线上部署

准备安装

环境

  • Ubuntu 16.04.6
  • Python 3.7.8
  • Django 3.0.6
  • Uwsgi 2.0.19.1
  • Nginx 1.10.3

安装python3.7

ubuntu 自带python2.7、python3.5

  • 查看所有版本
~# ls /usr/bin/python*

/usr/bin/python     /usr/bin/python2.7-config    /usr/bin/python2-pbr  /usr/bin/python3.5-config   /usr/bin/python3m-config
/usr/bin/python2    /usr/bin/python2-config      /usr/bin/python3      /usr/bin/python3.5m          /usr/bin/python3-config     
/usr/bin/python2.7  /usr/bin/python2-jsonschema  /usr/bin/python3.5    /usr/bin/python3.5m-config  /usr/bin/python3m
/usr/bin/python-config
没有3.7的版本
  • 安装python3.7
~# sudo apt-get install python3.7
  • 查看默认版本
~# python --version 
Python 3.5.2
  • 系统默认环境不是python3.7 更改默认为python3.7
    先删除默认的Python软链接
~# sudo rm /usr/bin/python
  • 添加默认的Python软链接指向3.7
~# sudo ln -s /usr/bin/python3.7 /usr/bin/python
  • 再次查看默认版本
~# python --version 
Python 3.7.8
  • 安装pip包管理工具
~# wget https://bootstrap.pypa.io/get-pip.py

~# python get-pip.py

安装成功  查看pip版本
~# pip -V
pip 20.1.1 from /usr/local/lib/python3.7/dist-packages/pip (python 3.7)

安装虚拟环境

  • venv (python内置 仅支持Python3以上版本)
  • virtualenv
  • anaconda3

我们使用venv

  • 创建名为 envpy37 的python3.7的虚拟环境
~# python -m venv envpy37
  • 进入虚拟环境
~# source env/bin/activate  
(envpy37) :~# 

退出envpy37
~# deactivate

为了方便切换,我们设置一个别名

~# vi .bashrc

添加 alias envpy37='source env_py37/bin/activate'

保存 退出 vim 

生效.bashrc

~# source .bashrc

用设置的别名启动虚拟环境

~# envpy37

(env_py37) :~# 

查看虚拟环境的python版本

(env_py37) :~# python -V

Python 3.7.7

安装Git

~# sudo apt install git

为了方便XShell或者CRT连接服务器,建议安装OpenSSH
~# sudo apt install openssh-server openssh-client

~# service ssh restart

安装MySQL

~# sudo apt install mysql-server mysql-client

~# sudo apt-get install libmysqld-dev

  • 测试mysql
  • 本地登陆mysql
  • 修改登陆权限
  • 开启ssh远程连接权限
  • 用工具测试远程连接

测试项目

  • 把项目用Git或者ftp 推上服务器 (比如存放在/srv/)

  • 切换到python虚拟环境 ,比如上面提到的 env_py37

  • 进入项目根目录

(env_py37) :~# cd project
(env_py37) project:~#
  • 这个虚拟环境下安装依赖包 requirements.txt (可以通过pip freeze .)获取该文件内容
(env_py37) project:~# pip install -r requirements.txt  
  • 迁移数据
(env_py37) project:~# python manage.py makemigrations
(env_py37) project:~# python manage.py migrate
  • 运行项目
    • 记得开放8000端口
    • 在setting.py-----ALLOW_HOST 改成 ["*"]
    • 在setting.py-----DEBUG=False
    • 在浏览器用ip访问 http://<your ip>:8000
    • 确保没有错误,和在本地运行一样没有任何错误
(env_py37) project:~# python manage.py runserver 0.0.0.0:8000

安装uwsgi应用服务器

  • uwsgi必须安装在系统级别的Python环境中,不要安装到虚拟环境中
# 记得退出虚拟环境
(env_py37) project:~# deactivate

~# pip install uwsgi
  • 测试uwsgi
    • 在根目录下新建一个testuwsgi.py 并且添加内容
    • 测试uwsgi服务器的响应 执行testuwsgi.py (必须在testuwsgi的同级目录下执行)
(env_py37) :~# cd project
(env_py37) project:~# vi testuwsgi.py3

#添加以下代码 
def application(env,start_response):
    start_response('200 ok',[('Content-Type','text/html')])
    return [b'Hello world']
    


(保存退出vim)
(env_py37) project:~# uwsgi --http :8000 --wsgi-file testuwsgi.py

在浏览器用ip访问 http://<your ip>:8000
正常结果是是返回一个Hello world 网页
  • 为项目配置uwsgi的启动文件
(env_py37) project:~# vi project_uwsgi.ini

#添加以下配置
[uwsgi]

# 虚拟环境的路径
home=/root/env_py37

# 项目的绝对路径
chdir=/srv/project

#主进程
master=true
# 工作进程
processes=4

# 工作线程
threads=2

# socket 用于连接nginx (nginx的server)
socket=127.0.0.1:8002

# 退出的时候是否清理环境
vacuum=true

# 设置一个uwsgi.pid 文件 
pidfile = uwsgi.pid

# 项目的wsgi文件
wsgi-file=shudong_server/wsgi.py

(保存退出vim)
  • 测试启动文件
(env_py37) project:~# uwsgi --ini djangotest.ini

没有错误的话,可以试着访问项目

安装nginx

  • nginx是一个web服务器。用来加载静态文件和接收http请求的
  • 同样安装到系统环境
  • nginx常用命令
    • 启动nginx:service nginx start
    • 关闭nginx:service nginx stop
    • 重启nginx:service nginx restart
    • 刷新nginx配置: nginx -s reload
~# sudo apt install nginx
~# nginx -v
nginx version: nginx/1.10.3 (Ubuntu)  # 安装成功
  • 收集静态文件

    • 静态文件应该让nginx来处理,而不是让django来做。
    • 首先确保你的settings.py文件中有一个STATIC_ROOT配置,这个配置应该指定你的静态文件要放在哪个目录下
    • 那么我们可以执行以下命令:python manage.py collectstatic来收集所有静态文件
    • 执行完毕 可以查看目录是否生成静态文件
# 在setting.py 添加以下代码

STATIC_ROOT = '/srv/project/static/' #指定静态文件目录
STATIC_URL = '/static/'
STATICFILES_DIRS = [
   os.path.join(BASE_DIR, "static"),
   '/srv/project/static/',
]
  • 编写nginx的配置文件 在/etc/nginx/conf.d目录下 新建一个project.conf
    • 测试配置文件 service nginx configtest
    • 改完配置需要重启 service nginx restart
conf.d:~# vi project.conf

#添加以下配置

# configuration of the server
server {
    # the port your site will be served on
    listen      80;
    # the domain name it will serve for
    server_name <你的域名>(可选  没有的话 用 _ 替代); # substitute your machine's IP address or FQDN
    charset     utf-8;

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

    # Django media

    location /static {
        alias /srv/project/static; # 项目静态文件目录
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  127.0.0.1:8002; # 配置和uwsgi通讯的地址(和uwsgi.ini的socket一样)
        include     /etc/nginx/uwsgi_params; # the uwsgi_params file you installed 这个文件在nginx下面,可以查看
    }
}

(保存退出vim)

nginx测试ok

在项目根目录执行 启动项目

~# service nginx start && uwsgi -d --ini uwsgi.ini

在浏览器访问 访问成功 即部署成功

到此即部署完成

第一次接触后端 如果有误~欢迎指正!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342