软件 | 版本 |
---|---|
Nginx | 1.16.1 |
uWSGI | 2.0.18 |
Django | 2.2.4 |
centos | 7.6 |
python | 3.7.2 |
本文将从三个方面来讲述这个问题
Nginx, uWSGI, Django三者的关系
Web的简单发展史
-
最早期的时候, Web Server返回的都只是一些静态的Html页面. 用户通过浏览器向服务器发送请求, 服务器接收到请求后在指定的文件夹下找到相应的文件然后返还给浏览器.
-
后来, 静态页面已经满足不了人们的需求, 人们想和Web Server进行一些动态交互, 比如用户名密码的登录, 比如想知道某个网站的访问量是多少等等, 这些都不再是程序员事先写几个静态页面存储在Web Server中就可以实现的.
由于动态交互涉及一定的业务逻辑, 于是就产生了处理这些业务逻辑的代码程序. Web Server接收到Browser的请求后, Web Server会把这个请求转发到一个处理这个请求的程序, 程序处理完后把结果返还给Web Server, 再由Web Server返还给Browser.
比如一个登录功能, Browser将账号密码发送给Web Server后, Web Server将账号密码转发给一个处理程序, 这个处理程序会验证这个账号密码是否匹配, 然后把结果发送给服务器.
CGI (Common Gateway Interface) 通用网关接口, 就是最初专门用来为server生成动态页面的脚本程序 -
随着时代的进步, CGI的局限性渐渐体现了出来, 伸缩性不太好, 不安全, 没有提供一种结构化的方法去构造一个动态应用程序(向深入了解CGI缺点的同学可以自行查阅资料). 新旧更迭, Web应用时代终于在2005年左右到来. 许许多多的Web应用框架应运而生, Django就是其中之一. 根据这些框架可以很容易的构造出一个又一个web应用.
Web Server将接收到的请求都转发给Web应用, 由Web应用程序处理后再将结果返还.
而Web Server想要和Web应用之间进行通信, 就需要大家都遵守一个规范协议, 这就是WSGI (Web Server Gateway Interface) (WSGI是为python语言定义的, 也就是说Web应用的编写语言为python). 通俗地讲就好像一个韩国人和一个日本人要相互沟通, 就需要学一门共同的语言汉语, WSGI就是充当汉语的角色.
uWSGI, WSGI, uwsgi的区分
-
uWSGI: 一种服务器(和Nginx同类别),实现了WSGI协议、uwsgi协议、http协议等。它要做的就是把HTTP协议转化成语言支持的网络协议。比如把HTTP协议转化成WSGI协议,让Python可以直接使用。
-
WSGI: 它不是服务器、python模块、框架、API或者任何软件,只是一种描述web服务器(如nginx,uWSGI等服务器)如何与web应用程序(如用Django、Flask框架写的程序)通信的规范。
-
uwsgi: 与WSGI一样,是uWSGI服务器的一种通信协议
Nginx, uWSGI, Django三者的关系
既然已经有了Nginx服务器, 为什么还需要uWSGI服务器呢? 其实两个服务器的作用不同, Nginx优化的是并发连接数和静态数据, uWSGI主要优化动态数据的处理.
所需依赖的安装
- 在阿里云购买一个ECS的实例, 设置root账户密码
- 打开本地主机的Terminal, 输入下列命令远程连接ECS
ssh root@ecs的公网ip
然手输入设置的root账户密码即可.
有时会显示ssh密钥过期的情况, 输入下列命令, 再重新连接即可
ssh keygen -R ecs的公网ip
- 初始的的centos系统需要安装以下这些东西
安装python3.7.2
centos更新系统包
sudo yum update
安装编译python3的依赖包
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel
(使用
yum list installed
查看是否已安装pip和wget, 如果已安装可以跳过下面者两个的安装)安装pip
yum -y install epel-release
yum install python-pip
安装wget
yum install wget
获取python3.7源码
wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tgz
解压缩
tar -zxvf Python-3.7.2.tgz
手动编译
cd Python-3.7.2
./configure prefix=/usr/local/python3
make && make install
添加软连接
ln -s /usr/local/python3/bin/python3.7 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3.7 /usr/bin/pip3
pip3 安装的包都默认放在了 /usr/local/python3/bin中, 需要在.bash_profile中设置环境变量, 将/usr/local/python3/bin加入其中,否则之后安装包的命令都会无法使用
安装uWSGI, Nginx, Django, Virtualenv
- 安装虚拟环境
pip3 install virtualenv
- 在root文件夹下创建一个虚拟环境的根目录
virtualenv venvTest
- 进入虚拟环境
source venvTest/bin/activate
(退出直接输入deactivate即可)- 安装uWSGI
pip3 install uwsgi
- 安装Nginx
yum install nginx
安装django
pip3 install django==2.2.4
(建议使用该版本, 3.x版本的django会出现与数据库版本不匹配的情况而报错)
简单Django项目的远程部署
下面部署中会涉及ECS的端口监听, ECS开放的端口都需要在ECS的安全组中先设置
创建一个django项目
- 进入虚拟环境后, 在root目录下, 创建一个django项目
django-admin startproject DjangoProject
- 进入DjangoProject项目文件夹,创建一个App
cd DjangoProject
django-admin startapp OneApp
- 修改DjangoProject的settings.py文件
ALLOWED_HOSTS=['*']
*表示允许服务器的所有ip地址都可被访问
INSTALLED_APPS = [.... , 'OneApp']
- 修改DjangoProject的urls.py文件
- 在OneApp中创建urls.py文件
- 修改OneApp中的views文件
- 进入项目文件夹, 启动项目
cd /root/DjangoProject
python3 manage.py runserver 0.0.0.0:8000
在本地主机浏览器中输入: ECS公网ip:8000 显示django主页则是成功(注意在网络安全组中将8000端口打开)
ECS公网ip:8000/hello ECS公网ip:8000/calculate?formula=2*7 这两个url应该都会返回值
使用uWSGI来启动
uwsgi --http ECS内网ip:8000 --file DjangoProject.wsgi.py
浏览器中输入 ECS公网ip:8000 应该也会显示和之前runserver同样的内容
配置uwsgi.ini文件
- 在DjangoProject同级项目中创建一个script文件夹, 里买存放uwsgi.ini配置文件
cd /root
mkdir script
vim uwsgi.ini
- 运行uwsgi
uwsgi --ini uwsgi.ini
运行成功后会在script文件夹下生成三个文件, uwsgi.sock, uwsgi.pid, uwsgi.log
可以使用ps -ef | grep uwsgi 查看uwsgi是否运行
关闭uwsgi的方法, 在script文件夹下执行命令
uwsgi --stop uwsgi.pid
配置Nginx
- 更改Nginx的使用者
vim /etc/nginx/nginx.conf
更改为user root; 否则会出现permission denied的错误
可以在main- 在/etc/nginx/conf.d/文件夹下配置一个虚拟主机的文件
cd /etc/nginx/conf.d/
vim hello.conf
- 在启动uWSGI的前提下, 启动nginx
nginx
在浏览器中输入 ECS公网ip 显示和之前一样的内容即配置成功
关闭nginx
nginx -s stop
配置ssl证书供小程序访问
server {
listen 443;
server_name 备案域名;
access_log /var/log/nginx/access.log main;
charset utf-8;
# 前两个是域名证书ssl
ssl_certificate "/etc/pki/nginx/xxx.pem"
ssl_certificate_key "/etc/pki/nginx/private/xxx.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
include /etc/nginx/uwsgi_params;
uwsgi_pass unix:/root/yyyenv/script/uwsgi.sock;
}
}
参考文章和视频:
说实话之前一直对云服务器, 项目部署, 前后端通信之类的问题一直望而生畏, 这次花了两三天时间各种看视频看博客, 终于对这类问题稍微入门, 发现他们其实也并不那么可怕. 学习的过程中, 发现大家都在分享自己的所学所感, 帮助别人, 而以前的自己一直都是封闭的, 从未在网上分享记录过任何东西, 名副其实的白嫖党. 但现在也想把自己的所学记录一下了, 所以把这几学的整理了一下, 可能有些地方仍然有些纰漏, 还恳请大家指正!