• Django之nginx+wsgi后台部署(最新版)


    0-部署准备

    1.要使用安全组打开腾讯云的80端口

    腾讯云的80端口不能访问​www.jianshu.com图标

    以实际项目部署为例
    项目名称api_learn;
    Python版本:python 3.6.6;
    虚拟环境名字:djangoEnv;
    端口:80;
    服务器托管:腾讯云;
    服务器版本:ubuntu 16.04;

    2.SCP上传项目

    scp -r "本地文件目录地址" ubunt@公网IP地址:/"目标地址"

    例子

    scp -r /Users/lhj/Downloads/api_learn ubuntu@IP:/home/ubuntu

    3.本地项目上传之后的配置

    1.目录结构问题

    我的Django项目中只有一个主要的app名为Inquire,该app有自己的静态文件夹static。在正常的Django项目中,不同的app也应该有各自的static文件夹,但是在之后的nginx配置过程中,我们需要提供项目的一个静态目录地址,这就需要把Django项目所有app的static文件整合到一个文件夹中。此时setting.py文件中关于静态目录的设置如下:

    STATIC_URL = '/static/'
    # 添加app的静态文件地址,绝对地址和相对地址都可以
    STATICFILES_DIRS = [
        "/home/ubuntu/api_learn/static"
    ]
    # 统一的静态文件地址
    STATIC_ROOT = os.path.join(BASE_DIR, "static/")

    配置好后,我们在服务器终端命令行中的/home/ubuntu/HelloWorld目录下执行以下语句完成整合:

    python manage.py collectstatic

    2.1 数据库配置

    2.1.1 数据库安装和配置

    青空琉璃:ubuntu18.04下远程连接MySQL数据库​zhuanlan.zhihu.com图标

    2.2.2 数据库表新建

    青空琉璃:MySQL使用命令行创建数据库​zhuanlan.zhihu.com图标

    对应数据库,django项目的setting.py文件

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': '数据库名称',
            'USER': '使用者',
            'PASSWORD': '数据库密码',
            'HOST': '127.0.0.1',
        }
    }
    # 我们需要一个第三方库用来与MySQL交互,Python3已经不再使用mysqldb,所以我们下载pymysql:
    pip install pymysql
    #同时在Django项目中的__init__.py中引用:
    import pymysql 
    pymysql.install_as_MySQLdb()

    用Mysql建好项目的数据库,然后进入HelloWord目录,用django应用数据模型:

    (python使用虚拟环境)

    python manage.py makemigrations
    python manage.py migrate

    建立后台超级用户:

    python manage.py createsuperuser

    3. 公网访问配置

    DEBUG = False 
    ALLOWED_HOSTS = ['*']

    测试

    注意到以上两点后,我们可以进行测试了,在项目目录

    python manage.py runserver 0.0.0.0:8000

    由于在命令行的界面,所以我们可以先将命令放到后台运行

    python manage.py runserver 0.0.0.0:8000 &

    那么我们也可以将前台运行的转到后台去

    # ctrl+z暂停任务
    # jobs 查看暂停任务
    # bg %[序号] 将任务放到后台继续执行
    # fg %[序号] 将任务放到前台继续执行

    1-环境安装

    简单介绍一下:uWSGI是一个Web服务器,而uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。由于uWSGI是C语言应用程序,所以需要一个C编译器(gcc或clang)和Python开发头文件,所以输入以下语句:

    sudo apt-get install build-essential python-dev

    build-essential提供编译程序必须软件包的列表信息。python-dev就可以让我们安装一个源外的,内含需要编译的调用python api的c/c++文件的python类库。然后输入以下指令安装uwsgi:

    sudo pip install uwsgi # 安装

    安装后进行简单的测试,在本地写好如下的测试代码命名为 test.py,把文件传到云主机任意目录下:

    def application(env, start_response):
        start_response('200 OK', [('Content-Type','text/html')])
        return ["success!"]

      该目录下输入以下命令:

    >> uwsgi --http :8000 --wsgi-file test.py

    访问8000端口

    curl 127.0.0.1:8000 
    # 成功返回success

    配置uWSGI, 在项目路径下创建uwsgi.ini 文件, 配置如下:

    [uwsgi]
    #使用nginx连接时使用
    #socket=127.0.0.1:8080
    #直接做web服务器使用
    http=127.0.0.1:8080
    #项目目录
    chdir=/home/ubuntu/test
    #项目中wsgi.py文件的目录,相对于项目目录
    wsgi-file=test/wsgi.py
    processes=4
    threads=2
    master=True
    pidfile=uwsgi.pid
    daemonize=uswgi.log

    在uwsgi.ini文件所在目录下, 启动uwsgi 命令:

    uwsgi --ini uwsgi.ini

    检查是否运行成功

    curl 127.0.0.1:8000
    # 成功返回首页界面

    至此, uwsgi配置完成.

    安装 nginx

    1.安装并运行

    sudo apt-get install nginx
    service nginx start

    查看是否启动成功:

    curl 127.0.0.1

    nginx安装成功.

    配置nginx

    现在就可以在项目根目录下面创建项目名_nginx.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 127.0.0.1; # 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 /media  {
            alias /home/ubuntu/api_learn/media;  # your Django project's media files - amend as required
        }
    
        location /static {
            alias /home/ubuntu/api_learn/static; # your Django project's static files - amend as required
        }
    
        # Finally, send all non-media requests to the Django server.
        location / {
            uwsgi_pass  127.0.0.1:8080;
            include     uwsgi_params; # the uwsgi_params file you installed
        }
    }

    此时将uwsgi.ini 文件里的http=127.0.0.1:8080注释掉, 启用上一行的socket=127.0.0.1:8080.

    然后把这个配置文件链接到sites-enabled目录下:

    sudo ln -s /etc/nginx/sites-available/HelloWorld /etc/nginx/sites-enabled/

    检查一下配置文件的语法是否有问题,提示ok就可以

    sudo service nginx configtest

    重启服务:

    service nginx restart

    测试

    curl 127.0.0.1
    # 返回项目首页

    至此, nginx 与 wsgi连接完成.

    5. 遇到问题

    我们可以查看端口号占用情况并杀掉进程

    netstat -apn|grep 8000
    kill -9 <pid>
  • 相关阅读:
    设计模式学习系列3 观察者模式
    设计模式学习系列2 面向对象的5大原则(转)
    设计模式学习系列1 单例模式
    又见到面试的毕业生
    猎头给我打电话
    DirectX基础学习系列8 渐进网格以及外接体
    directX基础学习系列7 网格(自己创建)
    DirectX 基础学习系列6 字体
    语艺杂谈1 – MAP赋值与插入
    DirectX基础学习系列5 融合技术
  • 原文地址:https://www.cnblogs.com/mylovelulu/p/11133632.html
Copyright © 2020-2023  润新知