Centos7下配置环境 Nginx + uWSGI + Django

上个月学了一些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!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值