本文以 FreeBSD 7.0 为基础环境,系统自带的工具链虽然版本较旧,但胜在稳定可靠。所有软件统一安装至 /usr/local/vhost 目录下,如需更换路径,请同步修改后续所有相关目录。
一、下载源代码
首先通过 Ports 树拉取源码,这样能够自动处理版本依赖关系。依次执行以下命令:
cd /usr/ports/databases/mysql50-server/ make fetch cd /usr/ports/www/nginx-devel/ make fetch cd /usr/ports/lang/php5 make fetch cd /usr/ports/www/lighttpd make fetch
二、编译安装
MySQL
cd /usr/ports/distfiles/ tar -jxf mysql-5.0.51a.tar.gz cd mysql-5.0.51a ./configure --prefix=/usr/local/vhost/mysql --with-charset=utf8 --with-extra-charsets=all --with-big-tables --with-pthread make && make install
Nginx
Nginx 依赖 PCRE 正则库,请先安装它:
cd /usr/ports/devel/pcre make install clean cd /usr/ports/distfiles/ tar -jxf nginx-0.6.30.tar.gz cd nginx-0.6.30 ./configure --prefix=/usr/local/vhost/nginx --with-http_ssl_module --with-http_gzip_static_module --with-http_stub_status_module --with-http_sub_module make && make install
Lighttpd
Lighttpd 仅用于获取 spawn-fcgi 工具,以便启动 PHP 的 FastCGI 进程。配置完成后可将其删除以节省磁盘空间。
cd /usr/ports/distfiles/ tar -jxf lighttpd-1.4.19.tar.bz2 cd lighttpd-1.4.19 ./configure --prefix=/usr/local/vhost/lighttpd make && make install
PHP
编译 PHP 之前需要先安装几个依赖库:libxml2、curl、jpeg、png、gettext 等。请逐一执行安装:
cd /usr/ports/textproc/libxml2 make install clean cd /usr/ports/ftp/curl make install clean cd /usr/ports/graphics/jpeg make install clean cd /usr/ports/graphics/png make install clean cd /usr/ports/devel/gettext make install clean
接着开始编译 PHP 本身,务必要开启 FastCGI 支持:
cd /usr/ports/distfiles/ tar -jxf php-5.2.6.tar.bz2 cd php-5.2.6 ./configure --prefix=/usr/local/vhost/php --with-mysql=/usr/local/vhost/mysql -enable-fastcgi --enable-sockets --enable-ftp --enable-zip --enable-mbstring --enable-mbregex --enable-calendar --with-curl=/usr/local/include --with-curlwrappers --disable-debug --enable-inline-optimization --with-zlib --with-gd --with-kerberos --with-gettext --enable-force-cgi-redirect --with-jpeg-dir=/usr/local/include --with-png-dir=/usr/local/include --with-bz2 --enable-pcntl --with-iconv make && make install cp php.ini-dist /usr/local/vhost/php/lib/php.ini
三、配置
MySQL
首先创建 MySQL 专用用户,初始化数据库,并设置启动脚本:
cd /usr/local/vhost/mysql pw adduser mysql -d /dev/null -s /sbin/nologin bin/mysql_install_db cp share/mysql/mysql.server ./ chmod +x mysql.server chown -R mysql ./
然后启动 MySQL 服务:
/usr/local/vhost/mysql/mysql.server start
配置 Nginx
先创建 web 用户,并将 Lighttpd 编译生成的 spawn-fcgi 复制至 Nginx 目录,之后即可彻底删除 Lighttpd:
cd /usr/local/vhost/nginx/ pw adduser webuser -d /dev/null -s /sbin/nologin cp /usr/local/vhost/lighttpd/bin/spawn-fcgi ./sbin/ rm -rf /usr/local/vhost/lighttpd
编写一个用于启动 PHP FastCGI 的脚本 sbin/php.sh:
#!/bin/sh /usr/local/vhost/nginx/sbin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 8 -u webuser -f /usr/local/vhost/php/bin/php-cgi
赋予脚本执行权限:
chmod +x sbin/php.sh
启动 PHP 解析器:
sbin/php.sh
接下来配置 Nginx 以支持 PHP 解析。新建一个 conf/enable_php 文件:
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/vhost/nginx/html$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
}
编辑 conf/nginx.conf,写入基础配置。注意这里使用 FreeBSD 特有的 kqueue 事件模型:
user webuser webuser;
worker_processes 1;
events {
worker_connections 4096;
use kqueue;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] $request '
# '"$status" $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
client_max_body_size 5m;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
gzip on;
gzip_min_length 1100;
gzip_buffers 4 8k;
gzip_types text/plain;
output_buffers 1 32k;
postpone_output 1460;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
send_lowat 12000;
keepalive_timeout 75 20;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.php index.html index.htm;
}
if (-d $request_filename){
rewrite ^/(.*)([^/])$ https://$host/$1$2/ permanent;
}
location /nginx_status {
stub_status on;
access_log off;
}
include enable_php;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
测试 Nginx 配置是否正确:
sbin/nginx -t 2008/05/08 11:50:19 [info] 3336#0: the configuration file /usr/local/vhost/nginx/conf/nginx.conf syntax is ok 2008/05/08 11:50:19 [info] 3336#0: the configuration file /usr/local/vhost/nginx/conf/nginx.conf was tested successfully
编写一个简单的 PHP 探针用于验证:
vi html/phpinfo.php
启动 Nginx:
/usr/local/vhost/nginx/sbin/nginx
在浏览器中访问 https://192.168.29.128/phpinfo.php,如果一切顺利,即可看到 PHP 信息页面。
安装配置 phpMyAdmin
为了方便管理 MySQL 数据库,再安装一次 phpMyAdmin:
cd /usr/ports/databases/phpmyadmin/ make fetch cd /usr/ports/distfiles tar -jxf phpMyAdmin-2.11.6-all-languages.tar.bz2 mv phpMyAdmin-2.11.6-all-languages /usr/local/vhost/nginx/html/dbadmin
此时 MySQL 的 root 用户尚未设置密码,可直接通过 https://192.168.29.128/dbadmin/index.php 登录管理。强烈建议立即为 root 设置一个强密码,避免暴露在公网时产生安全风险。
