欢迎,来自IP地址为:18.97.14.80 的朋友
Python什么都好,就是版本依赖性太高,Python2和Python3居然不兼容,造成各自的解释器不能执行对方的脚本,真的感觉有点扯。好在Python2和Python3是可以在系统中共存的,可以根据脚本的开发环境来适配相应的解释器。本文将详细讲解如何在CentOS 7系统中搭建Python3网站运行环境,主要内容包括:
源代码安装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反向代理,希望对大家有些帮助。
最后,就请开始你的表演!