CentOS 7.5上搭建Nginx、uWSGI、Django环境

字数 1431阅读 325

最近公司有个项目需要使用到CMDB,就顺便研究了一下搭建环境,正式上线后需要使用到Nginx来控制服务的启停,下面是具体的搭建过程;

1. 安装环境

  • CentOS 7.5
  • Python 3.6.5
  • Django 2.1
  • uWSGI 2.0.17.1
  • Nginx 1.14.0

2. 关闭防火墙和SElinux

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld   #开机禁用firewall服务
[root@localhost ~]# getenforce  #查看SELinux状态
Enforcing

[root@localhost ~]# /usr/sbin/sestatus   #Current mode表示当前selinux防火墙的安全策略
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      31

[root@localhost ~]# setenforce 0      #临时关闭SElinux
[root@localhost ~]# getenforce 
Permissive

[root@localhost ~]# vim /etc/selinux/config    #永久关闭

将 "SELINUX=enforcing" 改为 "SELINUX=disabled",保存后退出,重启才会生效

3. 安装所需软件包

最小化安装Linux系统后有很多软件包没有安装,有些命令不能使用,需要手动自己安装,把所需的工具包装上,方便后续配置的工作;

[root@localhost ~]# yum install -y vim tree net-tools lrzsz  

[root@localhost ~]# yum groupinstall "Development Tools"  -y

4. pyenv的安装

pyenv是一款特别好用的Python版本管理器,程序员可以建立不同的目录,在不同的目录里分别运行不同版本的Python, 并且互不影响,安装的包也互不影响。github项目地址:https://github.com/yyuu/pyenv

pyenv-virtualenv是pyenv的一个plugin(插件),可以用来创建基于不同Python版本的干净的虚拟环境。github项目地址:https://github.com/yyuu/pyenv-virtualenv

4. 1 安装依赖包
[root@localhost ~]# yum -y install git gcc make patch zlib-devel gdbm-devel openssl-devel sqlite-devel bzip2-devel readline-devel
4.2 安装pyenv(pyenv-virtualenv插件会自动安装)

安装(下面一条命令可以把pyenv和pyenv-virtualenv插件都装上):

[root@localhost ~]# curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
4.3 设置环境变量

~/.bash_profile环境变量配置加入下面三行

export PATH="~/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

需要使环境变量生效

运行命令exec "$SHELL" 或者source ~/.bash_profile ,如果还没有效果,就退出终端,重新打开。

4.4 pyenv 使用指南
[root@localhost ~]# pyenv install --list   #查看可以安装的版本

# `...`表示省略
...
2.7.13
...
3.6.5
...

pyenv versions 查看系统的上安装的Python版本。 其中前面的 * 表示当前工作目录正在使用的python版本,其中的 system 表示系统自带的 Python 版本:

[root@localhost ~]#  pyenv versions
*system (set by /Users/yulongjun/.pyenv/version)

pyenv install <version> 安装其他版本的Python。我们以安装2.7.13和安装3.6.5版本:

[root@localhost ~]# pyenv install 3.6.5
[root@localhost ~]# pyenv install 2.7.13
[root@localhost ~]# pyenv versions    #可以看到安装的版本
* system (set by /root/.pyenv/version)
  2.7.13
  3.6.5

pyenv local <version> 切换python版本。
示例:

pyenv local 2.7.13
pyenv local 3.6.5
4.5 pyenv-virtualenv 使用指南

pyenv-virtualenv是用来创建一个干净的虚拟Python环境的命令,通常在创建干净的新项目时候使用。使用方法如下:

创建虚拟环境 pyenv virtualenv 版本号 虚拟环境名

[root@localhost ~]# pyenv virtualenv 3.6.5 venv-3.6.5

创建项目,让项目使用干净的Python3.6.5的虚拟环境:

[root@localhost ~]# mkdir Python3
[root@localhost Python3]#pyenv local venv-3.6.5
(venv-3.6.5) [root@localhost Python3]# 
(venv-3.6.5) [root@localhost Python3]# cd ..
[root@localhost Python3]# cd Python3
(venv-3.6.5) [root@localhost Python3]#
(venv-3.6.5) [root@localhost python3]# python -V
Python 3.6.5

我们会发现:只要我们进入Python3目录,就会自动激活virtualenv,退出Python3目录,就会关闭virtualenv

如果要关闭自动激活,可以运行命令pyenv deactivate,要重新启用的话,运行pyenv activate 虚拟环境名

5. 安装Django

Django是一个开放源代码的Web应用框架,由Python写成,能够以最小的代价构建和维护高质量的Web应用。

(venv-3.6.5) [root@localhost Python3]# pip install django

安装完成后检查Django版本,表示安装成功

(venv-3.6.5) [root@localhost Python3]# python3 -c "import django; print(django.get_version())"

或者

(venv-3.6.5) [root@localhost Python3]# python -m django --version
2.1

查看已经安装的第三方库

(venv-3.6.5) [root@localhost Python3]# pip freeze
Django==2.1
pytz==2018.5
uWSGI==2.0.17.1  #这个是后面安装

创建CMDB项目

(venv-3.6.5) [root@localhost Python3]# django-admin startproject cmdb

在CMDB项目中创建app应用

(venv-3.6.5) [root@localhost Python3]# cd cmdb
(venv-3.6.5) [root@localhost Python3]#  pwd
 /root/Python3/cmdb                  #临时的测试目录,生产环境不应放到/root目录下,根据需求自己调整
(venv-3.6.5) [root@localhost Python3]# python3 manage.py startapp cmdb  #创建App应用

设置项目允许访问的域名,可以配置域名或IP,这里为了方便,'*' 表示所有的都可访问

(venv-3.6.5) [root@localhost cmdb]# vim cmdb/setting.py
……
ALLOWED_HOSTS = ['*']  
……

初始化数据库,使数据库状态与当前模型集和迁移集同步。就是将对数据库的更改,主要是数据表设计的更改,在数据库中真实执行。例如,新建、修改、删除数据表,某数据表内的字段等等。

python manage.py migrate

启动服务

(venv-3.6.5) [root@localhost Python3]# python manage.py runserver 0.0.0.0:8080

使用浏览器打开,如下图:

Successfully installed django-2.1

6. 安装和配置uWSGI

WSGI 全称Web Server Gateway Interface ,或者Python Web Server Gateway Interface,是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简单而通用的接口。

uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

uWSGI是一种WSGI实现,其工作原理是让它创建一个Unix socket,并且通过WSGI协议提供响应到web服务器。最后,我们完整的组件栈看起来将是这样的:

the web client <-> the web server <-> the socket <-> uwsgi <-> Django

安装uwsgi

pip install uwsgi

编写一个测试文件保存为 mytest.py ,写入以下内容

# !/usr/bin/python3

def application(env, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    return [b'UWSGI Test...']

然后再启动uWSGI服务来测试

(venv-3.6.5) [root@localhost cmdb]# uwsgi --http :80 --wsgi-file mytest.py
uWSGI Test

使用下面的方式,测试uwsgi是否可以正常运行,相当于 python manage.py runserver 0.0.0.0:8080

(venv-3.6.5) [root@localhost cmdb]# uwsgi --http :8080 --chdir /root/python3/cmdb/ --module cmdb.wsgi --static-m=/static=static
uWSGI Test project

编写uwsgi配置文件

在CMDB项目目录中新建一个uwsgi.ini 文件,和manage.py在同一个文件夹内即可,文件内容如下:

#uwsgi.ini file
[uwsgi]

# Django-related settings
socket = 127.0.0.1:8001

# the base directory (full path)
chdir          = /root/Learning-Python3/cmdb 

# Django's wsgi file
module          = cmdb.wsgi  

# process-related settings
# master
master          = true

# maximum number of worker processes
processes      = 2

# ... with appropriate permissions - may be needed
# chmod-socket    = 666
# chown-socket = nginx:nginx
# clear environment on exit
vacuum          = true
# enable-threads = true

socket 中 127.0.0.1 表示本机,后面的 8001 表示端口,这里配置的端口要和后面Nginx配置文件中的socket端口相同。

7. 安装Nginx服务

使用 yum 来安装 Nginx服务

[root@localhost ~]#  vi  /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/x86_64/
gpgcheck=0
enabled=1
[root@localhost ~]# yum install -y nginx
[root@localhost ~]# systemctl start nginx
[root@localhost ~]# systemctl enable nginx

nginx的配置文件

(venv-3.6.5) [root@localhost cmdb]# cat /etc/nginx/nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;

    #新加入的部分
    upstream django {    
        server 127.0.0.1:8001;    #端口8001必须和uwsgi配置文件中的socket端口一样
    }

    server {

        listen      80 default_server;

#        listen      [::]:80 default_server;

        server_name  www.your_domain.com your_domain.com  your_ip_addr;

        root        /root/Learning-Python3/cmdb;    #项目路径

        # Load configuration files for the default server block.

        include /etc/nginx/default.d/*.conf;

        location / {

                include uwsgi_params;

                uwsgi_pass django;

        }

    }      #一直到这里

}

修改完后,检查nginx的配置

(venv-3.6.1) [root@localhost cmdb]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

启动uWSGI服务和Nginx服务

(venv-3.6.1) [root@localhost cmdb]# uwsgi --ini uwsgi.ini     #或者使用& 后台启动,或者加入到开机自启动
(venv-3.6.1) [root@localhost cmdb]# systemctl restart nginx

能够使用默认的80端口访问成功,表示环境已经全部搭建好了,下一步需要把项目的代码弄进来,就能够正常跑项目了,以后的服务启动都是通过Nginx来控制,需要把uwsgi服务放在后台跑;


Not Found 404

8. 安装报错解决

1. 安装pyenv报错

最小化安装导致一些软件包没有安装,需要把这些包装上:

[root@localhost ~]# curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
……
/root/.pyenv/plugins/python-build/bin/python-build: line 1625: patch: command not found
……

需要安装 patch 包,使用 yum 安装:

[root@localhost ~]# yum -y install patch

安装过程中继续报错:

……
configure: error: no acceptable C compiler found in $PATH   #确少 gcc 软件包
……

[root@localhost ~]# yum groupinstall "Development Tools"  -y    #把所需的开发工具包都安装上
2. 升级pip报错

安装完Django后,会有提示升级pip 版本过低(这一步可忽略),直接使用提示的命令安装会报错

[root@localhost ~]# pip install --upgrade pip

Collecting pip
  Downloading https://files.pythonhosted.org/packages/5f/25/e52d3f31441505a5f3af41213346e5b6c221c9e086a166f3703d2ddaf940/pip-18.0-py2.py3-none-any.whl (1.3MB)
    28% |█████████▎                      | 378kB 5.6kB/s eta 0:02:46Exception:
Traceback (most recent call last):
  File "/root/.pyenv/versions/3.6.1/envs/venv-3.6.1/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/response.py", line 232, in _error_catcher
    yield
  File "/root/.pyenv/versions/3.6.1/envs/venv-3.6.1/lib/python3.6/site-packages/pip/_vendor/requests/packages/urllib3/response.py", line 314, in read
    data = self._fp.read(amt)
  File "/root/.pyenv/versions/3.6.1/envs/venv-3.6.1/lib/python3.6/site-packages/pip/_vendor/cachecontrol/filewrapper.py", line 60, in read

可以使用这个命令更新:

pip3 install --upgrade pip

推荐阅读更多精彩内容