程序猿阵线联盟-汇总各类技术干货程序员

从零开始在 Ubuntu 下部署 Nginx__uWSGI__D

2017-06-12  本文已影响0人  流月0

<br />
个人技术博客地址:http://songmingyao.com/


<br />

环境:Ubuntu 16.04

1 准备工作

2 安装并配置虚拟环境(本机)

2.1 更新软件源

sudo apt-get update
sudo apt-get upgrade

2.2 安装虚拟环境

sudo pip2 install virtualenv
sudo pip2 install virtualenvwrapper
  1. 创建虚拟环境管理目录
mkdir ~/.virtualenvs
  1. 打开.bashrc
sudo vi ~/.bashrc 
  1. .bashrc的末尾增加以下内容
export WORKON_HOME=$HOME/.virtualenvs  # 所有虚拟环境存储的目录
source /usr/local/bin/virtualenvwrapper.sh
  1. 启用配置文件
source ~/.bashrc

2.3 创建虚拟环境

mkvirtualenv django_blog
# 创建虚拟环境
mkvirtualenv <name>

# 列出所有虚拟环境
workon TAB*2

# 进入虚拟环境
workon <name>

# 退出虚拟环境
deactivate

# 删除虚拟环境
rmvirtualenv <name>

2.4 安装django包

pip install django==1.8.2

3 创建一个django演示项目(本机)

3.1 创建项目

django-admin startproject project_test

3.2 创建应用

cd project_test/
tree
  1. 创建应用
python manage.py startapp app_test

3.3 修改项目配置

3.3.1 修改环境变量

3.3.2 创建模板文件夹、静态文件文件夹和应用urls

3.3.3 修改settings

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]

3.4 创建页面

3.4.1 修改项目urls

url(r'^', include('app_test.urls')),
#coding=utf-8
from django.conf.urls import  url
from . import views  # 从当前文件夹内引入views

urlpatterns = [
    url(r'^$', views.index),  # 匹配到根目录,就执行views文件内的index函数
]
#coding=utf-8
from django.shortcuts import render

# Create your views here.
def index(request):
    return render(request, 'app_test/index.html')
    # 对请求值不做任何处理,直接跳转到模板目录下app_test文件夹下的index.html页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Index</title>
</head>
<body>
    <h1>下面有一张图片</h1>
    ![](/static/img/test.jpg)  // 寻找static(settings里面的STATIC_URL)文件夹下img文件夹里的test.jpg图片
</body>
</html>

3.5 打开页面

python manage.py runserver

4 将项目上传至服务器(本机 & 服务器)

4.1 导出虚拟环境内的包(本机)

pip freeze > plist.txt

4.2 将项目文件夹整体上传至服务器

scp -r <YOUR_LOCAL_PROJECT_DIR> <SERVER_USERNAME>@<SERVER_IP>:<YOUR_SERVER_PROJECT_DIR>

4.3 在服务器上安装虚拟环境(服务器)

pip install -r plist.txt

5 安装uWSGI(服务器)

sudo apt-get install python-dev
sudo apt-get install gcc
pip install uwsgi

6 配置Django(服务器)

ALLOWED_HOSTS = ['*', ]
python manage.py runserver 0:8000
<YOUR SERVER IP>:8000

2017.06.08更新

1.请检查防火墙状态,保证8000端口是能够被访问的,代码如下( 更多防火墙设置可以参考我这篇文章http://t.cn/RSuX8Qj

# 检查防火墙状态
sudo ufw status

# 可以临时关闭防火墙
sudo ufw disable

# 或者保持防火墙开启,允许8000端口连接
sudo ufw allow 8000

2.请检查服务器安全组规则,如阿里云服务器,可以在进入管理控制台后,按以下步骤设置( 如要了解更多服务器安全组规则设置,请参见阿里云官方文档http://t.cn/RST7Sgz

3.重启服务,再次在本地计算机浏览器中查看

DEBUG = False

7 配置uWSGI(服务器)

7.1 打通uWSGI和Python

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return ["Hello World"]  # python2
    # return [b"Hello World"]  # python3
uwsgi --http :8000 --wsgi-file test.py
127.0.0.1:8000
web client <-> uWSGI <-> Python

7.2 打通uWSGI和Django

[uwsgi]
# 使用nginx连接时使用
# socket = 0:8001

# 直接做web服务器使用
http = 0:8080

# 项目目录
chdir = /home/python/Desktop/project_test

# 项目中wsgi.py文件的目录
wsgi-file = /home/python/Desktop/project_test/project_test/wsgi.py

# 主进程
master = true

# 多进程&多线程
processes = 6
threads = 2

# .sock文件目录需与Nginx文件内的配置相同
# socket = /home/python/Desktop/project_test/my_sock.sock
# chmod-socket = 666

# 以守护进程的方式启动
vacuum = true


# 存储pid进程
pidfile=uwsgi.pid

# 存储log日志
daemonize=uwsgi.log
uwsgi --ini my_uwsgi.ini
[uWSGI] getting INI configuration from my_uwsgi.ini
<YOUR_SERVER_IP>:8080
web client <-> uWSGI <-> Django
uwsgi --stop uwsgi.pid

8 配置Nginx(服务器)

8.1 安装Nginx

sudo apt-get install nginx
Welcome to nginx!

If you see this page, the nginx web server is successfully installed and working. Further configuration is required.

For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.

Thank you for using nginx.
web client <-> the web server(Nginx)

8.2 配置Nginx

cp /etc/nginx/uwsgi_params .
upstream django {
    server    127.0.0.1:8001;
    # server      unix://home/python/Desktop/project_test/my_sock.sock;
}

server {
    listen      8000;  # 端口号
    server_name 127.0.0.1;  # 服务器 ip 或是域名
    charset     utf-8;  # 字符集

    # 最大上传限制
    # client_max_body_size 75M;

    location /media  {
        alias /home/python/Desktop/project_test/media_common;  # 媒体文件所在文件夹
    }

    location /static {
        alias /home/python/Desktop/project_test/static_common;  # 静态文件所在文件夹
    }


    # 将所有非媒体请求转到Django服务器上
    location / {
        uwsgi_pass      django;  # 最上方已定义
        # 将所有参数都转到uwsgi下
        include         /home/python/Desktop/project_test/uwsgi_params; # uwsgi_params的路径
    }
}

sudo ln -s /home/python/Desktop/project_test/my_nginx.conf /etc/nginx/sites-enabled/
sudo mkdir static_common
sudo mkdir media_common
STATIC_ROOT = os.path.join(BASE_DIR, 'static_common')
MEDIA_ROOT = os.path.join(BASE_DIR, 'media_common')
python manage.py collectstatic
sudo /etc/init.d/nginx restart

9 Nginx & uWSGI & Django(服务器)

9.1 测试Nginx

9.2 测试uWSGI

uwsgi --socket :8001 --wsgi-file test.py

9.3 用UNIX socket取代TCP port

upstream django {
    # server    127.0.0.1:8001;
    server      unix:///home/python/Desktop/project_test/my_sock.sock;
}

server {
    listen      8000;  # 端口号
    server_name songmingyao.com;  # 服务器 ip 或是域名
    charset     utf-8;  # 字符集

    # 最大上传限制
    # client_max_body_size 75M;

    location /media  {
        alias /home/python/Desktop/project_test/media_common;  # 媒体文件所在文件夹
    }

    location /static {
        alias /home/python/Desktop/project_test/static_common;  # 静态文件所在文件夹
    }


    # 将所有非媒体请求转到Django服务器上
    location / {
        uwsgi_pass      django;  # 最上方已定义
        # 将所有参数都转到uwsgi下
        include         /home/python/Desktop/project_test/uwsgi_params; # uwsgi_params的路径
    }
}
[uwsgi]
# 使用nginx连接时使用
# socket = 0:8001

# 直接做web服务器使用
# http = 0:8080

# 项目目录
chdir = /home/python/Desktop/project_test

# 项目中wsgi.py文件的目录
wsgi-file = /home/python/Desktop/project_test/project_test/wsgi.py

# 主进程
master = true

# 多进程&多线程
processes = 6
threads = 2

# .sock文件目录需与Nginx文件内的配置相同
socket = /home/python/Desktop/project_test/my_sock.sock
chmod-socket = 666

# 以守护进程的方式启动
vacuum = true

# 存储pid进程
pidfile=uwsgi.pid

# 存储log日志
daemonize=uwsgi.log
sudo /etc/init.d/nginx restart

uwsgi --stop uwsgi.pid
uwsgi --ini my_uwsgi.ini
web client <-> web server(nginx) <-> the socket <-> uwsgi <-> Django

9.4 服务器开机自启

/usr/local/bin/uwsgi --ini /home/python/Desktop/project_test/my_uwsgi.ini

<br />


个人技术博客地址:http://songmingyao.com/
<br />

上一篇 下一篇

猜你喜欢

热点阅读