基于CentOS-7搭建Nginx + uWSGI + Django服务器环境

阅读:5267

发布时间:2018年1月16日 21:58

Python

前言

本文介绍的方法基于CentOS 7.2 + Python 2.7 + Django 1.9的环境搭建,但实际上,该方法在CentOS 7.4 + Python 3.6 + Django 1.11下依然可用,我的个人网站就是基于后者搭建的。

环境搭建

  • Django 1.9
  • Nginx 1.8(RPM包安装)
  • uWSGI 2.0.12

Django

Django的安装方式有许多种,无论是使用pip install django或是从Django官网上下载Django源码后,在源码目录执行python setup.py install的源码方式安装都可以。安装完毕后,进入Python命令行,执行import django,若无任何错误,则Django安装完成。

uWSGI

uWSGI同样可以采用上述两种方法进行安装,如果采用源码安装,安装过程中有可能会出现一些问题。

1)fatal error: Python.h: No such file or directory

这个错误是因为缺少Python-devel环境,执行yum -y install python-devel进行安装。

2)collect2: error: ld returned 1 exit status

这是因为缺少pcre环境,同样使用yum进行安装。

3)configure: error: You need a C++ compiler for C++ support

这是因为缺少gcc-c++,依然使用yum进行安装即可。

顺利安装完成后,在命令行执行uwsgi -version查询版本,若无问题,则uWSGI安装成功。

Nginx

Nginx我这里采用RPM包的方式进行安装,使用RPM包可以减少一些配置的工作,如果对自己比较有信心或者有其他需求,则可以使用源码来进行安装。

执行wget http://nginx.org/packages/rhel/7/x86_64/RPMS/nginx-1.8.1-1.el7.ngx.x86_64.rpm下载RPM包,然后执行rpm -ivh nginx-1.8.1-1.el7.ngx.x86_64.rpm来安装Nginx。安装完成后,键入nginx -v,出现nginx version:nginx/1.8.1字样则安装成功。

配置项目

假设我们的项目为mysite,并且将项目放到/www目录下,即我们项目的根目录为/www/mysite

/etc/nginx/uwsgi_params文件复制到/www/mysite下,并执行chmod +x /www/mysite/uwsgi_param提高该文件的权限。在/var/log目录下新建uwsgi目录用于存放uWSGI的日志,或者可以按照个人喜好随意创建日志目录,一会儿在uwsgi的配置文件中指定即可。

/etc目录下新建uwsgiconfig.ini文件作为uWSGI的配置文件,并配置内容。

uWSGI以及后面Nginx的配置过程可以简单参考uWSGI的官方文档:uWSGI官方文档

下面我给出一个简单的配置:

# /etc/uwsgiconfig.ini
[uwsgi]
socket = /www/mysite/mysite.sock
master = true
process = 10
vacuum = true
max-requests = 5000
pidfile = /var/run/uwsgi.pid
daemonize = /var/log/uwsgi/uwsgi.log
chdir = /www/mysite
module = mysite.wsgi
chmod-socket = 666

配置完uwsgi后,再配置Nginx,同样的,Nginx的配置也可以参考上面给出的uWSGI官方文档。

我们编辑/etc/nginx/conf.d/default.conf文件,键入以下内容:

# /etc/nginx/conf.d/default.conf

upstream django {
server unix:///www/mysite/mysite.sock; 
}

server {
listen 80; # 监听的端口
server_name *; # 根据自己服务器的IP或域名来设置
charset utf-8;

client_max_body_size 10M;
fastcgi_buffers 16 512k;
fastcgi_send_timeout 120s;
fastcgi_read_timeout 120s;

location /static {
alias /www/mysite/static; # 用于放置项目静态文件
}

location / {
uwsgi_pass django;  # 这个django对应上面upstream的django #
include /www/mysite/uwsgi_params; 
}  

}

系统相关

Linux系统别忘了关闭防火墙和selinux。当然,如果为了安全考虑,我建议还是研究一下怎么设置这两个东西,但如果实在不会搞,或者没有这个需求(譬如在更外层的网络上做防火墙策略,如阿里云),那么就按照我下面说的方式把这俩东西关掉吧。

防火墙

  1. 执行systemctl stop firewalld.service关闭防火墙。
  2. 执行systemctl disable firewalld.service删除防火墙服务。

SELINUX

编辑文件/etc/selinux/config,将SELINUX改为disabled,然后重启服务器完成配置。

验证

执行systemctl start nginx && uwsgi --ini /etc/uwsgiconfig.ini启动服务器,如果终端下只出现[uWSGI] getting INI configuration from /etc/uwsgiconfig.ini字样,则服务器启动成功。其他任何Nginx字样的报错,请查看/var/log/nginx/error.log或者systemctl status nginx定位并解决问题。

服务器启动成功后,在浏览器中输入地址和端口,没有错误信息,则网站搭建成功。

总结

环境搭建永远是开发过程中最头痛的阶段之一,第一次时搭建会有无数坑在前方等着你。

本文介绍的方法,最容易出问题的,是NginxuWSGI配置文件的问题,启动失败的多数原因都在配置文件上,或者权限问题。

这玩意儿也是熟能生巧的过程,搭建多了自然也就熟练了。