A.6 系统创建与操作 FAQ
接下来是你在首次使用Scrapy工作时可能遇到的问题的解决方案。
A.6.1 我应该下载什么以及需要花费多少时间
当我们运行vagrant up --no-parallel之后,就没有那么多的可见度了。所经过的时间与我们的下载速度及网络连接质量密切相关。图A.8所示为当网络连接能力达到每秒下载5MB(38Mbit/s)内容时的期望时间。
图A.8
如果我们使用的是Linux环境,或是Docker已经被安装好,那么前三步就不是必要的,这样可以为我们节省4分钟的时间以及450MB的下载量。
请注意,上述所有步骤只与用于下载全部内容的vagrant up --no-parallel命令的第一次运行相关。后续运行在通常情况下只会花费不到10秒的时间。
A.6.2 如果Vagrant无法响应应该怎么办
可能会有很多原因导致Vagrant无法响应,我们所需要做的就是按下Ctrl + C两次从中退出。然后再次尝试vagrant up --no-parallel,此时应当能够恢复。我们可能需要这样做几次,这取决于网络连接的速度和质量。如果打开Windows Task Manager(Windows任务管理器)或Mac的Activity Monitor(活动监视器),可以更清晰地看到Vagrant正在做什么,如图A.9所示。
图A.9
在下载期间或之后不超过60秒的短暂无法响应是可以预期的,因为此时软件正在进行安装。而更长时间的无法响应则很有可能意味着出现了某些问题。
当我们中断后再恢复时,vagrant up --no-parallel可能会执行失败,并返回类似下面所述的错误信息。
Vagrant cannot forward the specified ports on this VM... The forwarded port to 21 is already in use on the host machine.
这同样是一个临时性的问题。如果我们再次运行vagrant up --no-parallel,则应该能够成功恢复。
假设我们见到了如下的失败信息。
... Command: "docker" "ps" "-a" "-q" "--no-trunc" Stderr: bash: line 2: docker: command not found
如果发生该情况,请按照下一个问题所显示的方法关闭并恢复虚拟机。
A.6.3 如何快速关闭/恢复虚拟机
当使用虚拟机时,最快的关闭方式是进入节能状态,具体来说就是打开VirtualBox,选择虚拟机,按下Ctrl+ V 或 Cmd + V,或右键单击菜单并选择Save State(保存状态),如图A.10所示。
图A.10
我们可以通过运行vagrant up --no-parallel恢复虚拟机。开发和Spark服务器的~/book目录都应该可以正常工作。
A.6.4 如何完全重置虚拟机
如果我们想要变更核心数量、内存大小或虚拟机的端口映射,则需要进行完全重置。为了达到该目的,我们仍然需要按照前一个答案的步骤操作,不过现在要选择的是Power Off(关闭电源),或者按下Ctrl + F或 Cmd + F。我们也能通过编程方式完成此事,其执行语句是vagrant global-status --prune。我们可以找到名为“docker-provider”的虚拟主机的ID(比如95d1234),然后使用vagrant halt停止它,比如vagrant halt 957d887。
然后,可以使用vagrant up --no-parallel重启系统。不过很遗憾的是,开发和Spark机器很可能已经清空了其~/book目录。要想解决该问题,可以运行vagrant destroy -f dev spark,然后重新运行vagrant up --no-parallel。这将解决此类问题。
A.6.5 如何调整虚拟机大小
我们可能想要改变虚拟机的大小,比如将使用的内存从2GB调整为1GB,将使用的8核调整为4核。我们可以通过编辑Vagrantfile.dockerhost的vb.memory及vb.cpus设置来进行调整。然后,按照上一个答案的流程完全重置虚拟机。
A.6.6 如何解决端口冲突
有时,在主机上运行的一些服务可能占用了该系统需要的端口。首先,请注意如果我们打开了这两个机器的Vagrantfile,请移除其中所有的forwarded_port语句,按照后面讲到的方法重置,此时仍然能够运行本书中的示例。我们可能刚好不太容易检查宿主机上这些端口运行的服务(通常通过Web浏览器)。
也就是说,我们可以通过重新映射冲突端口的方式更适当地解决冲突。让我们使用Web服务器9312端口的冲突作为示例。根据我们运行的是原生Linux还是虚拟机,过程会有些许不同。
Linux环境使用原生Docker
该问题将表现为如下所示的错误信息。
Stderr: Error: Cannot start container a22f...: failed to create endpoint web on network bridge: Error starting userland proxy: listen tcp 0.0.0.0:9312: bind: address already in use
打开Dockerfile,编辑Web服务器中forwarded_port语句的host值。之后,使用vagrant destroy web销毁Web服务器,并通过vagrant up web重启,如果问题发生在初始化加载阶段,则使用vagrant up --no-parallel恢复加载。
Windows或Mac环境使用虚拟机
此时,我们会得到不同的错误信息。
Vagrant cannot forward the specified ports on this VM, since they would collide... The forwarded port to 9312 is already in use on the host machine...
为了修复该问题,我们需要打开Vagrantfile.dockerhost,移除已有的包含端口号的行。然后在下面添加自定义端口转发语句,比如:config.vm.network “forwarded_port”, guest: 9312, host: 9316。此时将会修改为使用9316端口。接下来,按照“如何完全重置虚拟机”这一问题的答案流程重置虚拟机,一切又都会正常工作了。
A.6.7 如何隐藏在公司代理背后工作
有一些简单代理和TLS拦截代理。简单代理需要我们在请求到达互联网之前,转发到代理服务器上。它们可能需要权限验证,也可能不需要,不过无论哪种情况,我们需要使用的信息就是URL,该URL可以从我们的IT部门获取到。它大概形如http://user:pass@proxy.com:8080/。如果我们使用的是Linux,而不是虚拟机,很可能已经完全正确配置,不再需要进一步的调整。不过如果我们使用的是虚拟机,则需要使代理服务器在Vagrant、Docker provider VM、Ubuntu的APT下载以及Docker服务自身都应当可用。所有这些操作都已经在Vagrantfile.dockerhost中进行了处理,我们只需要移除定义proxy_url行的注释,并正确设置其值即可。
假设遇到了如下的SSL相关的问题。
SSL certificate problem: unable to get local issuer certificate ... If you'd like to turn off curl's verification of the certificate, use the -k (or --insecure) option.
无论是Vagrant还是部署的Docker,我们都很可能需要处理TLS拦截代理的问题。这种代理旨在以一种“中间人”的角色监控所有安全和不安全流量。它们代表我们执行https请求,在必要时验证证书;而我们执行到它们的https连接,验证它们的证书。我们的IT部门很可能会提供给我们一个证书,通常情况下是.crt文件的形式。我们将该文件的副本放到本书主目录下(Vagrantfile所在的目录)。接下来,按照前面例子设置proxy_url,然后更进一步取消掉定义crt_filename变量所在行的注释,将其值设置为我们的证书文件的名称。
A.6.8 如何连接Docker provider虚拟机
如果我们处于Linux环境中,并且没有使用虚拟机,那么我们的机器已经是Docker provider,此时无需做任何事情。如果我们使用的是虚拟机,那么可以通过运行vagrant global-status --prune得到Docker provider的ID,然后找到名为docker-provider的机器。我们可以在Linux或Mac环境中,使用别名的方式对其实现自动化。
$ alias provider_id="vagrant global-status --prune | grep 'docker- provider' | awk '{print \$1}'"
我们可以使用vagrant ssh <provider id>,或者在已设置别名的情况下使用vagrant ssh $(provider_id)来连接Docker provider。在这里是Ubuntu Trusty 64位虚拟机。
A.6.9 每个服务器使用了多少CPU/内存
如果我们使用了原生Docker,或者按照前一个答案描述的方法连接到了provider,那么可以通过docker stats,看到每台独立Docker容器所消耗的资源,如下所示。
$ docker ps --format "{{.Names}}" | xargs docker stats
图A.11所示为运行第11章代码时的示例输出,此时是Scrapyd从Web服务器集中下载的时间。
图A.11
A.6.10 如何查看Docker容器镜像的大小
如果我们使用了原生Docker,或者按照之前答案中看到的方法连接到了provider,那么可以使用如下命令查看Docker镜像大小。
$ docker images
本书的容器都是基于一个镜像,每个变体上安装的其他软件都很少。因此,我们看到的GB级的大小是虚拟大小,而不是真实占用的磁盘空间。如果我们想要查看镜像的构建层次以及个体大小,可以为很长的dockviz命令创建一个别名,然后按照如下所示进行使用。
$ alias dockviz="docker run --rm -v /var/run/docker.sock:/var/run/docker. sock nate/dockviz" $ dockviz images -t
A.6.11 当Vagrant无法响应时,如何重置系统
即使最终处于一个连Vagrant也无法重置的混乱状态,我们也可以对系统进行完全重置。我们可以在不重置虚拟主机的情况下做到这一点,当然这种方式需要花费一些时间来完成。我们所需要做的就是连接到docker provider机器,强行停止所有容器,移除它们的镜像,然后重启Docker。具体命令如下所示。
$ docker stop $(docker ps -a -q) $ docker rm $(docker ps -a -q) $ sudo service docker restart
也可以使用如下命令。
$ docker rmi $(docker images -a | grep "<none>" | awk "{print $3}")
我们使用这种方式移除了下载的所有Docker层内容,这就意味着下一次执行 vagrant up --no-parallel 时将会花费一些时间用于下载。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论