上个月学了一些Python基础,知道还有Django这么个强大的框架。
既然手头有一个现成的AWS服务器,不好好利用起来哪能行。
经过初步了解,Centos下搭建Django最王道的组合是 Nginx + uWSGI + Django
一. 安装Nginx
Nginx是有名的http反向代理服务器,可同时应对大量的访问要求。
如此强大的nginx自然也可以承载诸如PHP等其他动态网站。
yum -y install nginx
接着是对nginx基本功能的测试,启动nginx服务后在其他设备上用浏览器访问该AWS主机,自然这时主机的防火墙都已经开启了端口80的访问许可
systemctl start nginx
当看到浏览器页面大大显示着 Welcome to nginx! 时表示服务安装成功,正常运行。
二. 安装Python3
uWSGI与Django都可以通过python的pip来安装,在这之前我们需要先装上python。
CentOS7系统虽然自带了Python2,考虑到python2在不久的将来也会停止支持,还是选择更有前景的python3。
但尽管如此,也不能够简单粗暴的删除原来的python2,它与系统的很多功能(例如yum)都紧密结合,因此在保留python2的同时安装python3。
参考网络上大佬的操作方法,分几个步骤进行
1. 依赖包安装
yum -y groupinstall "Development tools"
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
2. 下载python3源代码并解压
wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tar.xz
tar -xvJf Python-3.6.2.tar.xz
cd Python-3.6.2
3. 编译安装
创建目标安装目录并在配置中指定
mkdir /usr/local/python3
./configure --prefix=/usr/local/python3
开始编译安装
make && make install
4. 设置软链接
为了无论在什么目录下都可以使用python3,最后需要把python3的命令链接到系统命令目录下
python3的pip是默认随着python一起安装的,不用另外安装。
ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
三. 安装uWSGI
虽然uWSGI本身也是web服务器,但因为性能不高,通过nginx中转能够发挥更好的效果。
1. 通过pip安装 uWSGI
pip3 install uwsgi
同样为了能在任何目录下都能够使用uwsgi,也为其创建软链接
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
2. 单独对uwsgi功能做简单测试
接下来根据网络上高手的教程,先在任意目录创建一个测试用python脚本(test.py)
内容如下,定义一个简单的函数,内容只有两行
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"]
注意,作为return返回内容的 [b"Hello World"] 用于python3, 如果是python2,只需要return ["Hello World"]
为图方便,不需要修改防火墙,继续使用端口80做测试,先关闭nginx服务
systemctl stop nginx
打开uwsgi服务并指定端口与响应文件,这时命令窗口会暂时被该命令pend住直到我们用 Ctrl + C 退出服务
uwsgi --http :80 --wsgi-file test.py
注意,因为省略了IP地址,:80 前要有空格
最后用其他设备的浏览器访问AWS服务器,就会看到屏幕左上方显示着 Hello World
测试成功
四. 安装Django
1. 通过pip安装 Django
pip3 install django
2. 创建Django基本功能测试用工程
注意,要先把目录切到Django管理脚本(django-admin)的位置
管理脚本的运行需要加上python3的前缀,否则系统会默认使用python2来执行,导致出错提示无此命令
cd /usr/local/python3/bin/
python3 django-admin startproject test_project
3. 在保持nginx不启动的状态下打开测试用工程的服务
python3 manage.py runserver 0.0.0.0:80
这个命令中指定的IP 0.0.0.0 就是本机地址
再来就是在其他设备上用浏览器访问AWS,第一次访问时可能看到浏览器中显示如下错误
DisallowedHost at / Invalid HTTP_HOST header
这是因为未修改本工程的容许访问HOST
修改工程目录下的配置文件
vi test_project/settings.py
搜索到 ALLOWED_HOSTS = [ ] 并做如下修改以允许所有HOST的访问
ALLOWED_HOSTS = ['*']
浏览器上再次访问成功,画面中央显示 The install worked successfully! Congratulations!
五. Django + uWSGI + Nginx 联调
1. Django配置
虽然HTTP请求都会经由 Nginx 转到Django做处理,但作为网页显示不可分割的一部分,静态文件(CSS, JS 等)的请求不能走这样的途径。
该问题表现为页面CSS文件请求的失败,浏览器中显示的是无样式,即杂乱无美感的内容。
解决方法是静态文件的请求处理不交给Django,而直接由Nginx进行处理。
要实现这个目标,首先要把静态文件都定位整理出来,四处分散的话Nginx可处理不了。
因为Python每个APP的目录下都有自己的静态文件,我们要利用Python提供的功能把各个APP下的静态文件都统一整理到一个目录下。
先在工程根下新建子目录 static,接着配置settings.py文件
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR,'static')
再执行Python的静态文件转移命令
python manage.py collectstatic
2. uWSGI设置
uWSGI将以读取ini配置文件的方式启动,Django相关的信息都记录在ini文件中,ini文件可放置在任意位置
以上一步创建的Django工程为对象,在工程主目录下创建该文件
cd /usr/local/python3/bin/test_project
vi test_proj.ini
ini文件内容如下
# test_proj.ini file
[uwsgi]
# Django-related settings
# uwsgi的对外socket接口,nginx将通过该接口与uwsgi做数据交换,因为与nginx同在一个服务器内,不需要在防火墙上对端口8090做访问许可
socket = 127.0.0.1:8090# the base directory (project full path)
# 本项记录Django对象工程的完整路径
chdir = /usr/local/python3/bin/test_project# Django s wsgi file
# 本项指示uwsgi.py文件的位置,其位于Django工程目录下有个与工程名同名的子文件夹内 ( 设置方式为 文件夹名.wsgi )
module = test_project.wsgi# process-related settings
# master
master = true
# maximum number of worker processes
processes = 4
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
# pidfile for record run pid
pidfile =pid.uwsgi
# run process background and save log to daemonize
daemonize = UWSGI.log
最后是根据ini文件的配置启动 uwsgi 服务
uwsgi --ini test_proj.ini
这种方式的启动不会占用命令窗口
小贴士:uWSGI并不像Nginx那样有专门的命令来启动和关闭。如果想对uWSGI更改配置,用下面的Linux命令强制结束uWSGI相关进程。
pkill -f -9 uwsgi
进程是否已被关闭可查看进程列表确认 ps aux|grep uwsgi
3. Nginx设置
修改nginx的配置文件
vi /etc/nginx/conf.d/default.conf
server配置的内容做如下修改
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
access_log /var/log/nginx/myweb_access.log;
error_log /var/log/nginx/myweb_error.log;
client_max_body_size 75M;
location / {
include uwsgi_params;
#这行指定uwsgi开放的数据交换接口
uwsgi_pass 127.0.0.1:8090;
#这里与配置uwsgi的ini文件中module内容一致
uwsgi_param UWSGI_SCRIPT test_project.wsgi;
#这里与配置uwsgi的ini文件中chdir内容一致
uwsgi_param UWSGI_CHDIR /usr/local/python3/bin/test_project;
}
location ^~ /static/ {
root /home/test_project/;
#这行指定静态文件的搜索目录, localhost/static/test.css => /home/test_project/static/test.css
#注意,这里location行中指定的地址也会在转换后的地址中
}
接着是重新启动nginx
systemctl restart nginx
最后依然是在其他设备上用浏览器访问AWS,与Django简单测试时一样,
浏览器上显示The install worked successfully! Congratulations!