目录
前言
先概括下访问流程:
首先客户端发起请求,这里会有TCP的握手,三次握手结束之时,客户端会带上http数据给服务器(请求行,请求头,请求体),服务器会接收到http协议,Nginx会接收到数据,然后根据里面的配置进行判断是否需要转发,如果是static,直接拿资源返回,如果需要在转发继续socket连接后面的应用,这里就是uwsgi,该程序可以理解为DJango的运行环境,只要都遵循wsgi协议,都能和uwsgi和DJango一样连接起来,DJango处理并返回
DJango开发环境
Mac OS High sierra 10.13.4
mintoudeMacBook-Pro-2:~ mintou$ python3 -m django --version
2.1
mintoudeMacBook-Pro-2:~ mintou$ ipython3
Python 3.6.3 (v3.6.3:2c5fed86e0, Oct 3 2017, 00:32:08)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.3.1 -- An enhanced Interactive Python. Type '?' for help.
这里一个简单的DJango应用就不介绍了,详细的可以看这里
首先明白一点,阿里云服务买了之后(怎么买就不说了),Nginx是已经有了的,而且有自带的Python2.7,但是我们还是要装3x以上的Python来玩,毕竟新时代马上要来了,看看需要安装什么先。这里提到的几个名词画一张图介绍下
介绍完了一些安装和逻辑,开始操作、
上传以及服务器环境部分
首先开发的电脑上安装的我们都要在服务器上安装
pip3 freeze > plist.txt
- 通过ftp软件将开发好的项目上传到此服务器的某个目录
- 然后在服务器上执行
pip3 install -r plist.txt
就拿最简单的Demo为例,以下是目录
更改根目录下的setting.py
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
ALLOWED_HOSTS = ['*']
...
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
STATIC_ROOT='/var/www/upload/static/'
STATIC_ROOT在开发环境没用,生产环境用来指定收集静态文件到哪里,只有这个作用,上面两个是开发环境测试用的,Nginx里面的静态文件地址也配成STATIC_ROOT一样的
小结:
1.搭建一个DJango应用,修改配置文件到生产部署之前的配置
2.pip3 导出安装包语句
3.ftp推上去
以下是推上去的目录
[root@izj6cgebrvv84gtntwiyagz static]# cd /root/Desktop/uploadProject/upload/
[root@izj6cgebrvv84gtntwiyagz upload]# ls -a
. .. .DS_Store manage.py static templates upload userinfo uswgi.log uwsgi.ini uwsgi.pid
uwsgi部分
- python manage.py runserver:这是一款适合开发阶段使用的服务器,不适合运行在真实的生产环境中
- 在生产环境中使用WSGI
- WSGI:Web服务器网关接口,英文为Python Web Server Gateway Interface,缩写为WSGI,是Python应用程序或框架和Web服务器之间的一种接口,被广泛接受
- WSGI没有官方的实现, 因为WSGI更像一个协议,只要遵照这些协议,WSGI应用(Application)都可以在任何服务器(Server)上运行
- 命令django-admin startproject会生成一个简单的wsgi.py文件,确定了settings、application对象
- application对象:在Python模块中使用application对象与应用服务器交互
- settings模块:Django需要导入settings模块,这里是应用定义的地方
- 此处的服务器是一个软件,可以监听网卡端口、遵从网络层传输协议,收发http协议级别的数据
- uWSGI实现了WSGI的所有接口,是一个快速、自我修复、开发人员和系统管理员友好的服务器
- uWSGI代码完全用C编写
- 安装uWSGI
pip3 install uwsgi
cd到项目根目录,创建一个uwsgi.ini的文件
[uwsgi]
socket=外网ip:端口(使用nginx连接时,使用socket) 127.0.0.1:8000或者是阿里云私有ip地址
# http=外网ip:端口(直接做web服务器,使用http) 没有nginx的使用,一般不管他
chdir=项目根目录 (/root/Desktop/uploadProject/upload)
wsgi-file=项目中wsgi.py文件的目录,相对于项目根目录 (upload/wsgi.py)
processes=4
threads=2
master=True
pidfile=uwsgi.pid
daemonize=uswgi.log
- 启动:uwsgi --ini uwsgi.ini
- 停止:uwsgi --stop uwsgi.pid
- 重启:uwsgi --reload uwsgi.pid
- 如果重复开始,stop的时候会失败,可以执行如下强制杀死 sudo killall -9 uwsgi
小结:
- 在项目根目录创建uwsgi.ini文件并设置
- 执行命令开启uwsgi --ini uwsgi.ini让DJango项目接收传过来的http参数
- 修改了任何配置需要uwsgi --stop uwsgi.pid 如果失败可以查看pid并且修改uwsgi.pid,或者强制杀死在启动
nginx部分
- 使用nginx的作用
- 负载均衡:多台服务器轮流处理请求
- 反射代理:隐藏真实服务器
- 实现构架:客户端请求nginx,再由nginx请求uwsgi,运行django框架下的python代码
- nginx+uwsgi也可以用于其它框架的python web代码,不限于django
- 阿里云已经安装好了,不需要再安装
nginx目录
cd /usr/sbin/nginx 安装目录
vim /etc/nginx/nginx.conf 配置文件所在目录
- 查看版本:sudo sbin/nginx -v
- 启动:sudo sbin/nginx
- 停止:sudo sbin/nginx -s stop
- 重启:sudo sbin/nginx -s reload
那么nginx是uwsgi之前最先收到数据的,咱们打开nginx配置文件修改路由,指向uwsgi程序
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
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;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
以上不用我们管 下面一个个的server就是配置的
server {
listen ip地址:80 default_server;
#listen [::]:80 default_server;
server_name _;
# root /usr/share/nginx/html;
# Load configuration files for the default server block.
#include /etc/nginx/default.d/*.conf;
# 默认转发到 DJango
location / {
include uwsgi_params;
# 这里配置的和项目下面的uwsgi.ini里面socket一样才能接收
uwsgi_pass ip地址:8002;
}
# 在服务器配置的静态文件目录
location /static {
alias /var/www/upload/static/;
}
# 这个是例外,给我的iOS客户端配置的bundlejs/ActivityPage.js来使用 不转发到DJango
location /bundlejs {
alias /usr/share/nginx/html/bundlejs/;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
以下是阿里云nginx默认的配置
#
# server {
# listen 8001;
# #listen [::]:80 default_server;
# server_name upload;
# #root /usr/share/nginx/html;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# location / {
# include uwsgi_params;
# uwsgi_pass 127.0.0.1:8002;
# }
#
# #error_page 404 /404.html;
# # location = /40x.html {
# #}
#
# #error_page 500 502 503 504 /50x.html;
# # location = /50x.html {
# #}
# } 37,0-1 37%
这是配置文件,我们需要改的就是server,如果不改默认端口80那一坨,也可以直接另起一个监听另一个端口比如8000.
在server下添加新的location项,指向uwsgi的ip与端口
location / {
include uwsgi_params;将所有的参数转到uwsgi下
uwsgi_pass uwsgi的ip与端口;
}
我们试着改了默认的server,让用户输入ip之后直接指向我们配置的页面即可。如果listen对了,默认是会匹配location里面的的正则,匹配到了就路由到指定ip+端口,static是配置不走DJango的,如127.0.1.1/static/xxxx.png,这样的url直接拿服务器上的资源,不走Django,直接返回,配置好了nginx,指向uwsgi,再指向DJango服务,一套就配置好了。
小结:
- 阿里云自带,熟悉安装目录和配置文件目录
- 配置nginx listen location以及static 这里的static配置的路径是后续静态文件存放路径
- 配置location之后切换到项目根目录重新配置uwsgi.ini 修改uwsgi.ini文件,启动socket,禁用http
- 重启nginx、uwsgi(上面有介绍如何重启)
静态文件
本地开启的DJango应用,我们执行
python3 manage.py runserver
之后,我们是可以根据img标签里面的src=/static/xxx.png获取静态资源,那么我们在服务器上启用了nginx之后,静态资源就由nginx来拦击处理了,如上配置的static正则,指定了一个路径,该路径就是我们服务器上自己配置的静态资源路径。
- 所有的静态文件都会由nginx处理,不会将请求转到uwsgi
- 配置nginx的静态项,打开conf/nginx.conf文件,找到server,添加新location
location /static {
alias /var/www/upload/static/;
}
一开始这些目录是没有的,需要自己创建
- 在服务器上创建目录结构“/var/www/upload/”
- 修改目录权限
sudo chmod 777 /var/www/upload
- 创建static目录,注意顺序是先分配权限,再创建目录
mkdir static
这里就可以再看下项目根目录下的setting.py了
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
STATIC_ROOT='/var/www/upload/static/'
上面两个是开发环境下的,最后一个配置是采集DJango的静态文件的。不想出错的话直接配置好三个即可,上面两个是针对项目目录来的,下面的STATIC_ROOT是采集用的,就是服务器上的一个地址,和nginx查找的static配置文件匹配。
执行
python3 manage.py collectstatic
就会把DJango项目中的STATIC_URL对应的目录下的资源采集到STATIC_ROOT目录,让nginx查找匹配。采集资源如下,和项目是一一对应的,只是由nginx来匹配了
[root@izj6cgebrvv84gtntwiyagz nginx]# cd /var/www/upload/
[root@izj6cgebrvv84gtntwiyagz upload]# ls -a
. .. static
[root@izj6cgebrvv84gtntwiyagz upload]# cd static/
[root@izj6cgebrvv84gtntwiyagz static]# ls
admin bundlepic js weexJS
[root@izj6cgebrvv84gtntwiyagz static]#
小结
- 新建服务器静态资源目录和权限配置
- nginx配置文件static配置路径
- 项目setting.py下配置路径,采集路径和nginx统一目录下
- 执行采集,静态资源转移
- 重启nginx、uwsgi
阿里云端口权限开启
进入安全组配置,开启指定端口权限
至此,输入你的阿里云ip地址,就可以访问到DJango写的匹配到urls.py下的第一个views.py对应的html模板页面,逻辑搞明白了,后面就是写模块了,后面改了什么就重启nginx或者uwsgi