部署python项目到linux服务器
<p>最近用Python写了个外挂,需要部署到Linux环境的服务器上,由于之前本地开发时使用virtualenv,使用这个虚拟环境有个好处是项目中依赖的库不会是全局的,只在当前项目的目录下有效,因为我是Mac系统,virtualenv环境下的库文件和linux上所需要的库不通用,所以不能简单的将整个env拷贝到服务器运行,需要做一些额外的工作。</p><p>一般每个不同的项目都会依赖各自的库,有些库的版本不一样会引起冲突,为了解决这个问题,需要使用虚拟环境,Python可以在每个项目目录下创建各自的虚拟环境,项目所依赖的包就在环境目录下,这样避免了库版本的冲突,也方便相同操作系统间可以快速的拷贝项目运行。</p>
<p>我使用的是Python3编写的项目,CentOS 7的服务器上只有Python2,所以需要先安装一下Python3的环境</p>
<h2 id="第一步:安装Python3环境">第一步:安装Python3环境</h2>
<p>1.首先安装编译环境(后续需要从python官网获取Python3的源码自己编译python)</p>
<table>
<tbody>
<tr>
<td class="gutter">
<pre><span class="line">1<br data-filtered="filtered"></span></pre>
</td>
<td class="code">
<pre><span class="line">yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make<br data-filtered="filtered"></span></pre>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p>2.从官网下载python3的源码</p>
<table>
<tbody>
<tr>
<td class="gutter">
<pre><span class="line">1<br data-filtered="filtered"></span></pre>
</td>
<td class="code">
<pre><span class="line">wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tar.xz<br data-filtered="filtered"></span></pre>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p>3.依次执行 解压>进入解压后的目录>编译安装</p>
<table>
<tbody>
<tr>
<td class="gutter">
<pre><span class="line">1<br data-filtered="filtered"><span class="line">2<br data-filtered="filtered"><span class="line">3<br data-filtered="filtered"><span class="line">4<br data-filtered="filtered"></span></span></span></span></pre>
</td>
<td class="code">
<pre><span class="line">tar -xvJfPython-3.6.2.tar.xz<br data-filtered="filtered"><span class="line">cd Python-3.6.2<br data-filtered="filtered"><span class="line">./configure prefix=/usr/local/python3<br data-filtered="filtered"><span class="line">make && make install<br data-filtered="filtered"></span></span></span></span></pre>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p>4.安装完毕,创建软连接</p>
<table>
<tbody>
<tr>
<td class="gutter">
<pre><span class="line">1<br data-filtered="filtered"><span class="line">2<br data-filtered="filtered"><span class="line">3<br data-filtered="filtered"><span class="line">4<br data-filtered="filtered"><span class="line">5<br data-filtered="filtered"></span></span></span></span></span></pre>
</td>
<td class="code">
<pre><span class="line">ln -s /usr/<span class="built_in">local/python3/bin/python3 /usr/bin/python<br data-filtered="filtered"><span class="line"><span class="comment"># 执行命令<br data-filtered="filtered"><span class="line">python -V <span class="comment">#将会看到python3的版本<br data-filtered="filtered"><span class="line"><span class="comment"># 执行命令<br data-filtered="filtered"><span class="line">python2 -V <span class="comment">#将会看到python2的版本<br data-filtered="filtered"></span></span></span></span></span></span></span></span></span></span></pre>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p>5.后续工作,由于执行CentOS的yum命令需要使用自带的python2的版本,所以需要做两处修改</p>
<table>
<tbody>
<tr>
<td class="gutter">
<pre><span class="line">1<br data-filtered="filtered"><span class="line">2<br data-filtered="filtered"><span class="line">3<br data-filtered="filtered"></span></span></span></pre>
</td>
<td class="code">
<pre><span class="line">vim /usr/bin/yum<br data-filtered="filtered"><span class="line">vim /usr/libexec/urlgrabber-ext-down<br data-filtered="filtered"><span class="line"><span class="comment">#将 这两个文件的 #! /usr/bin/python修改为 #! /usr/bin/python2<br data-filtered="filtered"></span></span></span></span></pre>
</td>
</tr>
</tbody>
</table>
<p> </p>
<h2 id="第二步:将本地开发环境的依赖项目生成清单文件">第二步:将本地开发环境的依赖项目生成清单文件</h2>
<p>1.在本地的开发环境中,env下执行:</p>
<table>
<tbody>
<tr>
<td class="gutter">
<pre><span class="line">1<br data-filtered="filtered"></span></pre>
</td>
<td class="code">
<pre><span class="line">pip3 freeze >requirements.txt<br data-filtered="filtered"></span></pre>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p>清单文件将会生成在当前项目目录下,内容如下所示</p>
<table>
<tbody>
<tr>
<td class="gutter">
<pre><span class="line">1<br data-filtered="filtered"><span class="line">2<br data-filtered="filtered"><span class="line">3<br data-filtered="filtered"><span class="line">4<br data-filtered="filtered"><span class="line">5<br data-filtered="filtered"></span></span></span></span></span></pre>
</td>
<td class="code">
<pre><span class="line">certifi==2018.4.16<br data-filtered="filtered"><span class="line">chardet==3.0.4<br data-filtered="filtered"><span class="line">idna==2.7<br data-filtered="filtered"><span class="line">requests==2.19.1<br data-filtered="filtered"><span class="line">urllib3==1.23<br data-filtered="filtered"></span></span></span></span></span></pre>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p>将生成后的文件上传到linux服务器</p>
<p>2.将Python项目上传到服务器</p>
<table>
<tbody>
<tr>
<td class="gutter">
<pre><span class="line">1<br data-filtered="filtered"></span></pre>
</td>
<td class="code">
<pre><span class="line"><span class="comment">#略...<br data-filtered="filtered"></span></span></pre>
</td>
</tr>
</tbody>
</table>
<p> </p>
<h2 id="第三步:在linux服务器上为项目创建虚拟环境,并安装项目所需的依赖">第三步:在linux服务器上为项目创建虚拟环境,并安装项目所需的依赖</h2>
<p>1.切换到pip3所在的目录 /usr/local/python/bin,执行以下命令</p>
<table>
<tbody>
<tr>
<td class="gutter">
<pre><span class="line">1<br data-filtered="filtered"><span class="line">2<br data-filtered="filtered"><span class="line">3<br data-filtered="filtered"><span class="line">4<br data-filtered="filtered"><span class="line">5<br data-filtered="filtered"><span class="line">6<br data-filtered="filtered"><span class="line">7<br data-filtered="filtered"><span class="line">8<br data-filtered="filtered"><span class="line">9<br data-filtered="filtered"><span class="line">10<br data-filtered="filtered"><span class="line">11<br data-filtered="filtered"><span class="line">12<br data-filtered="filtered"><span class="line">13<br data-filtered="filtered"><span class="line">14<br data-filtered="filtered"><span class="line">15<br data-filtered="filtered"><span class="line">16<br data-filtered="filtered"><span class="line">17<br data-filtered="filtered"></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
</td>
<td class="code">
<pre><span class="line"><span class="comment"># 安装虚拟环境<br data-filtered="filtered"><span class="line">pip3 install virtualenv<br data-filtered="filtered"><span class="line"><br data-filtered="filtered"><span class="line"><span class="comment"># 创建虚拟环境 ENV<br data-filtered="filtered"><span class="line">virtualenv ENV<br data-filtered="filtered"><span class="line"><br data-filtered="filtered"><span class="line"><span class="comment"># 切换到虚拟环境所在的目录<br data-filtered="filtered"><span class="line"><span class="built_in">cd ENV<br data-filtered="filtered"><span class="line"><br data-filtered="filtered"><span class="line"><span class="comment"># 启用虚拟环境<br data-filtered="filtered"><span class="line"><span class="built_in">source ./bin/activate<br data-filtered="filtered"><span class="line"><br data-filtered="filtered"><span class="line"><span class="comment"># 安装依赖清单里的库<br data-filtered="filtered"><span class="line">pip3 install -r requirements.txt<br data-filtered="filtered"><span class="line"><br data-filtered="filtered"><span class="line"><span class="comment"># 列出当前虚拟环境所安装的依赖库<br data-filtered="filtered"><span class="line">pip3 list<br data-filtered="filtered"></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
</td>
</tr>
</tbody>
</table>
<p> </p>
<h2 id="第四步:添加自定义系统服务(很重要)">第四步:添加自定义系统服务(很重要)</h2>
<table>
<tbody>
<tr>
<td class="gutter">
<pre><span class="line">1<br data-filtered="filtered"><span class="line">2<br data-filtered="filtered"></span></span></pre>
</td>
<td class="code">
<pre><span class="line"><span class="comment"># 这样的命令在ssh终端退出后,python进程也会被杀掉<br data-filtered="filtered"><span class="line">python xxx.py &<br data-filtered="filtered"></span></span></span></pre>
</td>
</tr>
</tbody>
</table>
<p>需要创建一个自定义的系统服务,来保证python程序能够在后台运行。</p>
<p>1.创建系统服务</p>
<table>
<tbody>
<tr>
<td class="gutter">
<pre><span class="line">1<br data-filtered="filtered"></span></pre>
</td>
<td class="code">
<pre><span class="line">vim /usr/lib/systemd/system/robot.service<br data-filtered="filtered"></span></pre>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p>内容如下:</p>
<table>
<tbody>
<tr>
<td class="gutter">
<pre><span class="line">1<br data-filtered="filtered"><span class="line">2<br data-filtered="filtered"><span class="line">3<br data-filtered="filtered"><span class="line">4<br data-filtered="filtered"><span class="line">5<br data-filtered="filtered"><span class="line">6<br data-filtered="filtered"><span class="line">7<br data-filtered="filtered"><span class="line">8<br data-filtered="filtered"><span class="line">9<br data-filtered="filtered"><span class="line">10<br data-filtered="filtered"><span class="line">11<br data-filtered="filtered"></span></span></span></span></span></span></span></span></span></span></span></pre>
</td>
<td class="code">
<pre><span class="line"><br data-filtered="filtered"><span class="line">Description=robot<br data-filtered="filtered"><span class="line">After=network.target<br data-filtered="filtered"><span class="line"> <br data-filtered="filtered"><span class="line"><br data-filtered="filtered"><span class="line">Type=forking<br data-filtered="filtered"><span class="line">ExecStart=/usr/local/python3/bin/ENV/bin/python /usr/local/python3/bin/ENV/p3.py &<br data-filtered="filtered"><span class="line">PrivateTmp=true<br data-filtered="filtered"><span class="line"> <br data-filtered="filtered"><span class="line"><br data-filtered="filtered"><span class="line">WantedBy=multi-user.target<br data-filtered="filtered"></span></span></span></span></span></span></span></span></span></span></span></pre>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p>ExecStart为服务启动时执行的命令,不能用相对路径, 一定要全路径。<br data-filtered="filtered">这里也可以将命令写到任意的.sh文件中,这里写.sh文件的全路径也是可以的。</p>
<p>2.启用自定义系统服务</p>
<table>
<tbody>
<tr>
<td class="gutter">
<pre><span class="line">1<br data-filtered="filtered"></span></pre>
</td>
<td class="code">
<pre><span class="line">systemctl <span class="built_in">enable robot<br data-filtered="filtered"></span></span></pre>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p>3.启动服务</p>
<table>
<tbody>
<tr>
<td class="gutter">
<pre><span class="line">1<br data-filtered="filtered"></span></pre>
</td>
<td class="code">
<pre><span class="line">systemctl start robot<br data-filtered="filtered"></span></pre>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p>可以查看进程,确认一下服务是否启动</p>
<table>
<tbody>
<tr>
<td class="gutter">
<pre><span class="line">1<br data-filtered="filtered"></span></pre>
</td>
<td class="code">
<pre><span class="line">ps aux|grep robot<br data-filtered="filtered"></span></pre>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p>完毕!</p>
</div>
<div id="MySignature" role="contentinfo">
学习时的痛苦是暂时的 未学到的痛苦是终生的<br><br>
来源:https://www.cnblogs.com/grimm/p/11104562.html
頁:
[1]