美文网首页程序员
Ubuntu + Django + Uwsgi + Nginx

Ubuntu + Django + Uwsgi + Nginx

作者: 橘子的皮 | 来源:发表于2020-09-20 11:14 被阅读0次

    准备安装

    环境

    • 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
    

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

    到此即部署完成

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

    相关文章

      网友评论

        本文标题:Ubuntu + Django + Uwsgi + Nginx

        本文链接:https://www.haomeiwen.com/subject/cubuyktx.html