从零搭建lnmp环境

之前在大厨网写的环境搭建教程,粘在博客里备份一下~

在执行以下步骤前请确保自己的机器中有ruby的环境

ruby --version

1.下载virtualbox并安装

https://www.virtualbox.org/wiki/Downloads

2.下载vagrant,这里我们使用的版本是1.7.2,并安装

https://www.vagrantup.com/downloads.html

下面是一些vagrant的介绍:

虚拟开发环境

平常我们经常会遇到这样的问题:在开发机上面开发完毕程序,放到正式环境之后会出现各种奇怪的问题:描述符少了、nginx配置不正确、MySQL编码不对、php缺少模块、glibc版本太低等。

所以我们就需要虚拟开发环境,我们虚拟和正式环境一样的虚拟开发环境,而随着个人开发机硬件的升级,我们可以很容易的在本机跑虚拟机,例如VMware、VirtualBox等。因此使用虚拟化开发环境,在本机可以运行自己喜欢的OS(Windows、Ubuntu、Mac等),开发的程序运行在虚拟机中,这样迁移到生产环境可以避免环境不一致导致的莫名错误。

虚拟开发环境特别适合团队中开发环境、测试环境、正式环境不同的场合,这样就可以使得整个团队保持一致的环境。

Vagrant

Vagrant就是为了方便的实现虚拟化环境而设计的,使用Ruby开发,基于VirtualBox等虚拟机管理软件的接口,提供了一个可配置、轻量级的便携式虚拟开发环境。使用Vagrant可以很方便的就建立起来一个虚拟环境,而且可以模拟多台虚拟机,这样我们平时还可以在开发机模拟分布式系统。

Vagrant还会创建一些共享文件夹,用来给你在主机和虚拟机之间共享代码用。这样就使得我们可以在主机上写程序,然后在虚拟机中运行。如此一来团队之间就可以共享相同的开发环境,就不会再出现类似“只有你的环境才会出现的bug”这样的事情。

团队新员工加入,常常会遇到花一天甚至更多时间来从头搭建完整的开发环境,而有了Vagrant,只需要直接将已经打包好的package(里面包括开发工具,代码库,配置好的服务器等)拿过来就可以工作了,这对于提升工作效率非常有帮助。

Vagrant不仅可以用来作为个人的虚拟开发环境工具,而且特别适合团队使用,它使得我们虚拟化环境变得如此的简单,只要一个简单的命令就可以开启虚拟之路。

3.添加一个官方镜像站已有的box

vagrant box add  box_name //这个参数是可选的,http://www.vagrantbox.es/是一份可以下载的镜像列表,比如我们这里使用官方库里的ubuntu镜像,ubuntu/trusty64
[实际执行命令vagrant box add ubuntu/trusty64]

或者也可以

vagrant box add box_name url

的格式来添加其它的box

会开始下载ubuntu的镜像,下载成功后

执行

vagrant box list

可以看到刚才添加的box

执行

vagrant init box_name

即在当前目录下建立了Vagrantfile文件,在该目录下运行vagrant up

将会以之前添加到vagrant box list里的名为box_name的box为基准,建立一个virtualbox的虚拟机,并初始化虚拟机内的实际环境

因为直接使用curl下载会比较慢,推荐使用wget -c的方式自行下载镜像,之后再使用指定本地url的方式添加box

注意!!!!!!!!!!!不要使用迅雷下载镜像,很可能导致box添加出错(想知道为什么的可以来问我cao1988228@163.com)

4.Vagrantfile配置文件详解

在我们的开发目录下有一个文件Vagrantfile,里面包含有大量的配置信息,主要包括三个方面的配置,虚拟机的配置、SSH配置、Vagrant的一些基础配置。Vagrant是使用Ruby开发的,所以它的配置语法也是Ruby的,但是我们没有学过Ruby的人还是可以跟着它的注释知道怎么配置一些基本项的配置。

4.1.box设置

config.vm.box = "base"

上面这配置展示了Vagrant要去启用那个box作为系统,也就是上面我们输入vagrant init Box名称时所指定的box,如果沒有输入box名称的話,那么默认就是base,VirtualBox提供了VBoxManage这个命令行工具,可以让我们设定VM,用modifyvm这个命令让我们可以设定VM的名称和内存大小等等,这里说的名称指的是在VirtualBox中显示的名称,我们也可以在Vagrantfile中进行设定,在Vagrantfile中加入如下这行就可以设定了:

config.vm.provider "virtualbox" do |v|
    v.customize ["modifyvm", :id, "--name", "astaxie", "--memory", "512"]
end

这行设置的意思是调用VBoxManage的modifyvm的命令,设置VM的名称为astaxie,内存为512MB。你可以类似的通过定制其它VM属性来定制你自己的VM。

4.2.网络设置

Vagrant有两种方式来进行网络连接,一种是host-only(主机模式),意思是主机和虚拟机之间的网络互访,而不是虚拟机访问internet的技术,也就是只有你一個人自High,其他人访问不到你的虚拟机。另一种是Bridge(桥接模式),该模式下的VM就像是局域网中的一台独立的主机,也就是说需要VM到你的路由器要IP,这样的话局域网里面其他机器就可以访问它了,一般我们设置虚拟机都是自high为主,所以我们的设置一般如下:

config.vm.network :private_network, ip: "11.11.11.11"

这里我们虚拟机设置为hostonly,并且指定了一个IP,IP的话建议最好不要用192.168..这个网段,因为很有可能和你局域网里面的其它机器IP冲突,所以最好使用类似11.11..这样的IP地址。

4.3.hostname设置

hostname的设置非常简单,Vagrantfile中加入下面这行就可以了:

config.vm.hostname = "dachu"

设置hostname非常重要,因为当我们有很多台虚拟服务器的时候,都是依靠hostname來做识别的,例如Puppet或是Chef,都是通过hostname來做识别的,既然设置那么简单,所以我们就別偷懒,设置一个。

4.4.同步目录

我们上面介绍过/vagrant目录默认就是当前的开发目录,这是在虚拟机开启的时候默认挂载同步的。我们还可以通过配置来设置额外的同步目录:

config.vm.synced_folder  "/Users/cherry/vagrant/data", "/vagrant_data"

上面这个设定,第一个参数是主机的目录,第二个参数是虚拟机挂载的目录

4.5.端口转发设置

以上步骤完成后,修改Vagrantfile,搜索forward,可以找到端口转发的设置样例,完成我们的8080到80,3000到3000的转发过程
例如

config.vm.network "forwarded_port", guest: 80, host: 80

guest指的是虚拟机内的端口,host指宿主机的端口
修改完成后,重启vagrant

ps.因为mac对端口转发的特殊限制,需要把80端口转发到8080,再在vagrant里从宿主的8080转到80,才能完成整个过程,
所以在mac里的配置应该是这样的

config.vm.network "forwarded_port", guest: 80, host: 8080

在mac上还需要配置80转到8080,可以采取下面的方法
打开apache2配置文件(默认应该都有安装,没有的话,请先安装apache2)

/etc/apache2/httpd.conf

在文件末尾添加转发配置:

<VirtualHost *:80>
    ProxyPreserveHost On
    ProxyRequests Off
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
</VirtualHost>

重启apache2

apachectl stop
apachectl start

修改完Vagrantfile的配置后,记得要用vagrant reload命令来重启VM之后才能使用VM更新后的配置

5.vagrant ssh进入虚拟机环境,现在可以开始安装lnmp开发所需要的环境

sudo apt-get install -y nginx php5 php5-cli php5-fpm php5-mysql memcached php5-gd php5-curl
    php5-memcache php5-mcrypt git language-pack-zh-hant language-pack-zh-hans zsh mysql-server mysql-client

在安装mysql时应该会弹出输入root密码的界面

mysql安装好之后

mysql -uroot -p你的密码进入mysql终端

创建用户

create user '用户名'@'localhost' identified by '密码';

授予全部权限

grant all privileges on *.* to '用户名'@'localhost';

下面就可以用上述的用户和密码连入本地数据库了

5.安装全部完成之后,输入

sudo php5enmod mcrypt

否则在开发时可能会提示找不到mcrypt模块

6.配置nginx

这个还是直接拷贝现有的配置吧,主要包括/etc/nginx目录下的

fastcgi_params(这个文件里设置了nginx解析php脚本时把脚本交到哪里处理),
      转发主要是这一句:
      fastcgi_pass  unix:/var/run/php5-fpm.sock;=> 这个与/etc/php5/fpm/pool.d/www.conf里的listen选项是对应的

nginx.conf(这个文件中包含了一些master/worker进程数的设置,运行时pid文件储存路径,是否使用epoll(仅限linux),gzip压缩,另外用include把site-enabled目录下的文件include进来)

site-enabled目录,这个目录下实际上是一些指向site-available目录下的软链接

site-available里是具体的设置

配置文件修改完成之后

sudo service nginx restart //重启nginx

7.使用php --ini可以查看到php5-cli的php.ini文件所在路径

因为nginx使用php5-fpm来解析php脚本,其php.ini文件实际是在/etc/php/fpm/目录下,修改该php.ini,将display_errors改为On

重启php-fpm

sudo service php5-fpm restart

8.我们的nginx的配置文件里把文档root设置为/data/www/dachuwang,所以可以进入/data/www,克隆dachuwang仓库的代码

之后请参照git的工作流程

9.配置hosts

下载switchhosts客户端,拷贝其他人的配置,或者自己手工把虚拟域名指向127.0.0.1

10.配置zsh和vim

zsh配置,參考這裡

https://github.com/cch123/prezto

vim配置,參考這裡

https://github.com/wklken/k-vim

]

10.下面是一步到位法,

因为配置好vagrant后可以用vagrant package命令直接将运行环境完整打包到指定的box,因此可以直接从别人那里拷贝Vagrantfile和box文件,即可得到完整的运行环境

实际上如果网络条件允许的话,我们可以直接修改Vagrantfile来支持以上一切操作,但因为网速受限,目前只能选择大部分运行工具已经被打包好的方式来分发开发环境

假如Vagrantfile和box文件都在当前目录下,执行

vagrant box add dachuwang(虚拟机的名字,随便定义) ./package.box

即可

11.有时vagrant使用私钥认证会遇到authentication failure,怎么办?

修改Vagrantfile,添加

config.ssh.username = "vagrant"
config.ssh.password = "vagrant"
重新vagrant即可~
Xargin

Xargin

If you don't keep moving, you'll quickly fall behind
Beijing