如何在本地和真实的Linode服务器上设置Python和virtualenv?

5 投票
2 回答
1926 浏览
提问于 2025-04-18 10:43

我在Windows上使用PyCharm,想更好地了解如何设置本地环境,以便能尽可能顺利地迁移到我的Linode服务器(或者其他Linux服务器)。

我有一个专门用于开发的物理硬盘。在我的情况下,这个硬盘是Z:

我通常会为每个项目创建一个目录。这里的项目指的是一个完整的网站。

目前,我还选择在Z:\virtualenv目录下创建我的虚拟环境。每个项目一个虚拟环境。我想多个项目可以共享同一个虚拟环境,但我不确定这样做在开发或生产中是否明智。

我考虑过让每个项目的虚拟环境放在对应的项目文件夹里。这样做我觉得不错,因为每个项目就会是一个整体。例如,如果我们在PyCharm中讨论Flask应用:

d    z:\flask_app
d         .git
d         .idea
d         static
d         templates
d         virtualenv
          main.py

那么,基于以上内容,如何设置生产服务器呢?

假设我们使用一台机器通过虚拟主机托管多个网站,其中之一是:

<VirtualHost *:80>
  ServerAdmin you@example.com

  ServerName   example.com
  ServerAlias  example.com *.example.com
  DocumentRoot /var/www/example/public_html
  ErrorLog     /var/www/example/logs/access.log
  CustomLog    /var/www/example/logs/error.log combined

  <Directory   /var/www/example>
        Options Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
  </Directory>
</VirtualHost>

我是在服务器的全局级别设置虚拟环境吗?我觉得答案是肯定的。否则就没法工作了。我想是这样。

好的,这意味着在

z:\flask_app

下面的整个文件结构现在可以通过FTP上传到

/var/www/example/public_html

上,网站就可以正常运行了?

我知道数据库服务器、数据库、表等需要在生产机器上设置,以便与之匹配。我只是专注于Python和虚拟环境如何从桌面开发环境迁移到外部Linux生产环境。

我想我必须在服务器根目录级别使用虚拟环境,以便启用这个虚拟环境,对吧?这方面我有点模糊。大多数教程都详细讲解了本地开发环境,但很少涉及项目迁移到生产服务器的过程、设置以及与开发环境的持续关系。

我将使用一台运行Ubuntu 14.04 LTS的虚拟机来解决这个问题,继续前进。

我还考虑在虚拟机上使用14.04桌面版进行开发,以便拥有匹配的环境,并摆脱Windows。

2 个回答

1

想想看,你的Git仓库应该包含项目的源代码、数据文件和其他与开发相关的文件。它不应该包含虚拟环境,因为虚拟环境里有可执行文件(比如Python和pip)、头文件以及从不同来源安装的依赖项。你应该能够轻松地清除一个虚拟环境并重新构建它。

虽然你可以把源代码和虚拟环境放在同一个目录里,但无论如何你都需要更新你的.gitignore文件,这说明把虚拟环境放在其他地方更合理。这里并不是说要把整个目录通过FTP传到另一个地方,而是要把更新代码和设置虚拟环境这两个概念分开(因为虚拟环境里可能安装了和你开发机器上不同的包)。

举个例子,你可能在Windows机器上开发,但要部署到Linux机器上,这样就可能使用不同的包。因此,把“项目源代码”和“运行所需的依赖和配置”分开是很重要的。

同样,在生产服务器上,你可以为虚拟环境指定一个位置,所有项目(它们的代码可以放在你选择的目录结构中)都会激活虚拟环境然后运行。其实没有绝对的对错,只要每个过程都有足够的权限去做它该做的事情。

根据你希望在部署中自动化的程度,你至少应该考虑自动化一些步骤,以确保一切正常。主要是设置目录结构、权限、从git检出代码、设置虚拟环境、安装依赖以及其他配置来让事情正常运作。比如,你可以用Ansible来完成这些任务。

总的来说,最好不要把你的应用程序看作一个整体,因为随着时间的推移,某些东西可能会移动到其他地方。静态文件?它们可能有一天需要转移到内容分发网络。数据库安装?可能有一天需要迁移到另一台机器上。等等。

3

1) 在一个14.04的桌面虚拟机上随便玩玩,先把事情弄明白,然后再把它们转到脚本和服务器命令行上,这个主意非常不错。

2) 你可能会喜欢这个叫做 virtualenvwrapper 的工具。它几乎完全符合你现在的工作流程,还提供了一些方便的功能(这就是它的目的)。它基本上是一个集中管理虚拟环境的文件夹,可以给不同的环境起不同的名字(或文件夹)。它最实用的命令是 mkproject(创建一个新文件夹和同名的虚拟环境)和 workon(激活那个名字的项目)。

3) 幸运的是,14.04的版本不算太旧,里面已经有一个比较新的虚拟环境工具 python-virtualenv(1.11.4)。我建议你安装这个,然后用它在你的服务器上创建环境来运行Python项目,正如你所提到的。

那么,这是否意味着可以把...下面的整个文件结构通过FTP传到...,然后网站就可以正常运行了?

不行,因为你试图把一个在Windows机器上创建的虚拟环境转移到Linux/Ubuntu上的Python环境中,希望它能正常工作,这样是不行的。

4) 为了管理每个项目需要安装的包,可以把它们列在一个 requirements.txt 文件中。然后在激活一个新的虚拟环境后,你只需运行 pip install -r requirements.txt,所有需要的包就会被安装。

5) 如果你想在同一个服务器上运行你的应用,我建议你使用一个本地的WSGI服务器,比如 Chaussette(也许可以在 Circus 下运行)或者 uWSGI,它可以在本地端口或Unix套接字下托管你的Python WSGI应用;然后配置Apache或Nginx,把所有需要的动态流量反向代理到那个服务器上(可以参考 这个SO的回答作为例子)。

6) 如果你有一些基本的bash脚本知识,会对你有很大帮助,特别是当事情需要重复启动的时候 :) 如果情况更复杂,你可以使用像 Salt 这样的配置管理工具。

撰写回答