IP Address: 54.198.55.167



Python什么都好,就是版本依赖性太高,Python2和Python3居然不兼容,造成各自的解释器不能执行对方的脚本,真的感觉有点扯。好在Python2和Python3是可以在系统中共存的,可以根据脚本的开发环境来适配相应的解释器。本文将详细讲解如何在CentOS 7系统中搭建Python3网站运行环境,主要内容包括:

  1. 源代码安装Pytho3
  2. 安装配置Virtualenv虚拟环境
  3. 安装配置uwsgi服务器
  4. 配置Nginx代理uwsgi请求

源代码安装Python3

CentOS7默认已经安装Python2.7解释器,如果想运行Python3开发的脚本就需要手动安装Python3。源代码方式安装最为简便,相关命令如下:

 # wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tgz
 # tar -zxvf Python-3.6.5.tgz
 # cd Python-3.6.5
 # yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel zlib*
 # ./configure --prefix=/usr/local/python3 --enable-optimizations
 # make
 # make install

以上的命令都比较容易理解,就是在官方网站下载源代码包,然后编译安装。其中yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel zlib*是为了安装Python3可能使用的依赖包。安装成功后,会将Python3解释器安装在”/usr/local/python3″目录。

安装配置Virtualenv虚拟环境

Virtualenv是一个Python的软件包,可以为不同的Python脚本设置不同的Python环境,就像每个脚本都有独立的虚拟运行环境一样。其工作原理我也不是很清楚,只是知道它会将目前系统默认的Python解释器复制到虚拟环境中,然后通过激活不同的虚拟环境来达到切换Python解释器的目的。在安装Virtualenv之前,先做如下准备工作:

 # ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3
 # ln -s /usr/local/python3/bin/pip3.6 /usr/bin/pip3

以上命令是新建两个链接文件,用于方便进行解释器切换。由于Python3默认安装了pip工具,所以安装其它软件包就方便很多,Virtualenv工具就可以使用如下命令通过pip安装:

 # pip3 install virtualenv

前面提到过,Virtualenv会将系统默认的Python解释器复制到虚拟环境,其实就是通过”/usr/bin/python”来指定。如果想创建Python3的虚拟环境,那么先要把Python3修改为默认解释器。

 # cd /usr/bin
 # mv python python.bak
 # ln -s /usr/local/python3/bin/python3.6 /usr/bin/python

首先备份Python2的解释器,然后再将默认解释器修改为Python3,之后就可以进行虚拟环境的配置了,假设项目目录使用”/webroot”:

 # mkdir webroot
 # cd webroot
 # virtualenv --no-site-packages .env

命令中使用”–no-site-packages”参数是为了创建一个比较干净的运行环境,不会将已经安装的Python包一同复制过来,之后可以根据自己需要在虚拟环境中安装Python包。现在已经创建了一个名为”.env”的虚拟环境,使用以下命令进入和退出虚拟环境:

 # source .env/bin/activate
 (.env)# deactivate

可以看到,当进入虚拟环境时,命令提示符前会加入”(.env)”,也就是提示用户当前工作在虚拟环境中,当然这个虚拟环境只是针对Python而言,其它操作不会受到影响。

安装配置uwsgi服务器

uwsgi是wsgi(web服务网关接口)的具体实现,可以把它理解为一个web服务器程序。uwsgi本身是兼容Python2和Python3的,理论上在哪种环境下都可以安装,不过它需要一个系统依赖包”python-devel”,没有这个包就会安装不成功或者不能工作。CentOS 7由于官方软件库只有Python2的”python-devel”,所以导致在CentOS系统中使用uwsgi还是要在Python2环境下,更离谱的是CentOS的Python2是默认没有安装pip的,于是安装uwsgi就需要经过安装Python2 pip、安装uwsgi两个步骤,好在命令都不复杂,具体如下:

 # mv /usr/bin/python.bak /usr/bin/python
 # curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
 # python get-pip.py
 # yum install python-devel
 # pip install uwsgi
 # uwsgi --version

首先将默认Python解释器恢复为Python2,然后再安装pip和uwsgi,最后可以查看一下uwsgi的版本信息,确保安装成功。

现在就需要新建一个uwsgi的配置文件来设置uwsgi的工作,配置文件根据实际使用情况不尽相同,主要包含以下内容:调用的模块(一般是Python网站的脚本文件名)、模块中调用的程序(一般是Python脚本中的web框架对象,多为app,本文件使用的是Flask框架)以及程序执行的细节信息等,典型的配置示例如下:

 [uwsgi]
 chdir=/webroot
 home=/webroot/.env
 module=webapp
 callable=app
 master=true
 processes=2
 socket=%(chdir)/mysite.sock
 chmod-socket=666
 logfile-chmod=644
 daemonize=%(chdir)/uwsgi.log
 uid=nginx
 gid=nginx
 procname-prefix-spaced=webApp

按照以上的配置,会在”/webroot”目录中生成”mysite.sock”文件和”uwsgi.log”文件,同时需要目录中有一个名为”webapp.py”的Python脚本。此处将uwsgi配置成为http-socket方式,为的是之后同nginx配合使用,方便起见,将启动程序的用户也设置为nginx。一切配置完成后,就可以使用如下命令启动uwsgi服务器了:

 # uwsgi --ini uwsgi.ini

如上图所示,uwsgi已经按照设置的配置文件执行起来,一个主进程以及两个工作进程。如果不能启动,则需要查看uwsgi.log日志查找原因。最有可能出现的错误是”ImportError: No module named site”,这是由于虚拟环境中找不以适当的Python解释器,解决办法也很简单,就是在虚拟环境中运行pip3 install uwsgi即可。

配置Nginx代理uwsgi请求

uwsgi单独用作服务器稍显简陋,其执行效率也不如正规的web服务器来的把稳,所以当然要请著名的反向代理服务器Nginx出场啦。由nginx代理web请求,将请求转发给uwsgi,再将uwsgi响应反馈给用户,可以大大减轻uwsgi的并行压力。nginx对于wsgi标准也有良好的支持,想要反向代理wsgi服务器,则可以在配置文件中添加一个虚拟服务器,示例如下:

 server {
     listen       80;
     server_name  localhost;
 
     location / {
         try_files $uri @app;
     }
    
     location @app {
         include uwsgi_params;
         uwsgi_pass unix:/dataroot/webroot/webApp/mysite.sock;
     }

     # deny running scripts inside writable directories
     location ~* /(images|cache|media|logs|tmp)/.*\.(php|pl|py|jsp|asp|sh|cgi)$ {
             return 403;
             error_page 403 /403_error.html;
     }

     #error_page  404              /404.html;

     # redirect server error pages to the static page /50x.html
     error_page   500 502 503 504  /50x.html;
     location = /50x.html {
         root   /usr/share/nginx/html;
     }
 }

注意配置文件中的”uwsgi_pass”项要指向之前uwsgi工作时的”mysite.sock”文件,因为nginx要通过该文件同uwsgi通信,转发请求响应。

之后就可以通过浏览器访问nginx的服务器网址了,不出意外的话,就可以看到使用Flask框架开发的Python3网站了。

以上就是CentOS 7系统搭建Python3网站运行环境的全部过程,主要内容涉及Python版本切换、virtualenv虚拟运行环境、uwsgi服务器以及nginx反向代理,希望对大家有些帮助。

最后,就请开始你的表演!

发表评论

电子邮件地址不会被公开。 必填项已用*标注