种类布局,Django布署到线上

本篇导航:

前言

《Django开辟简单Blog系统》体系中,我们早就落成了二个MiniWeb项目。那么,怎么把这些项目揭露到线上吗?怎么着给它二个域名呢?

思路:nginx + uwsgi

前言

《Django布署到线上》一文中,多数手续不是必须的,某些部分乃至是谬误的,本文就轻便修改一下。
目的:把djsite项目布局到/home/web目录中,并且给它分配3个域名字为djsite.voidking.com。

世家都学过了django,用django写了各类成效,写了bbs项目,写了路飞学城。

  • 大概阴毒
  • uwsgi
  • nginx
  • supervisor

境遇绸缪

境遇策动

咱俩都掌握django是贰个web框架,方便大家比不慢支付web程序,http请求的动态数据正是由web框架来提供管理的。

 

服务器

Ali云服务器,centos7连串。

supervisor

1、安装

yum install python-pip
yum install supervisor
pip install supervisor

2、创建sock

touch /tmp/supervisor.sock
chmod 777 /tmp/supervisor.sock

日前邓超先生也对nginx轻松的牵线了,本文将nginx、WSGI、uwsgi、uWSGI、django那多少个关系梳理一下。

一、简单狂暴

python

升迁python到叁.陆.一,统1线上和本地python碰着。

1、下载python3.6.1源码
wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz

二、解压源码

xz -d Python-3.6.1.tar.xz
tar -xvf Python-3.6.1.tar

三、编写翻译源码

mkdir /usr/local/python3
cd Python-3.6.1
./configure --prefix=/usr/local/python3 --enable-optimizations
make && make install

假确定人员编制写翻译失利,需求先更新编写翻译情状:

gcc -v 
g++ -v

yum install gcc
yum install gcc-c++

注:笔者的景况版本为 gcc version 四.八.五 二〇一四0623 (Red Hat 四.8.五-1①) (GCC)

4、替换python

cd /usr/bin
mv python python.bak
ln -s /usr/local/python3/bin/python3.6 /usr/bin/python
ll python*
python -V

伍、消除遗留难点
有着python相关的使用,如若使用/usr/bin/python早先的台本,替换为/usr/bin/python二.7。比如:

vim /usr/bin/yum
vim /usr/libexec/urlgrabber-ext-down

python虚拟机

1、安装pyenv套装
curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
剧情除了含有 pyenv 以外,还带有如下插件:

  • pyenv-doctor
  • pyenv-installer
  • pyenv-update
  • pyenv-virtualenv
  • pyenv-which-ext

二、路线加多
vim ~/.bash_profile,添加:

export PATH="/root/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

三、使配置立刻生效
source ~/.bash_profile

四、查看安装景况
pyenv -v

五、常用命令

  • 查看可设置的python版本列表:pyenv install -l
  • 设置钦点版本的python:pyenv install 3.6.1
  • 查看已安装的python:pyenv versions
  • 查阅当前设为暗中认可的python版本:pyenv version
wsgi    全称web server gateway interface,wsgi不是服务器,也不是python模块,只是一种协议,描述web server如何和web application通信的规则。
运行在wsgi上的web框架有bottle,flask,django

uwsgi    和wsgi一样是通信协议,是uWSGI服务器的单独协议,用于定义传输信息的类型

uWSGI    是一个web服务器,实现了WSGI协议,uwsgi协议。a

nginx    web服务器,更加安全,更好的处理处理静态资源,缓存功能,负载均衡,因此nginx的强劲性能,配合uWSGI服务器会更加安全,性能有保障。

django 高级的python web框架,用于快速开发,解决web开发的大部分麻烦,程序员可以更专注业务逻辑,无须重新造轮子

品种植花朵费达成,在安排以前须要再配备文件中校 ALLOWED_HOSTS配置安装为:当前服务器IP或*,如:

uwsgi

pip install uwsgi

编写制定测试:

# test.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]

启航空衡量试:
uwsgi --http :8001 --wsgi-file test.py

报错:uwsgi: command not found,看来大家须求把python3/bin参预到path。
vim /etc/profile,在文书最尾巴部分找到PATH,增添:

:/usr/local/python3/bin

使配置生效:source /etc/profile

访问 http://ip:8001
,就可以见到Hello World 。

安装python3.6

一、配置pyenv下载源为本地目录(可选操作,不做的话下载速度会非常慢)

mkdir /root/python/ && cd /root/python/

# 设置变量
export PYTHON_BUILD_CACHE_PATH=/root/python

# 设置变量
export PYTHON_BUILD_MIRROR_URL=/root/python

# 查看变量设置
env | grep PYTHON_BUILD_MIRROR_URL

wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz

2、安装python3.6.1,pyenv install 3.6.1
报错,E宝马X5ROBMWX五: The Python ssl extension was not compiled. Missing the
OpenSSL lib? 须要设置正视包:

yum install readline readline-devel readline-static -y
yum install openssl openssl-devel openssl-static -y
yum install sqlite-devel -y
yum install bzip2-devel bzip2-libs -y

3、改动全局版本
pyenv global 3.6.1python -V

附:退换回原版本
pyenv global systempython -V

四、刷新数据库
python rehash

逻辑图

澳门葡京备用网址 1

web服务器

传统的c/s架构,请求的过程是
客户端 > 服务器 
服务器 > 客户端
服务器就是:1.接收请求 2.处理请求 3.返回响应

web框架层

HTTP的动态数据交给web框架,例如django遵循MTV模式处理请求。
HTTp协议使用url定位资源,urls.py将路由请求交给views视图处理,然后返回一个结果,完成一次请求。
web框架使用者只需要处理业务的逻辑即可。

如若将二遍通讯转化为“对话”的长河

Nginx:hello wsgi,我刚接受1个请求,你希图下然后让django来管理吧

WSGI:好的nginx,小编立即安装意况变量,然后把请求提交django

Django:多谢WSGI,笔者管理完请求立即给您响应结果

WSGI:好的,笔者在等着

Django:解决啦,麻烦wsgi吧响应结果传递给nginx

WSGI:太棒了,nginx,响应结果请收好,已经依据须要传递给你了

nginx:好滴。笔者把响应交给用户。同盟兴奋

ALLOWED_HOSTS = ["*",]

澳门葡京备用网址 ,nginx和mysql

参考《在CentOS七上安插PHP运维条件》,安装好了nginx和mysql。

花色安顿

Django Nginx+uwsgi 安装配置

种类布局,Django布署到线上。在目前的章节中大家选拔 python manage.py
runserver
 来运作服务器。那只适用测试情况中利用。

标准宣布的劳务,供给叁个得以安静而不息的服务器。

演示源码:猛击下载

品类配置

代码图谋

壹、在/home/web目录中,实施命令克隆项目
git clone https://github.com/voidking/djsite.git

2、安装django
pip install django==1.11.7

3、安装pymysql
pip install pymysql

基础开拓条件陈设

yum groupinstall "Development tools"
yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel

下一场将源码上传至服务器钦点目录,如:/data/
,然后实施命令来运转:

代码计划

1、克隆项目到服务器
git clone https://github.com/voidking/djsite.git

2、安装django
pip install django

3、安装pymysql
pip install pymysql

数据库盘算

一、创立数据库

# mysql -uroot -p
mysql> create database `djsite` default character set utf8 collate utf8_general_ci; 

二、修改mysql的binlog格式为混合情势:

mysql> set global binlog_format=mixed;
mysql> exit;

叁、修改djsite/djsite/settings.py中的数据库配置
vim djsite/djsite/settings.py

四、创造表结构

python manage.py makemigrations
python manage.py migrate

提早设置好python叁条件

https://www.cnblogs.com/pyyu/p/7402145.html

注: 上传命令: scp
/Users/wupeiqi/PycharmProjects/oldboy-一.zip
root@19二.16八.十.3三:/data/

数据库盘算

一、创立数据库

# mysql -uroot -p
mysql> create database `djsite` default character set utf8 collate utf8_general_ci; 
mysql> exit;

二、修改djsite/djsite/settings.py中的数据库配置
vim djsite/djsite/settings.py

叁、创造表结构

python manage.py makemigrations
python manage.py migrate

报错:

django.db.utils.InternalError: (1665, 'Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED.')

修改mysql的binlog格式为混合形式:

# mysql -uroot -p
mysql> set global binlog_format=mixed;

删除数据库djsite中的全部表,然后再一次实行:

python manage.py migrate

初步项目

一、运行命令
python manage.py runserver

二、服务器测试访问
curl localhost:8000/blog/index

三、本地质度量试访问
使用浏览器查看
http://ip:8000/blog/index
,不或然访问。
起初命令改为:python manage.py runserver 0.0.0.0:8000,此时就能够在浏览器看到安插好的种类。

只要照旧不可能访问,尝试先关闭防火墙:systemctl stop firewalld

virtualenv

请确保你的虚拟环境正常工作
https://www.cnblogs.com/pyyu/p/9015317.html

解压,进入目录并实行以下命令:

起初项目

nginx配置

1、首先,在万网络配置域名解析,增添A记录,解析到Ali云服务器IP。即使解析好的域名叫django.voidking.com。

2、在nginx的vhost中,添加django.voidking.com.conf,内容为:

server {
    listen 80;
    server_name django.voidking.com;
    charset utf-8;
    location /{
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
        client_max_body_size       1024m;
        client_body_buffer_size    128k;
        client_body_temp_path      data/client_body_temp;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
        proxy_temp_path            data/proxy_temp;

        proxy_pass http://127.0.0.1:8000;
    }
}

3、重启nginx,./nginx -s reload

4、测试访问
服务器:curl django.voidking.com/blog/index
本地浏览器:http://django.voidking.com/blog/index

迄今停止,django项目曾经布署成功,没有用到uwsgi。借使给django加多守护进度,那么大家的配置就如完美了。那么,uwsgi又能干什么吗,大家继续商讨。

安装django1.11

pip3 install django==1.11
#创建django项目mysite
django-admin startproject mysite
#创建app01
python3 manage.py startapp app01

mysite/settings.py

#settings.py设置
ALLOWED_HOSTS = ['*']
install app01

mysite/urls.py

from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^hello_django/', views.hello),
]

app01/views.py

from django.shortcuts import render,HttpResponse

# Create your views here.
def hello(request):
    print('request is :',request)
    return HttpResponse('django is ok ')
python3 mange.py runserver 0.0.0.0:8000 

数据库难点

cd djsite
python manage.py runserver

报错:

File "/usr/local/python3/lib/python3.6/site-packages/django/db/backends/mysql/base.py", line 36, in <module>
    raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11.None

化解办法:

vim /usr/local/python3/lib/python3.6/site-packages/django/db/backends/mysql/base.py

进入vim命令方式,输入/version,按N查找下二个,找到:

if version < (1, 3, 3):
    raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)

批注掉它,难题化解。

uwsgi

安装uWSGI

进入虚拟环境venv,安装uwsgi
(venv) [root@slave 192.168.11.64 /opt]$pip3 install uwsgi
检查uwsgi版本
(venv) [root@slave 192.168.11.64 /opt]$uwsgi --version
2.0.17.1
#检查uwsgi python版本
uwsgi --python-version

运维简单的uWSGI

#启动一个python
uwsgi --http :8000 --wsgi-file test.py
  • http :8000: 使用http协议,端口8000
  • wsgi-file test.py: 加载钦赐的文本,test.py

#test.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"] # python3

uWsgi热加载python程序

在启动命令后面加上参数
uwsgi --http :8088 --module mysite.wsgi --py-autoreload=1 
#发布命令
command= /home/venv/bin/uwsgi --uwsgi 0.0.0.0:8000 --chdir /opt/mysite --home=/home/venv --module mysite.wsgi

#此时修改django代码,uWSGI会自动加载django程序,页面生效

运行django程序

#mysite/wsgi.py  确保找到这个文件
uwsgi --http :8000 --module mysite.wsgi
  • module mysite.wsgi: 加载钦点的wsgi模块

uwsgi配置文件

澳门葡京备用网址 2澳门葡京备用网址 3

uwsgi支持ini、xml等多种配置方式,本文以 ini 为例, 在/etc/目录下新建uwsgi_nginx.ini,添加如下配置:

# mysite_uwsgi.ini file
[uwsgi]

# Django-related settings
# the base directory (full path)
chdir           = /opt/mysite
# Django's wsgi file
module          = mysite.wsgi
# the virtualenv (full path)
home            = /opt/venv
# process-related settings
# master
master          = true
# maximum number of worker processes
processes       = 1
# the socket (use the full path to be safe
socket          = 0.0.0.0:8000
# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true

uwsgi.ini

 澳门葡京备用网址 4

url问题

cd djsite
python manage.py runserver

再也报错:

File "/root/djsite/djsite/urls.py", line 21, in <module>
    url(r'^blog/', include('blog.urls', namespace='blog')),
  File "/usr/local/python3/lib/python3.6/site-packages/django/urls/conf.py", line 39, in include
    'Specifying a namespace in include() without providing an app_name '
django.core.exceptions.ImproperlyConfigured: Specifying a namespace in include() without providing an app_name is not supported. Set the app_name attribute in the included module, or pass a 2-tuple containing the list of patterns and app_name instead.

化解办法:

vim /usr/local/python3/lib/python3.6/site-packages/django/urls/conf.py

找到:

if namespace and not app_name:
    raise ImproperlyConfigured(
        'Specifying a namespace in include() without providing an app_name '
        'is not supported. Set the app_name attribute in the included '
        'module, or pass a 2-tuple containing the list of patterns and '
        'app_name instead.',
    )

表明掉它,难点消除。

安装uwsgi

pip install uwsgi

编辑测试:

# test.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]

开始测试:
uwsgi --http :8001 --wsgi-file test.py

访问 http://ip:8001
,就能够看出Hello World 。

点名布置文件运维命令

uwsgi --ini  /etc/uwsgi_nginx.ini

翻开效果

cd djsite
python manage.py runserver

启航成功,在服务器上测试访问:
curl localhost:8000/blog/index

动用浏览器查看
http://ip:8000/blog/index
,却不可能访问。那是因为在settings.py中,ALLOWED_HOSTS的安顿为:

ALLOWED_HOSTS = []

官方文书档案说:

When DEBUG is True and ALLOWED_HOSTS is empty, the host is validated
against [‘localhost’, ‘127.0.0.1’, ‘[::1]’].

修改ALLOWED_HOSTS的配置为:

ALLOWED_HOSTS = ['*']

然后运营命令改为:python manage.py runserver 0.0.0.0:8000,此时就能够在浏览器看到安插好的项目。

只要照旧无法访问,尝试先关闭防火墙:systemctl stop firewalld

一般运营

1、编写wsgi.py文件
编写django_wsgi.py文件,将其位于与公事manage.py同二个索引下。

#!/usr/bin/env python
# coding: utf-8

import os,django
from django.core.handlers.wsgi import WSGIHandler

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djsite.settings")
django.setup()
application = WSGIHandler()

二、运维项目
uwsgi --http :8000 --chdir /home/web/djsite/ --module django_wsgi

叁、查看运转结果
lsof -i :8000ps aux | grep uwsgi

四、测试访问
http://ip:8000/blog/index
那会儿,页面是未曾样式的,也便是说静态财富加载战败。

5、配置静态财富
uwsgi --http :8000 --chdir /home/web/djsite/ --module django_wsgi --static-map=/static=static
那儿,页面样式就像是常了。

配置nginx结合uWSGI

配置nginx.conf

worker_processes  1;
error_log  logs/error.log;
pid        logs/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  logs/access.log  main;
    sendfile        on;
    keepalive_timeout  65;
   #nginx反向代理uwsgi
    server {
        listen       80;
        server_name  192.168.11.64;
        location / {
         include  /opt/nginx1-12/conf/uwsgi_params;
         uwsgi_pass 0.0.0.0:8000;
            root   html;
            index  index.html index.htm;
        }
      #nginx处理静态页面资源
      location /static{
        alias /opt/nginx1-12/static;   
         }
     #nginx处理媒体资源
     location /media{
        alias /opt/nginx1-12/media;   

         }
        error_page   500 502 503 504  /50x.html;

        location = /50x.html {
            root   html;
        }
    }
}

布署完运维nginx

 

二、uwsgi

Django框架运维注重wsgi(本质提供socket服务端),众多模块完结了wsgi标准,而django框架中暗中同意使用wsigiref模块来兑现,他由于性格很低,所以用于地方开荒和测试,而线上配置时必要选用uwsgi来顶替。

一、在服务器上安装uwsgi

pip3 install uwsgi

二、单文件使用uwsgi

在服务器上编写制定1个Python文件:

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

在服务器上推行命令运维Web服务器:

uwsgi --http :9001 --wsgi-file app.py
# 或
uwsgi --http :9002 --wsgi-file foobar.py --master --processes 4

访问查看就可以:

澳门葡京备用网址 5

叁、 django程序使用uwsgi

将开辟好的django程序拷贝到服务器目录【同示例壹】,即:/data/oldboy
,施行命令运维:

uwsgi --http :9005 --chdir /data/oldboy/ --wsgi-file oldboy/wsgi.py --master --processes 4

 

1. 创建配置文件 oldboy.ini

[uwsgi]
http = 0.0.0.0:9005
chdir = /data/oldboy/
wsgi-file = oldboy/wsgi.py
processes = 4
static-map = /static=/data/oldboy/allstatic

2. 根据配置文件启动uwsgi

uwsigi --ini  oldboy.ini

配置文件的形式启动uwsgi

PS:
如若有虚拟情况能够加多上虚拟景况路线配置: virtualenv ``= /env````/oldboy``_venv

那会儿作客时,会现出找不到静态文件的失实。

想要uwsgi管理静态文件,必要先将django的静态文件搜聚到制定目录,然后再设置对应提到。

  • 征集django静态文件

    • 在django的配置文件中增加:STATIC_ROOT =
      os.path.join(BASE_DIR,”allstatic”)
    • 实施 python三 manage.py collectstatic
      命令,至此django项目具备有关静态文件都会采集到制定目录。
  • 设置uwsgi静态文件对应涉及

    • uwsgi –http :9005 –chdir /data/oldboy/ –wsgi-file
      oldboy/wsgi.py –master –processes 4 –static-map
      /static=/data/oldboy/allstatic

访问地址,就能够知到你的女对象们了….


nginx配置

1、首先,在万网络配置域名解析,增多A记录,解析到Ali云服务器IP。要是解析好的域名称为django.voidking.com。

2、在nginx的vhost中,添加django.voidking.com.conf,内容为:

server {
    listen 80;
    server_name django.voidking.com;
    charset utf-8;
    location /{
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
        client_max_body_size       1024m;
        client_body_buffer_size    128k;
        client_body_temp_path      data/client_body_temp;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
        proxy_temp_path            data/proxy_temp;

        proxy_pass http://127.0.0.1:8000;
    }
}

3、重启nginx,./nginx -s reload

肆、测试访问
服务器:curl django.voidking.com/blog/index
本地浏览器:http://django.voidking.com/blog/index

由来,django项目曾经安插成功,未有用到uwsgi。假设给django增加守护进度,那么大家的安排就类似完美了。那么,uwsgi又能干什么啊,大家继续研商。

高等运行

一、新建uwsgi.ini,与manage.py在同一流目录。

[uwsgi]
http = :8000
chdir = /home/web/djsite/
wsgi-file = django_wsgi.py
static-map = /static=static

2、启动uwsgi
uwsgi uwsgi.ini

三、测试访问
http://ip:8000/blog/index

supervisor

supervisor 是依据 python
的职务管理工具,用来机关运转各类后台职责,当然你也能直接行使 nohup
命令使职分自动后台运维,但即使要重启职分,每趟都要好手动 kill
掉职分进程,这样很麻烦,而且一旦程序不当变成进程退出的话,系统也不能自行重载职责。

此间邓超先生要布署基于virtualenv的supervisor

出于supervisor在python3下不恐怕选用,因而只能用python2去下载!!!!!!

#注意此时已经退出虚拟环境了!!!!!
yum install python-setuptools
easy_install supervisor

透过命令生成supervisor的配支文件

echo_supervisord_conf > /etc/supervisord.conf

然后再/etc/supervisord.conf末尾增添上如下代码!!!!!!

[program:my]
#command=/opt/venv/bin/uwsgi --ini  /etc/uwsgi_nginx.ini  #这里是结合virtualenv的命令 和supervisor的精髓!!!!
command= /home/venv/bin/uwsgi --uwsgi 0.0.0.0:8000 --chdir /opt/mysite --home=/home/venv --module mysite.wsgi
#--home指的是虚拟环境目录  --module找到 mysite/wsgi.py

directory=/opt/mysite
startsecs=0
stopwaitsecs=0
autostart=true
autorestart=true

末了运维supervisor,实现uWSGI运营django,nginx反向代理

supervisord -c /etc/supervisord.conf #启动supervisor
supervisorctl -c /etxc/supervisord.conf restart my  #重启my项目
supervisorctl -c /etc/supervisord.conf [start|stop|restart] [program-name|all]

 重新加载supervisor

一、添加好配置文件后

二、更新新的配置到supervisord    

supervisorctl update
三、重新启动配置中的所有程序

supervisorctl reload
四、启动某个进程(program_name=你配置中写的程序名称)

supervisorctl start program_name
五、查看正在守候的进程

supervisorctl
六、停止某一进程 (program_name=你配置中写的程序名称)

pervisorctl stop program_name
七、重启某一进程 (program_name=你配置中写的程序名称)

supervisorctl restart program_name
八、停止全部进程

supervisorctl stop all
注意:显示用stop停止掉的进程,用reload或者update都不会自动重启。

 

三、nginx

运用Nginx做反向代理、负载均衡以及管理静态文件。

1、安装Nginx

yum install nginx

2、配置nginx

澳门葡京备用网址 6澳门葡京备用网址 7

user root;
worker_processes 4;

error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
    worker_connections  1024;
}


http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    upstream django {
        server 127.0.0.1:8001; 
        # server 192.1.123.1; 
    }
    server {
        listen      80;

        charset     utf-8;

        # max upload size
        client_max_body_size 75M;

        location /static {
            alias  /data/oldboy/allstatic; 
        }

        location / {
            uwsgi_pass  django;
            include     uwsgi_params;
        }
    }
}

示范配置文件/etc/nginx/nginx.conf

担保nginx配置文件目录下有uwsgi_params文件(默认)

3、配置uwsgi

为了确定保障让具有请求均通过80端口来访问网址,将uwsgi的布置文件修改为:

[uwsgi]
socket = 127.0.0.1:9005
chdir = /data/oldboy/
wsgi-file = oldboy/wsgi.py
processes = 4
logto = /tmp/oldboy.log

4、启动uwsgi和nginx

uwsgi --ini /data/oldboy/oldboy.ini &

/etc/init.d/nginx start

uwsgi

supervisor

  django的静态文件与nginx配置

mysite/settings.py

STATIC_ROOT='/opt/nginx1-12/static'
STATIC_URL = '/static/'
STATICFILES_DIRS=[
    os.path.join(BASE_DIR,"static"),
]

上述的参数STATIC_ROOT用在哪?

由此python三 manage.py collectstatic
搜集全体你利用的静态文件保留到STATIC_ROOT!

STATIC_ROOT 文件夹 是用来将所有STATICFILES_DIRS中所有文件夹中的文件,以及各app中static中的文件都复制过来
# 把这些文件放到一起是为了用nginx等部署的时候更方便

 

 

参照文书档案:

 uwsgi热加载:

 

四、supervisor

supervisor是一个对经过管理的软件,能够帮忙大家运行uwsgi并维护(uwsgi进度关闭时,自动将其运维起来)。

1、安装

yum install supervisor

2、配置 vim
/etc/supervisor.conf

澳门葡京备用网址 8澳门葡京备用网址 9

[supervisord]
http_port=/var/tmp/supervisor.sock ; (default is to run a UNIX domain socket server)
;http_port=127.0.0.1:9001  ; (alternately, ip_address:port specifies AF_INET)
;sockchmod=0700              ; AF_UNIX socketmode (AF_INET ignore, default 0700)
;sockchown=nobody.nogroup     ; AF_UNIX socket uid.gid owner (AF_INET ignores)
;umask=022                   ; (process file creation umask;default 022)
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB       ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10          ; (num of main logfile rotation backups;default 10)
loglevel=info               ; (logging level;default info; others: debug,warn)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false              ; (start in foreground if true;default false)
minfds=1024                 ; (min. avail startup file descriptors;default 1024)
minprocs=200                ; (min. avail process descriptors;default 200)

;nocleanup=true              ; (don't clean up tempfiles at start;default false)
;http_username=user          ; (default is no username (open system))
;http_password=123           ; (default is no password (open system))
;childlogdir=/tmp            ; ('AUTO' child log dir, default $TEMP)
;user=chrism                 ; (default is current user, required if root)
;directory=/tmp              ; (default is not to cd during start)
;environment=KEY=value       ; (key value pairs to add to environment)

[supervisorctl]
serverurl=unix:///var/tmp/supervisor.sock ; use a unix:// URL  for a unix socket
;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
;username=chris              ; should be same as http_username if set
;password=123                ; should be same as http_password if set
;prompt=mysupervisor         ; cmd line prompt (default "supervisor")

; The below sample program section shows all possible program subsection values,
; create one or more 'real' program: sections to be able to control them under
; supervisor.

;[program:theprogramname]
;command=/bin/cat            ; the program (relative uses PATH, can take args)
;priority=999                ; the relative start priority (default 999)
;autostart=true              ; start at supervisord start (default: true)
;autorestart=true            ; retstart at unexpected quit (default: true)
;startsecs=10                ; number of secs prog must stay running (def. 10)
;startretries=3              ; max # of serial start failures (default 3)
;exitcodes=0,2               ; 'expected' exit codes for process (default 0,2)
;stopsignal=QUIT             ; signal used to kill process (default TERM)
;stopwaitsecs=10             ; max num secs to wait before SIGKILL (default 10)
;user=chrism                 ; setuid to this UNIX account to run the program
;log_stdout=true             ; if true, log program stdout (default true)
;log_stderr=true             ; if true, log program stderr (def false)
;logfile=/var/log/cat.log    ; child log path, use NONE for none; default AUTO
;logfile_maxbytes=1MB        ; max # logfile bytes b4 rotation (default 50MB)
;logfile_backups=10          ; # of logfile backups (default 10)



[program:oldboy]
command=/usr/local/bin/uwsgi /data/oldboy/oldboy.ini ;命令
priority=999                ; 优先级(越小越优先)
autostart=true              ; supervisord启动时,该程序也启动
autorestart=true            ; 异常退出时,自动启动
startsecs=10                ; 启动后持续10s后未发生异常,才表示启动成功
startretries=3              ; 异常后,自动重启次数
exitcodes=0,2               ; exit异常抛出的是0、2时才认为是异常
stopsignal=QUIT             ; 杀进程的信号
stopwaitsecs=10             ; 向进程发出stopsignal后等待OS向supervisord返回SIGCHILD 的时间。若超时则supervisord将使用SIGKILL杀进程 
user=chrism                 ; 设置启动该程序的用户
log_stdout=true             ; 如果为True,则记录程序日志
log_stderr=false            ; 如果为True,则记录程序错误日志
logfile=/var/log/cat.log    ; 程序日志路径
logfile_maxbytes=1MB        ; 日志文件最大大小
logfile_backups=10          ; 日志文件最大数量

配备详细

3、启动

supervisord /etc/supervisor.conf
或
/etc/init.d/supervisor start

 

一般运维

1、编写wsgi.py文件
编写django_wsgi.py文件,将其放在与公事manage.py同叁个索引下。

#!/usr/bin/env python
# coding: utf-8

import os,django
from django.core.handlers.wsgi import WSGIHandler

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djsite.settings")
django.setup()
application = WSGIHandler()

二、运营项目
uwsgi --http :8000 --chdir ~/djsite/ --module django_wsgi

三、查看运转结果
lsof -i :8000ps aux | grep uwsgi

4、测试访问
http://ip:8000/blog/index
那儿,页面是未曾样式的,相当于说静态财富加载战败。

伍、配置静态财富
uwsgi --http :8000 --chdir ~/djsite/ --module django_wsgi --static-map=/static=static
此刻,页面样式就平常了。

配置supervisor

1、开机运转
systemctl enable supervisord

2、生成配置文件

mkdir -p /etc/supervisor/
echo_supervisord_conf > /etc/supervisord.conf

三、修改配置文件
vim /etc/supervisord.conf,添加:

[include]
files = /etc/supervisor/*.conf

4、运行
supervisord -c /etc/supervisord.conf

高档运行

一、新建uwsgi.ini,与manage.py在同超级目录。

[uwsgi]
http = :8000
chdir = /root/djsite/
wsgi-file = django_wsgi.py
static-map = '/static=static'

2、启动uwsgi
uwsgi uwsgi.ini

3、测试访问
http://ip:8000/blog/index

守护uwsgi

1、在/etc/supervisor中新建djsite.conf文件:

[program:djsite]
command=/root/.pyenv/versions/3.6.1/bin/uwsgi --http :8000 --chdir /home/web/djsite/ --module django_wsgi --static-map=/static=static
directory=/home/web/djsite/
startsecs=0
stopwaitsecs=0
autostart=true
autorestart=true

2、重启supervisor

ps aux | grep supervisord
systemctl stop supervisord
systemctl start supervisord

附:重启djsite命令

supervisorctl -c /etc/supervisord.conf restart djsite

三、测试访问
http://ip:8000/blog/index
页面彰显符合规律,至此守护进度配置成功。

四、djsite.conf能够轻松修改为:

[program:djsite]
command=/root/.pyenv/versions/3.6.1/bin/uwsgi --ini uwsgi.ini
directory=/home/web/djsite/
startsecs=0
stopwaitsecs=0
autostart=true
autorestart=true

supervisor

闭馆shell后,uwsgi服务就异常快关闭了。为了让它后台运行,须求让它造成守护进程。

静态能源难题(可忽略)

假设,uwsgi.ini为:

[uwsgi]
http = :8000
chdir = /home/web/djsite/
wsgi-file = django_wsgi.py

静态财富就无法访问了。在不增加static-map的情状下,必要修改三个文本:
(1)修改djsite/djsite/settings.py文件,添加:

STATIC_ROOT = '/home/web/djsite/static/'

(2)修改djsite/djsite/settings.py文件为:

from django.conf.urls import url,include
from django.contrib import admin
from django.conf.urls.static import static
from django.conf import settings

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^blog/', include('blog.urls', namespace='blog')),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

安装supervisor

pip install supervisor

报错,因为supervisor不支持python3:
Supervisor requires Python 2.4 or later but does not work on any version
of Python 3. You are using version 3.6.1 (default, Dec 6 2017,
12:03:59)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]. Please install using a
supported version.
Command “python setup.py egg_info” failed with error code 1 in
/tmp/pip-build-y9wv4fmm/supervisor/

admin静态能源难题

如果以python manage.py runserver运行django,那么静态能源未有毛病。

若是以uwsgi运营django,静态能源看起来没不寻常,不过,假诺访问
http://ip:8000/admin
,就能够发觉这些页面包车型大巴静态能源不可能得到。

一个Django应用,一般有两类静态文件。一是利用内的静态文件,二是Django自带的静态文件。应用内的静态文件在djsite/static目录下。其余,在INSTALLED_应用程式S中布局了django.contrib.admin,
则还会有其它一组静态文件,在Django安装地点里。

诸如,贰个root在Python 3.六本子安装的Django,admin的静态文件在:
/usr/local/lib/python三.6/site-packages/django/contrib/admin/static/admin/。

最终,在STATIC_U本田CR-VL里,会有两类静态文件, /static/*
/static/admin/*

打探原理,原因就很分明了。python manage.py runserver驾驭静态文件的职位,而uWSGI不掌握静态文件在怎么地点。

消除办法如下:
(1)修改djsite/djsite/settings.py文件:

SITE_ROOT = os.path.dirname(os.path.abspath(__file__))
SITE_ROOT = os.path.abspath(os.path.join(SITE_ROOT, '../'))
STATIC_ROOT = os.path.join(SITE_ROOT, 'collectedstatic')

(2)收罗全体静态文件到collectedstatic目录
python manage.py collectstatic

(3)修改uwsgi.ini配置

[uwsgi]
http = :8000
chdir = /home/web/djsite/
wsgi-file = django_wsgi.py
static-map = /static=collectedstatic

安装pyenv

为了利用supervisor,我们要求python贰.七的条件。而多版本python的管制,推荐应用pyenv。

1、安装pyenv套装
curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
内容除了含有 pyenv 以外,还隐含如下插件:

  • pyenv-doctor
  • pyenv-installer
  • pyenv-update
  • pyenv-virtualenv
  • pyenv-which-ext

二、路线增多
vim ~/.bash_profile,添加:

export PATH="/root/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

叁、使配置马上生效
source ~/.bash_profile

四、查看安装情况
pyenv -v

5、常用命令

  • 翻开可安装的python版本列表:pyenv install -l
  • 安装钦点版本的python:pyenv install 2.7.3
  • 翻开已安装的python:pyenv versions
  • 查阅当前设为私下认可的python版本:pyenv version

nginx+uwsgi

如上,大家的djsite项目已经因此uwsgi格局运营起来,并且能够保持后台运维。nginx配置不转移的状态下,我们能够健康访问
http://django.voidking.com/blog/index
。此时,nginx作为反向代理,和uwsgi间通过http交互。

接下去,就安排下nginx和uwsgi通过socket结合的办法。原理:用户发送http请求到nginx,nginx通过socket把请求提交uwsgi,uwsgi得到django的管理结果,通过socket返还给nginx,nginx通过http重返结果给用户。

一、因为nginx和uwsgi通过socket方式互相,大家供给修改uwsgi.ini的配备为:

[uwsgi]
socket = :8000
chdir = /home/web/djsite/
wsgi-file = django_wsgi.py
static-map = /static=collectedstatic
master = true
processes = 2
enable-threads = true
daemonize = /home/web/djsite/uwsgi.log

2、重启supervisor
systemctl stop supervisord
systemctl start supervisord

3、修改nginx配置djsite.voidking.com.conf:

server {
    listen      80;
    server_name djsite.voidking.com;
    charset     utf-8;

    location / {
        uwsgi_pass     127.0.0.1:8000;
        include        uwsgi_params;
    }
}

5、重启nginx
./nginx -s reload

6、测试访问
此时,访问
http://ip:8000/blog/index
失败,访问
http://django.voidking.com/blog/index
符合规律。因为捌仟端口不再提供http服务,而是1个和nginx连接的socket。

安装python2.7环境

1、配置pyenv下载源为本地目录(可选操作,不做的话下载速度会极慢)

mkdir /root/python/ && cd /root/python/

# 设置变量
export PYTHON_BUILD_CACHE_PATH=/root/python

# 设置变量
export PYTHON_BUILD_MIRROR_URL=/root/python

# 查看变量设置
env | grep PYTHON_BUILD_MIRROR_URL

wget https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tar.xz

2、安装python2.7.13
pyenv install 2.7.13

三、改动全局版本
pyenv global 2.7.13python -V

附:改造回原版本
pyenv global systempython -V

四、刷新数据库
python rehash

加速静态能源

1、修改nginx配置djsite.voidking.com.conf:

server {
    listen      80;
    server_name djsite.voidking.com;
    charset     utf-8;

    location / {
        uwsgi_pass     127.0.0.1:8000;
        include        uwsgi_params;
    }

    location /static {
        alias /root/djsite/collectedstatic;
    }
}

2、修改nginx.conf

user root;

3、重启nginx
./nginx -s reload

安装虚拟遇到

一、新建supervisor虚拟环境
pyenv virtualenv 2.7.13 supervisor

二、激活虚拟情况
source /root/.pyenv/versions/2.7.13/envs/supervisor/bin/activate supervisor
或者source activate supervisor

3、安装supervisor
yum install supervisor
pip install supervisor

4、生成配置文件

mkdir -p /etc/supervisor/
echo_supervisord_conf > /etc/supervisord.conf

伍、修改配置文件
vim /etc/supervisord.conf,添加:

[include]
files = /etc/supervisor/*.conf

6、运行
/root/.pyenv/versions/2.7.13/envs/supervisor/bin/supervisord -c /etc/supervisord.conf

7、编辑supervisord.service
vi /usr/lib/systemd/system/supervisord.service,修改为:

[Unit]
Description=Process Monitoring and Control Daemon
After=rc-local.service nss-user-lookup.target

[Service]
Type=forking
ExecStart=/root/.pyenv/versions/2.7.13/envs/supervisor/bin/supervisord -c /etc/supervisord.conf  
ExecReload=/root/.pyenv/versions/2.7.13/envs/supervisor/bin/supervisorctl reload       
ExecStop=/root/.pyenv/versions/2.7.13/envs/supervisor/bin/supervisorctl shutdown      

[Install]
WantedBy=multi-user.target

8、重启supervisor

ps aux | grep supervisord
systemctl stop supervisord
systemctl start supervisord

九、开机运行
systemctl enable supervisord

小结

由来,django安顿实现,大家兑现了二种配备方法:

  • nginx + django(http方式)
  • nginx + uwsgi(http方式)
  • nginx + uwsgi(socket方式)

守护uwsgi

1、在/etc/supervisor中新建djsite.conf文件:

[program:djsite]
command=/usr/local/python3/bin/uwsgi --http :8000 --chdir /root/djsite/ --module django_wsgi --static-map=/static=static
directory=/root/djsite/
startsecs=0
stopwaitsecs=0
autostart=true
autorestart=true

2、重启supervisor

systemctl stop supervisord
systemctl start supervisord

附:重启djsite命令

supervisorctl -c /etc/supervisord.conf restart djsite

3、测试访问
http://ip:8000/blog/index
页面突显不荒谬,至此守护进度配置成功。

4、退出supervisor环境
source deactivate,守护进度并不曾面临震慑。

书签

动用uWSGI提供静态文件
(更新至一.玖)

不留余地uWSGI里的Django静态文件丢失

nginx+uwsgi

以上,大家的djsite项目曾经经过uwsgi格局运行起来,并且能够保险后台运转。nginx配置不转移的景况下,我们得以健康访问
http://django.voidking.com/blog/index
。此时,nginx作为反向代理,和uwsgi间透过http交互。

接下去,就安顿下nginx和uwsgi通过socket结合的格局。原理:用户发送http请求到nginx,nginx通过socket把请求提交uwsgi,uwsgi得到django的管理结果,通过socket返还给nginx,nginx通过http重回结果给用户。

一、因为nginx和uwsgi通过socket格局互相,我们需求修改uwsgi.ini的布局为:

[uwsgi]
socket = :8000
chdir = /root/djsite/
wsgi-file = django_wsgi.py
static-map = '/static=static'
master = true
processes = 2
enable-threads = true
# daemonize = /root/djsite/uwsgi.log

2、/etc/supervisor/djsite.conf,修改为

[program:djsite]command=/usr/local/python3/bin/uwsgi uwsgi.ini
directory=/root/djsite/
startsecs=0
stopwaitsecs=0
autostart=true
autorestart=true

3、重启supervisor
systemctl stop supervisord
systemctl start supervisord

4、修改nginx配置djsite.voidking.com.conf:

server {
    listen      80;
    server_name djsite.voidking.com;
    charset     utf-8;

    location / {
        uwsgi_pass     127.0.0.1:8000;
        include        uwsgi_params;
    }

    location /static {
        alias /root/djsite/static;
    }
}

5、重启nginx
./nginx -s reload

陆、测试访问
此时,访问
http://ip:8000/blog/index
失败,访问
http://django.voidking.com/blog/index
符合规律。因为八千端口不再提供http服务,而是3个和nginx连接的socket。

7、static
请问,此时的静态财富,是通过uwsgi获取的?如故通过nginx直接得到的?做八个测试就可以,修改uwsgi为:

[uwsgi]
socket = :8000
chdir = /root/djsite/
wsgi-file = django_wsgi.py
# static-map = '/static=static'
master = true
processes = 2
enable-threads = true
# daemonize = /root/djsite/uwsgi.log

此刻,uwsgi不再提供静态能源。重启supervisor,页面样式平常,可知,静态能源是由此nginx获取的。之所以得以拿走到,是因为我们事先在djsite/settings.py中布署了:

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static"),
)

小结

至此,django安排落成,我们落到实处了两种配备方法:

  • nginx + django(http方式)
  • nginx + uwsgi(http方式)
  • nginx + uwsgi(socket方式)

在此进程中,消除了一些意外的bug,学习了升高python的形式,学习了应用pyenv安装多版本python的方法(类似的还有anaconda),学习了给django大概uwsgi增添守护过程的法子,满载而归。

书签

Python
Web计划方式总计

Python网络框架——Web服务器

Django在生育意况中的计划

Django
部署(Nginx)

使用Supervisor管理SpiderKeeper和Scrapyd

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website