1.依赖:
汇总:yum -y install python-devel openssl-devel bzip2-devel zlib-devel expat-devel gdbm-devel ncurses-devel sqlite-devel gdbm-devel xz-devel tk-devel readline-devel gcc
yum -y groupinstall "Development tools"
2.将安装包发送给linux 解压 (注意版本,python2都可以如果是python3必须是3.5.2再高的话,和uwsgi版本不兼容.)
tar -zxvf Python-3.5.2.tgz
3.cd 到解压目录中,执行:"./configure --prefix=/usr/local/python3.5.2 --enable-optimizations"
其中"--enable-optimizations"会保证有10%左右的性能优化
4.安装完毕后,在解压目录下执行:"make"
5.在解压目录下:"make install"
6.环境变量:
vi /etc/profile 在最后一行后面添加:
export python_home=/usr/local/python3.5.2
export PATH=$PATH:$python_home/bin
保存后,执行:source /etc/profile
7.[root@zhj bin]# python3 -m venv py9
[root@zhj bin]# source py3/bin/acticate 激活虚拟环境
(py9) [root@zhj bin]# deactivate 退出虚拟环境
此步选做!!!
8.更改python3为系统默认版本
1>把 /usr/bin 下为python3添加链接即可
ln -s /usr/local/python3.5.2/bin/python3 /usr/bin/python
2>注意:在做1>时,要注意/usr/bin中已有python,所以要把之前的改名
而且在yum的文件:/usr/bin/yum中要修改:"#!/usr/bin/python:" 为 "#!/usr/bin/python2.6" 防止yum不能使用
9.更新pip
pip3 install --upgrade pip
10.mysql安装:
yum install mysql-server
11.安装依赖
yum install mysql-devel
12.安装mysql驱动
pip install mysqlclient
=======================================Part2:Django安装=============================================
13.安装django和uwsgi
13.1 pip install django
测试 django 是否正常,运行:
django-admin startproject demosite
cd demosite
python manage.py runserver 0.0.0.0:8002
在浏览器内输入:http://127.0.0.1:8002,检查django是否运行正常。
=======================================Part3:uWSGI安装============================================
14.WSGI服务器的选择很多,包括uWSGI和gunicorn。
它们都可以处理所有的请求,包括确实应该由python对象处理的,
也包括不该python对象处理的,比如静态的图像,css,js等文件。
所以理论上你可以把整个动态网站都用WSGI服务器承载起来,也就是整个应用完全跑在Application服务器上。
15.WSGI是一种Web服务器网关接口。
它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。
ops:就是为python-web应用的发布定制的规范,应用中能写什么,服务器能识别什么,都遵循统一的规范。
比如中间件机制,就在规范之内
ops:WSGI使得 Server 和 App 解耦 ,中间连接的是WSGI协议,即当Server收到请求后,将信息按照WSGI协议
交给App,App识别信息,得知该执行哪些行为,并将执行结果内容按照WSGI协议描述并发送给Server,
Server在去识别并响应
ops:除非你想写一个新的pyton-web框架,否则不用关心WSGI;真正需要关系的是,如何配置和部署app
16.uWSGI
uWSGI旨在为部署分布式集群的网络应用开发一套完整的解决方案。主要面向web及其标准服务。由于其可扩展性,能够被无限制的扩展用来支持更多平台和语言。uWSGI是一个web服务器,实现了WSGI协议,uwsgi协议,http协议等。
uWSGI的主要特点是:
超快的性能
低内存占用
多app管理
详尽的日志功能(可以用来分析app的性能和瓶颈)
高度可定制(内存大小限制,服务一定次数后重启等)
uWSGI服务器自己实现了基于uwsgi协议的server部分,我们只需要在uwsgi的配置文件中指定application的地址,
uWSGI就能直接和应用框架中的WSGI application通信。
17. 安装依赖:yum -y install python-devel (不用再安装,已经在第一步安装)
18. 安装uWSGI:(uWSGI是python的一个模块)
1>解压:tar -zxvf uwsgi-2.0.17.tar.gz
2>切到解压目录:make
3>ln -s /usr/local/uWSGI/uwsgi-2.0.17/uwsgi /usr/bin/uwsgi 链接便于执行
4>uwsgi --version # 查看 uwsgi 版本
5>测试 uwsgi 是否正常:
新建 test.py 文件,内容如下:
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html;charset=utf-8')])
return [bytes('你好啊!!','utf-8'),b'zhjzhj']
然后在终端运行:
uwsgi --http :8001 --wsgi-file test.py
在浏览器内输入:http://ip:8001,查看是否有"Hello World"输出,若没有输出,请检查你的安装过程。
19.部署django项目
*注意,项目中 debug=false,allow_hosts=['*' 或者 uwsgi服务器主机ip]
简单测试:uwsgi --http 192.168.x.x:8989 --wsgi-file /usr/local/fruit/fruit/wsgi.py --chdir /usr/local/fruit
但此时静态资源无法访问
20.uWSGI配置:
[uwsgi]
http = 192.168.x.x:9000 # 服务器访问地址
#the local unix socket file than commnuincate to Nginx
socket = 192.168.x.x:8001
# the base directory (full path)
chdir = /usr/local/django_projects/fruit #项目所在目录
# Django's wsgi file
wsgi-file = fruit/wsgi.py #基于项目目录的相对路径
# maximum number of worker processes
processes = 4
#thread numbers startched in each worker process
threads = 2
#monitor uwsgi status
stats = 192.168.x.x:9191
# clear environment on exit
vacuum = true
pidfile = /usr/local/django_projects/uwsgi9090-fruit.pid
#daemonize-run ,file-to-record-log
daemonize = /usr/local/django_projects/uwsgi9090-fruit.log
#static file url like "/static/...." will go to the dir for file
static-map =/static=/usr/local/django_projects/fruit/static9 #http://ip:port/static/...请求会进入该目录找资源
21.uWSGI操作:在此之前,建议先做静态资源处理(见步骤22)
启动uwsgi:uwsgi --ini uwsgi.ini
停止uwsgi:uwsgi --stop uwsgi9090-fruit.pid #uwsgi9090-fruit.pid是相对路径写法
重新加载配置:uwsgi --reload uwsgi9090-fruit.pid #uwsgi9090-fruit.pid是相对路径写法
22.静态文件访问不到处理:
1>*在settings中:
STATIC_ROOT = os.path.join(BASE_DIR,'static999') #运行 python manage.py collectstatic时会自动创建static
部署前先执行:
python manage.py collectstatic. 会将project下所有app的static目录内容汇总到BASE_DIR/static9下
有了如上操作,在project下就有了所有静态文件
*在uwsgi的ini中static-map =/static=/usr/local/django_projects/fruit/static999即可
*然后启动uwsgi即可
2>在template中使用的都是{%static 'xx/xx/logo02.png'} ==> /static/xx/xx/logo02.png
加之settings中的STATIC_URL = '/static/' 所以 /static/xx/xx/logo02.png==>查找静态资源xx/xx/logo02.png
而django会自动在app下的static目录中去查找静态资源,即 app_dir/xx/xx/logo02.png
最终定位静态资源
3>在uwsgi运作过程中过程类似,首先浏览器看到的静态资源路径为 /static/xx/xx/logo02
此时在uwsgi的ini配置中添加:static-map =/static=/usr/local/django_projects/fruit/static9
即请求url中以"/static"开头的请求会路由到/usr/local/django_projects/fruit/static9路径中查找文件
如:/static/a/b/c.png 会查找 /usr/local/django_projects/fruit/static9/a/b/c.png
4>即在django中:STATIC_URL = '/static/' 使请求 /static/xx/xx/logo02.png 到app下static目录中找资源
在uwsgi中:static-map=.... 使请求 /static/xx/xx/logo02.png 去/usr/local/django_projects/fruit/static9中找资源
补充:uwsgi负载监控
1>pip install uwsgitop 安装工具
=======================================Part4:nginx安装============================================
23.解压nginx1.11.tar
24.安装依赖:yum install gcc pcre-devel zlib-devel
25.在解压目录下:./configure
26.在解压目录下:make && make install 即可安装完毕,安装路径默认为/usr/local/nginx
27.为了方便执行:ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
28.nginx 开启
nginx -s stop 关闭
nginx -s reload 重启
29.访问:http://ip:80 即可访问到nginx首页
30.nginx的配置文件位置:/usr/local/nginx/conf/nginx.conf,在此处添加自己的配置信息
31.配置nginx:
upstream django99 {
server 127.0.0.1:8001; # uwsgi的配置中指定的
}
server {
# the port your site will be served on
listen 8000;
# the domain name it will serve for
server_name .example.com; # 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 /path/to/your/mysite/media; # your Django project's media files - amend as required
}
location /static {
alias /path/to/your/mysite/static; # your Django project's static files - amend as required
}
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass django;
include /path/to/your/mysite/uwsgi_params; # the uwsgi_params file you installed
}
}
*其中uwsgi_params文件可以在nginx的安装目录中找到,将其放到项目目录下
*至此,nginx+uwsgi+django 部署完毕 而且已经做了动静分离
http://ip:9000/xxxx 只经过uwsgi
http://ip/xxx 经过nginx
=======================================Part5:Ngins补充============================================
1、【alias】——别名配置,用于访问文件系统,在匹配到location配置的URL路径后,
指向【alias】配置的路径。如:
location /test/
{
alias/first/second/img/;
}
即:请求/test/1.jpg(省略了协议与域名),将会返回文件/first/second/img/1.jpg。
2、【root】——根路径配置,用于访问文件系统,在匹配到location配置的URL路径后,
指向【root】配置的路径,并把location配置路径附加到其后。如:
location /test/
{
root /first/second/img/;
}
即:请求/test/1.jpg(省略了协议与域名),将会返回文件/first/second/img/test/1.jpg,
相较于alias,使用root会把/test/附加到根目录之后。
3、【proxy_pass】——反向代理配置,用于代理请求,适用于前后端负载分离或多台机器、服务器负载分离的场景,在匹配到location配置的URL路径后,转发请求到【proxy_pass】配置的URL,是否会附加location配置路径与【proxy_pass】配置的路径后是否有"/"有关,有"/"则不附加,如:
location /test/
{
proxy_pass http://127.0.0.1:8080/;
}
即:请求/test/1.jpg(省略了协议与域名),将会被nginx转发请求到http://127.0.0.1:8080/1.jpg(未附加/test/路径)。
upstream tomcat-serversZHJ {
server 192.168.0.103:8989;
server 192.168.0.103:8990;
}
location / {
proxy_pass http://tomcat-serversZHJ; #多个主机,形成集群,并可以负载均衡
}