https://www.xdoujiang.com/blog/book评论留言
一、基础环境Django Web部署平台
1、角色、ip、版本、内核、软件
serverA 10.1.10.236 3.16.0-4-amd64 8.1 nginx uwsgi django python
python-2.7.9
nginx-1.6.2
uwsgi-2.0.11.2
django-1.8.6
2、安装基础包
1)安装基础包
apt-get -y install gcc make python-dev python-setuptools python curl tree
2)使用easy_install命令安装pip
easy_install pip
二、安装uwsgi并测试访问
1、安装uwsgi
pip install uwsgi
2、查看已安装模块
pip list
chardet (2.3.0)
defusedxml (0.4.1)
docutils (0.12)
Pillow (2.6.1)
pip (7.1.2)
Pygments (2.0.1)
python-apt (0.9.3.11)
python-debian (0.1.27)
python-debianbts (1.11)
reportbug (6.6.3)
roman (2.0.0)
setuptools (5.5.1)
six (1.8.0)
SOAPpy (0.12.22)
uWSGI (2.0.11.2)
wstools (0.4.3)
3、查看相关命令
root@10.1.10.236:~# ll /usr/local/bin
total 1340
-rwxr-xr-x 1 root staff 281 Nov 19 09:32 pip
-rwxr-xr-x 1 root staff 283 Nov 19 09:32 pip2
-rwxr-xr-x 1 root staff 287 Nov 19 09:32 pip2.7
-rwxr-xr-x 1 root staff 1357088 Nov 19 09:34 uwsgi
4、创建test.py
root@10.1.10.236:~# cat /root/test.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
#--------------------------------------------------
#Author:jimmygong
#Email:jimmygong@taomee.com
#FileName:test.py
#Function:
#Version:1.0
#Created:2015-11-19
#--------------------------------------------------
def application(env,start_response):
start_response('200 OK',[('Content_Type','text/html')])
return "uwsgi testing ok!"
5、启动服务
root@10.1.10.236:~# uwsgi --http :9999 --wsgi-file test.py
6、查看进程
root@10.1.10.236:~# ps -ef |grep uwsgi
root 2037 1833 0 10:01 pts/1 00:00:00 uwsgi --http :9999 --wsgi-file test.py
root 2038 2037 0 10:01 pts/1 00:00:00 uwsgi --http :9999 --wsgi-file test.py
root 2042 731 0 10:02 pts/0 00:00:00 grep --color=auto uwsgi
7、查看端口
root@10.1.10.236:~# netstat -tupnl |grep 9999
tcp 0 0 0.0.0.0:9999 0.0.0.0:* LISTEN 2037/uwsgi
8、访问
9、关闭服务
kill -9 2037
三、安装django并测试访问
1、安装django
pip install django
2、验证模块和查看版本
3、创建django项目所存放的目录
root@10.1.10.236:~# mkdir /opt/django -p
4、创建aaabbbcom项目
root@10.1.10.236:~# cd /opt/django/ && django-admin startproject aaabbbcom
5、查看下aaabbbcom项目目录结构
1)root@10.1.10.236:django# tree aaabbbcom/
aaabbbcom/
├── aaabbbcom
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
1 directory, 5 files
2)目录结构说明
__init__.py 目录结构 调用有关
settings.py 项目设置
urls.py 地址配置文件
wsgi.py 部署服务器文件
6、启动服务
cd aaabbbcom/ && nohup python manage.py runserver 0.0.0.0:8888 &
7、查看进程
ps -ef |grep python
root 2413 2412 0 15:14 pts/2 00:00:00 python manage.py runserver 0.0.0.0:8888
root 2416 2413 1 15:14 pts/2 00:00:04 /usr/bin/python manage.py runserver 0.0.0.0:8888
8、查看端口
netstat -tupnl |grep python
tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 2416/python
9、访问
10、关闭服务
kill -9 2416
11、创建aaabbbcom项目下的testapp应用
cd /opt/django/aaabbbcom && python manage.py startapp testapp
12、查看下testapp目录结构
root@10.1.10.236:aaabbbcom# tree testapp/
testapp/
├── admin.py
├── __init__.py
├── migrations
│ └── __init__.py
├── models.py
├── tests.py
└── views.py
1 directory, 6 files
13、备份下settings.py配置
cp /opt/django/aaabbbcom/aaabbbcom/settings.py /opt/django/aaabbbcom/aaabbbcom/settings.py.bak
14、修改settings.py配置
root@10.1.10.236:~# diff /opt/django/aaabbbcom/aaabbbcom/settings.py /opt/django/aaabbbcom/aaabbbcom/settings.py.bak
40d39
< 'testapp',
15、定义视图函数views.py
root@10.1.10.236:~# cat /opt/django/aaabbbcom/testapp/views.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
#--------------------------------------------------
#Author:jimmygong
#Email:jimmygong@taomee.com
#FileName:test.py
#Function:
#Version:1.0
#Created:2015-11-19
#--------------------------------------------------
from django.http import HttpResponse
def index(request):
return HttpResponse("welcome django web!")
16、定义视图函数相关的urls.py
root@10.1.10.236:~# cat /opt/django/aaabbbcom/aaabbbcom/urls.py
from django.conf.urls import patterns,include,url
from django.contrib import admin
admin.autodiscover()
urlpatterns=patterns('',
url(r'^$','testapp.views.index',name='home'),
url(r'^admin/',include(admin.site.urls)),
)
17、启动服务
cd /opt/django/aaabbbcom/ && nohup python manage.py runserver 0.0.0.0:8888 &
18、访问
19、关闭服务
四、配置django和uwsgi结合
1、启动服务
uwsgi --http :7777 --chdir /opt/django/aaabbbcom/ --module aaabbbcom.wsgi
2、查看端口
netstat -tupnl |grep uwsgi
tcp 0 0 127.0.0.1:42415 0.0.0.0:* LISTEN 2587/uwsgi
tcp 0 0 0.0.0.0:7777 0.0.0.0:* LISTEN 2587/uwsgi
3、查看进程
ps -ef |grep wsgi
root 2587 779 0 15:43 pts/1 00:00:00 uwsgi --http :7777 --chdir /opt/django/aaabbbcom/ --module aaabbbcom.wsgi
root 2588 2587 0 15:43 pts/1 00:00:00 uwsgi --http :7777 --chdir /opt/django/aaabbbcom/ --module aaabbbcom.wsgi
root 2604 740 0 15:47 pts/0 00:00:00 grep --color=auto wsgi
4、访问
5、关闭服务
kill -9 2587
五、配置nginx和uwsgi结合
1、安装nginx
apt-get -y install nginx
2、创建aaabbbcom站点
cat /etc/nginx/sites-enabled/aaabbbcom
server {
listen 10.1.10.236:80;
server_name 10.1.10.236;
access_log /opt/django/access.log;
error_log /opt/django/error.log;
location / {
include /etc/nginx/uwsgi_params;
uwsgi_pass 127.0.0.1:8630;
}
}
3、删除默认default节点
rm -f /etc/nginx/sites-enabled/default
4、创建django.ini配置文件
cat /opt/django/django.ini
[uwsgi]
vhost=true
socket=127.0.0.1:8630
chdir=/opt/django/aaabbbcom
module=aaabbbcom.wsgi
master=true
processes=2
threads=2
max-requests=6000
chmod-socket=664
vacuum=true
daemonize=/opt/django/django.log
5、启uwsgi服务
nohup /usr/local/bin/uwsgi --ini /opt/django/django.ini &
6、重启nginx服务
/etc/init.d/nginx restart
[ ok ] Restarting nginx (via systemctl): nginx.service.
7、查看端口
netstat -tupnl|egrep "uwsgi|nginx"
tcp 0 0 10.1.10.236:80 0.0.0.0:* LISTEN 3433/nginx -g daemo
tcp 0 0 127.0.0.1:8630 0.0.0.0:* LISTEN 3408/uwsgi
8、查看进程
ps -ef |egrep "uwsgi|nginx"
root 3408 740 0 16:12 pts/0 00:00:00 /usr/local/bin/uwsgi --ini /opt/django/django.ini
root 3411 3408 0 16:12 pts/0 00:00:00 /usr/local/bin/uwsgi --ini /opt/django/django.ini
root 3412 3408 0 16:12 pts/0 00:00:00 /usr/local/bin/uwsgi --ini /opt/django/django.ini
root 3433 1 0 16:13 ? 00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 3435 3433 0 16:13 ? 00:00:00 nginx: worker process
www-data 3436 3433 0 16:13 ? 00:00:00 nginx: worker process
www-data 3437 3433 0 16:13 ? 00:00:00 nginx: worker process
www-data 3438 3433 0 16:13 ? 00:00:00 nginx: worker process
root 3476 779 0 16:16 pts/1 00:00:00 grep -E uwsgi|nginx
9、访问
10、查看相关日志
1)cat /opt/django/access.log
10.1.10.131 - - [19/Nov/2015:15:44:27 +0800] "GET / HTTP/1.1" 200 50 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0"
2)cat /opt/django/django.log
*** Starting uWSGI 2.0.11.2 (64bit) on [Thu Nov 19 14:44:02 2015] ***
compiled with version: 4.9.2 on 19 November 2015 09:33:34
os: Linux-3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt11-1 (2015-05-24)
nodename: 10.1.10.236
machine: x86_64
clock source: unix
detected number of CPU cores: 1
current working directory: /root
detected binary path: /usr/local/bin/uwsgi
!!! no internal routing support, rebuild with pcre support !!!
uWSGI running as root, you can use --uid/--gid/--chroot options
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) ***
chdir() to /opt/django/aaabbbcom
your processes number limit is 850
your memory page size is 4096 bytes
detected max file descriptor number: 819200
VirtualHosting mode enabled.
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uwsgi socket 0 bound to TCP address 127.0.0.1:8630 fd 3
Python version: 2.7.9 (default, Mar 1 2015, 13:01:26) [GCC 4.9.2]
Python main interpreter initialized at 0xc65b20
python threads support enabled
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 249168 bytes (243 KB) for 4 cores
*** Operational MODE: preforking+threaded ***
WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0xc65b20 pid: 3258 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI master process (pid: 3258)
spawned uWSGI worker 1 (pid: 3261, cores: 2)
spawned uWSGI worker 2 (pid: 3262, cores: 2)
10.1.10.236 [pid: 3262|app: 0|req: 1/1] 10.1.10.131 () {42 vars in 686 bytes} [Thu Nov 19 06:47:06 2015] GET / => generated 19 bytes in 20 msecs (HTTP/1.1 200) 2 headers in 88 bytes (1 switches on core 0)
10.1.10.236 [pid: 3262|app: 0|req: 2/2] 10.1.10.131 () {40 vars in 631 bytes} [Thu Nov 19 07:44:27 2015] GET / => generated 19 bytes in 192 msecs (HTTP/1.1 200) 2 headers in 88 bytes (1 switches on core 1)
11、配置说明
socket:指定uwsgi的客户端将要连接的socket的路径
processes:开启的进程数量
workers:开启的进程数量,等同于processes(官网的说法是spawn the specified number of workers / processes)
chdir:指定运行目录(chdir to specified directory before apps loading)
wsgi-file:加载指定的WSGI文件(与Graham的mod_wsgi形式兼容)
stats:在指定的地址上,开启状态服务(enable the stats server on the specified address)
threads:开启线程操作模式。你必须指定每个工作进程的线程数
master:启动主进程
daemonize:使进程在后台运行,并将日志打到指定的日志文件或者udp服务器
pidfile:指定pid文件的位置,记录主进程的pid号
vacuum:当服务器退出的时候自动删除unix socket文件和pid文件
vhost:开启虚拟主机模式
module:加载指定的python WSGI模块(模块路径必须在PYTHONPATH里)
max-requests:为每个工作进程设置请求数的上限
limit-as:通过使用POSIX/UNIX的setrlimit()函数来限制每个uWSGI进程的虚拟内存使用数
chmod-socket:unix socket是个文件,所以会受到unix系统的权限限制。如果你的uwsgi客户端没有权限访问uWSGI socket,你可以用这个选项设置unix socket的权限
六、参考文章
https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/
https://docs.djangoproject.com/en/1.8/topics/http/urls/
https://docs.djangoproject.com/en/1.8/topics/settings/
http://uwsgi-docs.readthedocs.org/en/latest/WSGIquickstart.html
http://projects.unbit.it/uwsgi/wiki/Example