BlueXIII's Blog

热爱技术,持续学习

0%

内网环境下Python3应用部署

简介

最近在用Python写一些东西,各种第三方库好用极了,写起来也是非常酸爽,但生产环境部署上却略有些繁琐。
主要原因是公司的生产环境主机,大都是在内网中的,无法直连Internet,首先要花点力气搞定网络连接问题。
另外操作系统也基本上是RedHat,只预装了Python2.7,yum源中也没有3.X,只能通过源码编译的方式安装。如果是Debian系的,就不会这么麻烦了。

HTTP代理服务器搭建

要搞定网络连接,最简单的办法还是找一台能出得去的主机,搭一个HTTP代理服务。
这里我选择了srelay+polipo的组合。Srelay用于搭建Socks5代理,Polipo用于将Socks5端口转为HTTP端口。
PS:当然,还可以使用redsocks+polipo的组合,直接默翻墙,使用yum时可以快很多。

使用srelay搭建简易Socks5代理

我们先找一台可以直连外网的主机,注意要新建一个用户,不要以root直接操作。

官网地址:
http://socks-relay.sourceforge.net
下载srelay-0.4.8b6.tar.gz

解压后直接make即可,将编译出的二进制文件srelay随便找一个目录扔进去

启动:

1
./srelay -i xxx.xxx.xxx.xxx:31080  

无须配置,直接在启动时直接绑定IP+端口,注意IP一定要绑定内网的那个。

使用polipo将Socks5代理转为Http代理

下载地址:
https://www.irif.fr/~jch/software/polipo/polipo.html

解压后,修改一下Makefile,将PREFIX改为实际安装目录

1
2
3
4
5
6
7
vi Makefile
PREFIX = /path/to/your/app
BINDIR = $(PREFIX)/bin
MANDIR = $(PREFIX)/man
INFODIR = $(PREFIX)/info
LOCAL_ROOT = $(PREFIX)/www
DISK_CACHE_ROOT = $(PREFIX)/cache

然后直接make && make install即可

新建一个config文件

1
2
3
4
5
vi config
socksParentProxy = "xxx.xxx.xxx.xxx:31080"
socksProxyType = socks5
proxyAddress = "0.0.0.0"
proxyPort = 31081

其中socksParentProxy是Socks的IP+端口,proxyPort是新开的HTTP端口

启动:

1
nohup ./polipo -c config

环境变量设置

现在回到Python3所在的主机,设置一个http_proxy环境变量,指向刚才所搭建的IP:端口

1
export http_proxy="http://xxx.xxx.xxx.xxx:31081"

这时wget、yum等已经可以正常使用了

配置yum使用163的源(可选)

有时可能需要用yum安装一些依赖,配置成163的源会速度快一些

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
wget http://mirrors.163.com/centos/6/os/x86_64/Packages/python-iniparse-0.3.1-2.1.el6.noarch.rpm
wget http://mirrors.163.com/centos/6/os/x86_64/Packages/yum-metadata-parser-1.1.2-16.el6.x86_64.rpm
wget http://mirrors.163.com/centos/6/os/x86_64/Packages/python-urlgrabber-3.9.1-11.el6.noarch.rpm
wget http://mirrors.163.com/centos/6/os/x86_64/Packages/yum-3.2.29-73.el6.centos.noarch.rpm
wget http://mirrors.163.com/centos/6/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.30-37.el6.noarch.rpm\

rpm -qa | grep yum | xargs rpm -e --nodeps
rpm -ivh python-iniparse-0.3.1-2.1.el6.noarch.rpm
rpm -ivh yum-metadata-parser-1.1.2-16.el6.x86_64.rpm
rpm -ivh python-urlgrabber-3.9.1-11.el6.noarch.rpm --force
rpm -ivh yum-3.2.29-73.el6.centos.noarch.rpm yum-plugin-fastestmirror-1.1.30-37.el6.noarch.rpm

wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
yum clean all
yum makecache

源码方式安装python3

现在开始,万事俱备,可以编译安装python了。需要使用root权限操作。

首先,在官网下载最新的3.6源码:
https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz

安装过程没有什么特别的,缺少依赖时可以直接yum安装

1
2
3
4
wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz
tar -zxcf Python-3.6.0.tgz
./configure
make && make install

源码方式安装完成后,已经是包含pip3的了,不用再单独安装了。

让pip走代理

pip3可以通过使用--proxy参数来走代理,在这里我们为了方便,直接建一个alias,以后使用pip时,就不需要再添加参数了。

1
2
3
alias pip3="pip3 --proxy 134.32.32.13:31081"
export http_proxy=134.32.32.13:31081
export https_proxy=134.32.32.13:31081

安装依赖

大部分依赖可以直接通过pip3安装:

1
2
3
4
pip3 install requests
pip3 install beautifulsoup4
pip3 install mysql-connector
pip3 install fdfs_client-py

某些模块,比如FastDFS客户端,不能直接使用pip3安装,需要下载源码后并手工修改一些代码,操作过程大致如下:

1
2
3
4
5
git clone https://github.com/jefforeilly/fdfs_client-py.git
cd dfs_client-py
vi ./fdfs_client/storage_client.py
将第12行 from fdfs_client.sendfile import * 注释掉
python3 setup.py install

至此,环境搭建完毕,可以将python代码扔上去跑起来了。