天天看点

CentOS 7 下使用Uwsgi及nginx搭建Django站点

说明:这篇博客基本上算是直接翻译Justin Ellingwood在DigitalOcean上发表的一篇文章,英语好的同学推荐大家去直接阅读原文。

我写这篇博客的目的除了想感谢Justin Ellingwood的出色分享外,也想将自己走过的坑说出来以提醒对此感兴趣的小伙伴。

0. 介绍

Django是Python中非常强大(全能)的Web框架,它可以帮助你很便捷的搭建Web应用。但如果在实际应用当中,还需要相应更安全、强大的Web服务。

在本博文中,首先配置实现uWSGI与我们的Web应用(即我们的Django项目)之间的交互。再使用Nginx来反向代理uWSGI,为我们的Web应用提供更安全、高效的特性。

1. 前提要求

为了能完成整个的安装过程(当然在实际生产过程中更应如此),你需要有一个non-root并有sudo权限的root用户(自己之前看的时候没注意,就掉进坑了)。这方面的操作Justin Ellingwood也提供了操作指南。

另外,大家如果想用Python3来搭建站点的话,推荐大家使用rpm的方式安装python3以及python3-devel(自己卡在后面这个地方被坑过),操作指南。

那,现在就可以正式开始了。

2. 配置VirtualEnv and VirtualEnvWrapper

我们将使用虚拟环境来安装我们的Django项目,以实现Python的版本管理。为此,我们需要使用到virtualenv以及virtualenvwrapper。

2.1 安装python-pip

sudo yum install epel-release
sudo yum install python-pip
           

当然,如果按照之前介绍的rpm方式安装python3及python3-devel,那么以及安装好了对应的pip(使用时请用pip3.6);

2.2 安装virtualenv virtualenvwrapper及设置

sudo pip install virtualenv virtualenvwrapper
# 设置虚拟环境的位置(ENV)
echo "export WORKON_HOME=~/Env" >> ~/.bashrc
# 如果使用python3,则需指明python3执行程序的位置
echo "export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.6" >> ~/.bashrc
echo "source /usr/bin/virtualenvwrapper.sh" >> ~/.bashrc
           

读取.bashrc文件

source ./bashrc
           

3. 创建Django项目

现在,我们可以使用virtualenvwrapper在虚拟环境下轻松的搭建我们的项目环境。

mkvirtualenv firstsite
           

该指令会在虚拟环境下安装Python及pip,并激活该环境。现在,你的命令行行首应该类似于(firstsite)[email protected]:~$。并且,在该虚拟环境下,你也无需再管python2, python3之间的版本区别什么的了,使用pip(python3也使用该指令)安装的Python包也仅在当前环境中有效(并且无需使用sudo即可安装)。

现在,安装Django

pip install django

Django安装之后,创建我们的Django项目:

cd ~
django-admin.py startproject firstsite
           

该命令会在当前用户的家目录下创建名为firstsite的Django项目。

对该项目进行一些基础设置:

(1) 数据库迁移及超级用户的创建

cd ~/firstsite
# 如果需要修改默认数据库,请在执行下一命令前修改Django的setting.py文件中的数据库配置部分内容。
./manage.py migrate
./manage.py createsuperuser
           

(2) 静态文件位置的修改

打开项目的配置文件:

vim firstsite/settings.py

当我们使用Nginx来反向代理我们的站点时,我们需要将我们的静态文件(如图片、视频、音频、字体、CSS等)放置在统一的目录下。

# 将该行输入到setting.py文件中
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
           

保存并关闭后使用

./manage.py collectstatic

命令,Django会帮你在当前位置

~/firstite

下创建static目录保存静态文件。

(3) 进行测试

./manage.py runserver 0.0.0.0:
           

在浏览器中输入:

http://server_domain_or_IP:8080

即可看到Django熟悉的初识界面

CentOS 7 下使用Uwsgi及nginx搭建Django站点

进入/admin界面:

CentOS 7 下使用Uwsgi及nginx搭建Django站点

即可使用之前创建的超级用户进行登陆了。

(4)关于虚拟环境进入退出的一点说明

退出:

deactivate

进入:

workon firstsite

OK,现在我们需要使用

deactivate

命令退出当前虚拟环境。

4. 设置uWSGI应用服务器

4.1 软件安装

# 如果之前用rpm安装过python3-devel则跳过该命令
sudo yum install python-devel 
sudo yum install gcc  gcc-c++
sudo pip install uwsgi
# 若为python3,则使用
sudo pip3. install uwsgi
           

快速测试:

在浏览器中输入:

http://server_domain_or_IP:8080

,即可看到如同之前的页面了。注意,现在/static下的文件并不能正常的显示工作,需要通过Nginx的配置后才能正常显示。

4.2 uWSGI配置的设置

创建

/etc/uwsgi/sites

的目录来保存我们的配置文件

sudo mkdir -p /etc/uwsgi/sites
cd /etc/uwsgi/sites
           

创建Django站点对应的配置文本:

sudo nano firstsite.ini
           

在其中输入:

[uwsgi]
project = firstsite
username = user
base = /home/%(username)

chdir = %(base)/%(project)
home = %(base)/Env/%(project)
module = %(project).wsgi:application

master = true
processes = 

uid = %(username)
socket = /run/uwsgi/%(project).sock
chown-socket = %(username):nginx
chmod-socket = 
vacuum = true
           

各项值的含义我就不一一解释了,详情见Justin Ellingwood的文章。

4.3 为uWSGI创建一个Systemd Unit File

现在我们的配置文件可以为我们Django项目提供服务了,当并不能自动实现。接下来,我们需要创建一个系统文件实现uWSGI的自启动。

我们将在

/etc/systemd/system

目录下创建我们的

uwsgi.service

文件:

sudo vim /etc/systemd/system/uwsgi.service
           

并在其中输入:

[Unit]
Description=uWSGI Emperor service

[Service]
ExecStartPre=/usr/bin/bash -c 'mkdir -p /run/uwsgi; chown user:nginx /run/uwsgi'
ExecStart=/usr/bin/uwsgi --emperor /etc/uwsgi/sites
Restart=always
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all

[Install]
WantedBy=multi-user.target
           

各项值的具体含义见Justin Ellingwood的文章。

5. Nginx的安装及配置

uWSGI配置好后,我们需要安装和配置Nginx作为我们的反向代理。

5.1 nginx的安装

(1) 在此处,你可以直接使用yum的方式进行安装:

sudo yum install nginx
           

使用此方式安装的话,你的配置文件位于

/ete/nginx/nginx.conf

以及

/etc/nginx/conf.d/*

两个位置中。

(2)为了Nginx的后续配置,如开启https及自签名证书的配置等,推荐你采用源码编译的方式来安装Nginx,安装的具体操作可参照我之前写过的一篇博客。

按照此方式进行安装的Nginx的配置文件位于

/etc/local/nginx/conf/nginx.conf

但为了配置文件的简介性,建议你创建

/etc/local/nginx/conf/conf.d

目录,并在

/etc/local/nginx/conf/nginx.conf

的配置中添加一句:

5.2 Nginx的配置

为Django项目单独创建一个Nginx配置文件:

vim /etc/nginx/conf.d/firsite.conf
# 或者
vim /usr/local/nginx/conf/conf.d/firstsite.conf
           

在文本中输入:

server {
    listen ;
    server_name firstsite.com www.firstsite.com;

    location = favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/user/firstsite;
    }

    location / {
        include uwsgi_params;
        uwsgi_pass unix:/run/uwsgi/firstsite.sock;
    }
}
           

配置完成后,可使用

sudo nginx -t

对Nginx的配置文件进行检查。

5.3 权限及启动的配置

为了能让nginx能访问

/home/user

中的文件,我们需要将nginx添加到user用户组,并设置相应权限确保安全:

sudo usermod -a -G user nginx
chmod  /home/user
           

自此,我们的配置已经基本完成啦,现在,就启动我们的Nginx服务以及uWSGI进程吧:

sudo systemctl start nginx
sudo systemctl start uwsgi
           

设置这两项服务的自启动:

sudo systemctl enable nginx
sudo systemctl enable uwsgi
           

参考资料

  1. How To Serve Django Applications with uWSGI and Nginx on CentOS 7,Justin Ellingwood:https://www.digitalocean.com/community/tutorials/how-to-serve-django-applications-with-uwsgi-and-nginx-on-centos-7(最主要参考)
  2. 创建有sudo权限的non-root用户, Mitchell Anicas:https://www.digitalocean.com/community/tutorials/initial-server-setup-with-centos-7、
  3. python3的rpm安装, MoeLove 不忘初心:http://moelove.info/2017/06/30/Install-Python3-6-on-CentOS7/
  4. nginx的编译安装:(http://blog.csdn.net/github_38594241/article/details/74999485)