大家好,今天来为大家分享php网站源码分享上传虚拟主机的一些知识点,和php网站源码分享上传虚拟主机怎么弄的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
【编者的话】本文作者是Geoffrey,他是一个PHP的Web开发者,喜欢DevOps和Docker。本文主要介绍了如何使用Docker构建PHP的开发环境,文中作者也探讨了构建基于Docker的开发环境应该使用单容器还是多容器,各有什么利弊。推荐PHP开发者阅读。
现在很多开发者都使用Vagrant来管理他们的虚拟机开发环境,Vagrant确实很酷,不过也有不少缺点(最主要的是它占用太多的资源)。在容器技术、Docker和更多类Docker技术出现后,解决这个问题就变得简单了。
由于boot2docker的工作方式,本文所述的方法在你的环境中可能无法正常运行。如果需要在非Linux环境下共享文件夹到Docker容器,还需要注意更多额外的细节。后续我会写篇文章专门来介绍实际遇到的问题。
怎样才算是好的开发环境
首先,我们得知道什么才是好的开发环境,对于我而言,一个好的开发环境需要具备以下几个特点:
可随意使用。我必须可以随意删除和创建新的环境。快速启动。我想要用它工作时候,它立马就能用。易于更新。在我们行业中,事物发展变化非常快,必须能让我很容易将我的开发环境更新到新的软件版本。
而Docker都支持以上这些特点,甚至更多。你几乎可以即时销毁和重建容器,而更新环境只需要重建你当前使用的镜像即可。
什么是PHP开发环境
目前Web应用错综复杂,PHP开发环境需要很多的东西,为了保证环境的简单性,需要做各种各样的限制。我们这次使用Nginx、PHP5-FPM、MySQL来运行Synmfony项目。由于在容器中运行命令行会更复杂,所以这方面的内容我会放到下一篇博客中再说。
Pet与Cattle
另一个我们要讨论的重点是:我们要把开发环境部署在多容器还是单容器中。两种方式各有优点:
单容器易于分发、维护。因为它们是独立的,所有的东西都运行在同一个容器中,这点就像是一个虚拟机。但这也意味着,当你要升级其中的某样东西(比如PHP新版本)的时候,需要重新构建整个容器。多容器可以在添加组件时提供更好的模块化。因为每个容器包含了堆栈的一部分:Web、PHP、MySQL等,这样可以单独扩展每个服务或者添加服务,并且不需要重建所有的东西。
因为我比较懒,加上我需要在我的笔记本上放点别的内容,所以,这里我们只介绍单个容器的方法。
初始化工程
首先要做的是初始化一个新的Symfony工程.推荐的方法是用composer的create-project命令。本来可以在工作站上安装composer,但是那样太简单了。这次我们通过Docker来使用它。
我之前发过一篇关于Docker命令的文章:makedockercommands(好吧,我说谎了,我本来把它写在这篇文章中了,然后觉得把它独立出来会比较好)。
不管怎么样,你可以读一下。接下来如果还没有composer命令的话,你可以创建一个属于自己的composer别名。
$?alias?composer=”docker?run?-i?-t?-v?\\$PWD:/srv?ubermuda/composer”\n
现在你可以初始化Symfony工程了:
$?composer?create-project?symfony/framwork-standard-edition?SomeProject\n
帅呆了!下面来点实在的工作。(省略了博主自娱自乐的一堆balabla….原文:Awesome.Giveyourselfahigh-five,getacupofcoffeeorwhateverisyourliquiddrugofchoice,andgetreadyfortherealwork.)
容器
构建一个运行标准Symfony项目且自给自足的容器相当容易,只需要安装好常用的Nginx、PHP5-FPM和MySQL-Server即可,然后把预先准备好的Nginx的虚拟主机配置文件扔进去,再复制一些配置文件进去就完事了。
本容器的源代码在GitHub上的ubermuda/docker-symfony仓库中可以找到。Dockerfile是Docker构建镜像要用到的配置文件,我们来看一下:
FROM?debian:wheezy\n\nENV?DEBIAN_FRONTEND?noninteractive\n\nRUN?apt-get?update?-y\nRUN?apt-get?install?-y?nginx?php5-fpm?php5-mysqlnd?php5-cli?mysql-server?supervisor\n\nRUN?sed?-e?’s/;daemonize?=?yes/daemonize?=?no/’?-i?/etc/php5/fpm/php-fpm.conf\nRUN?sed?-e?’s/;listen\\.owner/listen.owner/’?-i?/etc/php5/fpm/pool.d/www.conf\nRUN?sed?-e?’s/;listen\\.group/listen.group/’?-i?/etc/php5/fpm/pool.d/www.conf\nRUN?echo?”\\ndaemon?off;”?>>?/etc/nginx/nginx.conf\n\nADD?vhost.conf?/etc/nginx/sites-available/default\nADD?supervisor.conf?/etc/supervisor/conf.d/supervisor.conf\nADD?init.sh?/init.sh\n\nEXPOSE?80?3306\n\nVOLUME?[“/srv”]\nWORKDIR?/srv\n\nCMD?[“/usr/bin/supervisord”]\n
我们通过扩展debian:wheezy这个基础镜像开始,然后通过一系列的sed命令来配置Nginx和PHP5-FPM。
RUN?sed?-e?’s/;daemonize?=?yes/daemonize?=?no/’?-i?/etc/php5/fpm/php-fpm.conf\nRUN?sed?-e?’s/;listen\\.owner/listen.owner/’?-i?/etc/php5/fpm/pool.d/www.conf\nRUN?sed?-e?’s/;listen\\.group/listen.group/’?-i?/etc/php5/fpm/pool.d/www.conf\nRUN?echo?”\\ndaemon?off;”?>>?/etc/nginx/nginx.conf\n
这里我们要做两件事。首先配置PHP5-FPM和Nginx让他们在前台运行以便supervisord可以追踪到他们。然后,配置PHP5-FPM以指定的用户运行Web-Server,并处理好文件权限。
接下来需要安装一组配置文件,首先是Nginx的虚拟主机配置文件vhost.conf:
server?{\n????listen?80;\n\n????server_name?_;\n\n????access_log?/var/log/nginx/access.log;\n????error_log?/var/log/nginx/error.log;\n\n????root?/srv/web;\n????index?app_dev.php;\n\n????location?/?{\n????????try_files?$uri?$uri/?/app_dev.php?$query_string;\n????}\n\n????location?~?[^/]\\.php(/|$)?{\n????????fastcgi_pass?unix:/var/run/php5-fpm.sock;\n????????include?fastcgi_params;\n????}\n}\n
因为我们不需要域名,所以把server_name设成了_(有点像perl的$_占位符变量),并配置根目录(documentroot)为/svr/web,我们会把应用程序部署在/srv下,剩下的就是标准的Mginx+PHP5-FPM配置.
因为一个容器每次只能运行一个程序,我们需要supervisord(或者任何别的进程管理器,不过我比较中意supervisord)。幸运的是,这个进程管理器会产生我们需要的所有进程!下面是一小段supervisord的配置:
[supervisord]\nnodaemon=true\n\n[program:nginx]\ncommand=/usr/sbin/nginx\n\n[program:php5-fpm]\ncommand=/usr/sbin/php5-fpm\n\n[program:mysql]\ncommand=/usr/bin/mysqld_safe\n\n[program:init]\ncommand=/init.sh\nautorestart=false\nredirect_stderr=true\nredirect_stdout=/srv/app/logs/init.log\n
这里我们需要做的是定义所有的服务,加上一个特殊的program:init进程,它不是一个实际的服务,而是一个独创的运行启动脚本的方式。
这个启动脚本的问题在于,它通常需要先启动某些服务。比如,你可能要初始化一些数据库表,但前提是你得先把MySQL跑起来,一个可能的解决办法是,在启动脚本中启动MySQL,然后初始化表,然后为了防止影响到supervisord的进程管理,需要停掉MySQL,最后再启动supervisord。
这样的脚本看起来类似下面这样:
/etc/init.d/mysql?start\napp/console?doctrine:schema:update?–force\n/etc/init.d/mysql?stop\n\nexec?/usr/bin/supervisord\n
看起来丑爆了有木有,咱换种方式,让supervisor来运行它并且永不重启。实际的init.sh脚本如下:
#!/bin/bash\n\nRET=1\n\nwhile?[[?RET?-ne?0?]];?do\n????sleep?1;\n????mysql?-e?’exit’?>?/dev/null?2>&1;?RET=$?\ndone\n\nDB_NAME=${DB_NAME:-symfony}\n\nmysqladmin?-u?root?create?$DB_NAME\n\nif?[?-n?”$INIT”?];?then\n????/srv/$INIT\nfi\n
脚本先等待MySQL启动,然后根据环境变量DB_NAME创建DB,默认为symfony,然后在INIT环境变量中查找要运行的脚本,并尝试运行它。本文的结尾有说明如何使用这些环境变量。
转载本文请遵循原文要求。
文章到此结束,如果本次分享的php网站源码分享上传虚拟主机和php网站源码分享上传虚拟主机怎么弄的问题解决了您的问题,那么我们由衷的感到高兴!
