一、我们来装第一台Web服务器。现在我假设你用Nginx

 

执行以下命令

 

#cd /usr/ports/www/nginx
#make install

这样就可以了,安装时会弹出界面,让你选择需要安装的模块。perl,status之类的,你只需要用空格选择,然后把光标用TAB切换到OK,按下回车,等待编译完成就可以了。即便你是新装的空系统也没有关系,ports会自动下载安装需要的依赖软件。你去抽根烟,喝口水,回来nginx就装好了。

 

这很省事,不是吗?并且通过portsnap,你可以把所有软件更新到最新版,并重新编译更新到最新版,FreeBSD还会为你生成脚本文件,无缝重启。FreeBSD 7.4和FreeBSD9.0所使用的nginx版本并无不同。这比centos升级后,yum包并不跟着升级要好多了。哪怕你是个糟糕的系统管理员,只要你装好软件,用portsnap更新列表,然后用portmaster或portupgrade更新软件,就足够了。在我安装第一台freebsd webserver的时候,版本是7.4,nginx是0.7.X,现在FreeBSD还是7.4,nginx已经升级到1.0.10了。这在集群化管理的时候特别重要,你不需要为一个软件的bug,而登录到所有的服务器去重新编译或yum install,只要设定crontab自动执行就可以了。事实上,现在我的linux服务器上yum安装nginx还是0.7.X。这太恐怖了。你用linux,软件不会自动升级,你装的服务越多,你就越危险,因为你根本不知道在两年后,会有多少台服务器隐藏了应用软件的重大bug。

 

你需要配置两个文件以更好的使用nginx,说实话,我更喜欢lighttpd。不过,however,今天是用nginx讲解。

 

执行以下操作

 

#cd /etc/
#vi rc.conf


按o新起一行,加入
nginx_enable="YES"
:wq保存退出

#cd /usr/local/etc/nginx
#vi nginx.conf


修改这段如下

events {
        worker_connections    1024;
        use kqueue;#注意这里的系统调用方法。
}


保存退出,并执行
#/usr/local/etc/rc.d/nginx start

然后就去访问你的80端口吧,无论人品好不好,你都会看见Welcome to Nginx

 

注意:不要尝试在BSD下使用epoll,因为BSD不是linux,虽然有很多入门者以为这两个系统是一样的,但是其实他们并不是一个东西。FreeBSD下与epoll性能相当的,叫kqueue。

 

当你用到其他的软件在Linux下使用epoll调用的,都不要使用,而要改成kqueue去做,web server方面可能会使用的还包括lighttpd,varnish等。这部分需要注意一下。

 

二、加入动态程序。

 

光有webserver是不够了,还需要动态程序去完成用户的处理。一般最常用的包括jsp,php,perl,ruby等。java因为版权问题安装比较复杂,我们放到以后再讲。现在讲php的安装

 

#cd /usr/port/lang/php5
#make install clean

选择你的安全选项,等待完成,然后?就完成了,用nginx的话,我建议你选上fpm选项。

 

在我写这篇文章的时候,php版本是5.3.8。安装php的时候,你会发现,可选择的东西很少,很多扩展都没有,我想用socket扩展,这可怎么办?没关系,FreeBSD把绝大部分扩展放到了另一个路径,我们要保证php最简洁,效率最高。

 

#cd /usr/ports/lang/php5-extension
#make install clean
------本段由fsck_y提供------

如果你选择了GD,会编译一堆的X11依赖库文件,如果你不需要,可以执行以下命令
#make WITHOUT_11=YES install clean

----------------------------

选择你需要的扩展,等待完成即可。可能有些扩展你想要,比如redis,但安装的时候没有,怎么办。是这样,ports是按照应用程序的功能进行分类,并归档在不同的文件夹下。查找软件,有两种方法完成。

 

方法1.
#find /usr/ports/ -name "*redis*"
结果中会出现php5-redis,这就是你需要的
方法2.

#cd /usr/ports/
#make search key="redis"

但目录不尽相同,支持php5的会放在php5-*路径下,支持任意版本的,放在pecl-*路径下,支持php4的放在php4-*路径下,支持php5.2的,放在php52-*路径下。不过php52现在已经不支持升级了。所以,还是用php5系列的比较好,现在的版本是5.3.8

 

与nginx相同,你也需要配置一下rc.conf

 

#vi /etc/rc.conf
加入
php_fpm_enable="YES"
保存退出
#/usr/local/etc/rc.d/php-fpm start

完成,然后nginx挂接php fastcgi的配置就自己找资料,然后去看你的第一个phpinfo页面吧。

 

总结:通过以上两个案例,我们得到一些规律:

 

1.FreeBSD的应用软件都放在/usr/ports/

2.FreeBSD的软件安装只需进入ports目录执行make install clean

3.软件安装后,配置文件全部保存在/usr/local/etc/

4.所有的启动脚本都在/usr/local/etc/rc.d/

5.你安装任何软件后,都需要在/etc/rc.d里加入*_enable="YES"才可以通过脚本进行启动。

6.任何软件都无需Kill进程,只要执行/usr/local/etc/rc.d/xxx restart即可。

 

补充说明两点:

1.如果你安装完直接运行可执行文件提示没有,请先运行一下rehash

2.如果你任何时间想修改软件的安装配置,请到该软件的ports路径下执行make config。

3.如果你以前安装过,并没有卸载,想重新强制编译安装,请到该软件ports路径下,执行make FORCE_PKG_REGISTER="YES" reinstall clean

 

一、Mysql

 

让我们重复以前的操作

 

#cd /usr/ports/
#find ./ -name "mysql*"

会出来不少路径,数据库,英文database,所以在结果中我们只需要去databases下安装就可以了。这个路径下,除了mysql4.1,5.0,5.1,5.5之外,还有很多其他的mysql相关的工具程序。以下以mysql55为例。

 

请根据你的应用来选择不同的版本,不过一般建议是5.0以上。那么,FreeBSD把Mysql分成了两部分,server和client,你可以只安装client,如果你这台服务器只是单纯的php server,用来连接查询其他的server,那么仅安装client就够了,如果你希望把完整的数据库安装在这上面,那么请进入mysql55-server里面去执行make install。然后?喝茶去。不过注意一下,我这里用的是make install,而不是make install clean。这是因为我们需要用到源码中的配置文件,也就是my.cnf。所以我们选择编译后不删除源码。

 

#cd /usr/ports/databases/mysql55-server
#make install

然后执行以下命令

 

#cd /usr/ports/mysql55-server/work/mysql-5.5.17/support-files/
#mkdir /var/db/mysql
#cp my-innodb-heavy-4G.cnf.sh /var/db/mysql/my.cnf

打开/var/db/mysql/my.cnf
找到两处@MYSQL_UNIX_ADDR@和@MYSQL_UNIX_ADDR@
修改为3306和/tmp/mysql.sock
@MYSQL_UNIX_ADDR@ ==> 3306
@MYSQL_UNIX_ADDR@ ==> /tmp/mysql.sock
保存退出
打开/etc/rc.conf
加入mysql_enable="YES"
保存退出,然后执行
#/usr/local/etc/rc.d/mysql_server start

启动后可以用mysql命令进行连接,但是这时是没有密码的,请自行grant root密码。至于参数优化,另开文章说,在这里不做说明,这里只讲解安装步骤。

 

当然,你也可以用这个步骤安装PostgreSQL。

 

二、Nosql

 

1.Redis

 

#cd /usr/ports/databases/redis
#make install clean

redis是我最喜欢的key-value数据库,所以我把它放在了第一位,超快速的存取,方便的键值操作,用redis甚至可以做出非常方便的FIFO或FILO队列。目前我已知使用redis的项目包括著名的github和新浪微博。且支持Master-Slave架构。

 

2.mongoDB

 

#cd /usr/ports/databases/mongodb
#make install clean

mongoDB是一个非常棒的文档型数据库,适合存储大量的数据。自身带分布式的文件系统GridFS。

 

其他的数据库的安装都可以到/usr/ports/databases下找,就不一一写出来了。

 

忘了一点,管理数据库,推荐安装phpMyAdmin,管理mysql很方便。

 

#cd /usr/ports/databases/phpmyadmin
#make install clean

然后到/usr/local/www下去寻找phpMyAdmin的php文件,并访问url进行管理。

 

二、lighttpd

 

剩下的篇幅想介绍一下我很喜欢的一款webserver,在国内的知名度并不如apache和nginx高,但是就其性能而言,并不比nginx差,有些甚至比nginx还要好。以前做过一个测试,lighttpd在挂载php-fpm的情况下,性能要比nginx高出大约6-7%。这就已经很可观了。lighttpd在国外有比较高的知名度,且据我所知有个大公司一直在使用,这个大公司在国内被屏蔽了,但是提起他的名字,国内的人不会陌生,很多人都努力FQ在上这个网站,这个网站就是Youtube。

 

官方网站的详细评测在http://www.lighttpd.net/benchmark,有兴趣的可以看看。

 

安装很简单

 

#cd /usr/ports/www/lighttpd
#make install clean
#echo 'lighttpd_enable="YES" >> /etc/rc.conf'
#/usr/local/etc/rc.d/lighttpd start

安装的时候,如无需要,不要选择valgrind和spawn-cgi。

 

很多人都认为lighttpd是个单进程多路复用的server,其实并不是这样的。lighttpd里面有个隐藏的参数,是开启多进程的。但是这个参数没有默认写在lighttpd.conf中,所以很多人不知道,以为lighttpd在linux下是单进程epoll方式,但其实不是这样的。

 

我们来配置lighttpd,我不会把所有的配置都贴在这里,只摘出我认为比较重要的配置放出来

 

#cd /usr/local/etc/lighttpd/
#cp lighttpd.conf.sample lighttpd.conf
#vi lighttpd.conf

#找到
server.port=80
#在下面加一句
server.max-worker=4
#好了,多进程开启了
#找到server.event-handler
#将后面改成freebsd-kqueue,如果是linux,我记得是linux-epoll

如果需要挂接php,执行以下步骤

 

#vi /usr/local/etc/lighttpd/modules.conf
#找fastcgi.conf,找到后,将include "conf.d/fastcgi.conf"前面的注释去掉,保存退出
#vi /usr/local/etc/lighttpd/conf.d/fastcgi.conf


改成下面这样就可以了

fastcgi.server = ( ".php" =>
#                                     ( "php-local" =>
#                                         (
#                                             "socket" => socket_dir + "/php-fastcgi-1.socket",
#                                             "bin-path" => server_root + "/cgi-bin/php5",
#                                             "max-procs" => 1,
#                                             "broken-scriptfilename" => "enable",
#                                         )
#                                     ),
                                     ( "php-tcp" =>
                                         (
                                             "host" => "127.0.0.1",
                                             "port" => 9000,
                                             "check-local" => "disable",
                                             "broken-scriptfilename" => "enable",
                                         )
                                     ),
#
#                                     ( "php-num-procs" =>
#                                         (
#                                             "socket" => socket_dir + "/php-fastcgi-2.socket",
#                                             "bin-path" => server_root + "/cgi-bin/php5",
#                                             "bin-environment" => (
#                                                 "PHP_FCGI_CHILDREN" => "16",
#                                                 "PHP_FCGI_MAX_REQUESTS" => "10000",
#                                             ),
#                                             "max-procs" => 5,
#                                             "broken-scriptfilename" => "enable",
#                                         )
#                                     ),
                                )

一般不推荐使用unix://这种方式,能够承载的压力比较小。还是用跟nginx一样的方式比较好。而且现在php已经自带fastcgi了,不再需要生成spawn-cgi了。然后去写你的phpinfo()看看结果吧。