Gentoo 下搭建 Nginx+ MySQL + PHP (fastcgi) 环境

安装 Nginx

* 一条命令搞定:

USE=fastcgi emerge nginx

* 新建用户和组:

groupadd www

useradd www -g www

Nginx 安装好后默认会添加 nginx 组和 nginx 用户,不过我本身还是习惯新建个 www 组和 www 用户来做 HTTP 服务用户。若今后 HTTP 服务器更换为 apache 或是 lighttpd 时,用户名和用户组可以不变。

安装 MySQL

在装 PHP 前必须先装 MySQL,因为 PHP 里的 MySQL 操作函数需要 MySQL 头文件和库的支持。

emerge dev-db/mysql

* 初始化数据库:

我不习惯把数据库安装在默认路径 /var/lib/mysql 中,我把它放在 /work/db/3306/data 中。

mkdir -p /work/db/3306/data

mysql_install_db –basedir=/usr –datadir=/work/db/3306/data –user=mysql

* 修改配置文件:

vim /etc/mysql/my.cnf

将 datadir 修改为:

datadir = /work/db/3306/data

* 启动 MySQL:

/etc/init.d/mysql start

* 修改 root 密码:

mysqladmin -uroot password hily

* 测试数据库:

mysql -uroot -p

显示:

gentoo setup # mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.0.84-log Gentoo Linux mysql-5.0.84-r1

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql>

测试成功!

安装 PHP

以 fastcgi 方式来运行 PHP,需要安装 PHP-FPM

目前最后一个需要以 patch 形式安装 PHP-FPM 的 PHP 版本是 5.3.0,PHP 5.3.2 版本中将可能直接集成 PHP-FPM。

这里我就使用 PHP 5.3.0 来安装。

因为 Gentoo 中目录还没有集成 PHP-FPM 的 Portage,所以下面直接通过源码编译形式进行安装。

* 下载 PHP 5.3.0:

wget http://cn.php.net/distributions/php-5.3.0.tar.bz2

* 下载 PHP-FPM 补丁:

wget http://php-fpm.org/downloads/php-5.3.0-fpm-0.5.12.diff.gz

* 解压 PHP 并打 FPM 补丁:

tar jxf php-5.3.0.tar.bz2

gzip -cd php-5.3.0-fpm-0.5.12.diff.gz | patch -d php-5.3.0 -p1

* 安装 PHP 需要的库(根据自身需要):

emerge libpng

emerge jpeg

emerge freetype

USE=”png jpeg truetype” emerge gd

或者直接:

USE=”png jpeg truetype” emerge gd

* 配置并编译 PHP(根据自身需要):

cd php-5.3.0

./configure –prefix=/usr/local/php –with-config-file-path=/usr/local/php/etc –with-mysql=/usr –with-mysqli=/usr/bin/mysql_config –enable-fpm –enable-sockets –enable-pdo –with-pdo-mysql=/usr –with-gd –with-jpeg-dir –with-png-dir –with-freetype-dir –with-zlib

make && make install

* PHP 配置文件:

cp php.ini-production /usr/local/php/etc/php.ini

* PHP-FPM 配置文件:

vim /usr/local/php/etc/php-fpm.conf

修改 listen_address 为 socket 地址(socket 比 IP:Port 高效):

<value name=”listen_address”>/tmp/php-fpm.sock</value>

修改用户组和用户名:

Unix user of processes
<value name=”user”>www</value>

Unix group of processes
<value name=”group”>www</value>

修改 PHP-FPM 运行模式为 Apache-Like 模式:

<value name=”style”>apache-like</value>
<value name=”StartServers”>1</value>
<value name=”MinSpareServers”>1</value>
<value name=”MaxSpareServers”>5</value>

StartServers、MinSpareServers 和 MaxSpareServers 根据实际需要设置,我这里是虚拟机,没必要太大。

* PHP-FPM 启动脚本:

cp /usr/local/php/sbin/php-fpm /etc/init.d/php-fpm

* 启动 PHP-FPM

/etc/init.d/php-fpm start

添加启动服务

rc-update add nginx default

rc-update add mysql default

rc-update add php-fpm default

测试 Nginx+PHP

* 添加测试站点目录:

mkdir -p /work/www/test

echo “<?php phpinfo(); ?>” > /work/www/test/index.php

* 添加测试站点的 Nginx 配置:

vim /etc/nginx/nginx.conf

注释掉 server 段,在 http 段尾部加上:

include sites/*.enable;

之后每个站点的配置文件都以一个独立的文件保存在 /etc/nginx/sites 目录下,方便管理和维护。

mkdir /etc/nginx/sites

vim /etc/nginx/test.enable

test.enable 配置如下:

server {
listen       80;
server_name  test.local;

access_log  /work/www/logs/test.access.log  main;
error_log  /work/www/logs/test.error.log;

location / {
root   /work/www/test;
index  index.html index.htm index.php;
}

location ~ \.php$ {
root           /work/www/test;
fastcgi_index  index.php;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
include        fastcgi_params;
fastcgi_pass   unix:/tmp/php-fpm.sock;
}
}

* 新建存储日志目录:

mkdir /work/www/logs

* 本地 hosts 中添加记录:

192.168.1.10    test.local

192.168.1.10 是我这台 Gentoo 机器的 IP。

* 重新加载 Nginx 配置

/etc/init.d/nginx reload

* 访问:

http://test.local/

显示正常的 phpinfo 信息,则安装完成!

— EOF —

emerge glib 出错

emerge glib 时出错:

gconvert.c:55:2: error: #error GNU libiconv not in use but included iconv.h is from libiconv
make[4]: *** [gconvert.lo] Error 1
make[4]: Leaving directory `/var/tmp/portage/dev-libs/glib-2.20.5-r1/work/glib-2.20.5/glib’
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory `/var/tmp/portage/dev-libs/glib-2.20.5-r1/work/glib-2.20.5/glib’
make[2]: *** [all] Error 2
make[2]: Leaving directory `/var/tmp/portage/dev-libs/glib-2.20.5-r1/work/glib-2.20.5/glib’
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/var/tmp/portage/dev-libs/glib-2.20.5-r1/work/glib-2.20.5′
make: *** [all] Error 2
*
* ERROR: dev-libs/glib-2.20.5-r1 failed.
* Call stack:
* ebuild.sh, line 49: Called src_compile
* environment, line 3004: Called _eapi2_src_compile
* ebuild.sh, line 634: Called die
* The specific snippet of code:
* emake || die “emake failed”
* The die message:
* emake failed
*
* If you need support, post the topmost build error, and the call stack if relevant.
* A complete build log is located at ‘/var/tmp/portage/dev-libs/glib-2.20.5-r1/temp/build.log’.
* The ebuild environment file is located at ‘/var/tmp/portage/dev-libs/glib-2.20.5-r1/temp/environment’.
*

>>> Failed to emerge dev-libs/glib-2.20.5-r1, Log file:

>>> ‘/var/tmp/portage/dev-libs/glib-2.20.5-r1/temp/build.log’

* Messages for package dev-libs/glib-2.20.5-r1:

*
* ERROR: dev-libs/glib-2.20.5-r1 failed.
* Call stack:
* ebuild.sh, line 49: Called src_compile
* environment, line 3004: Called _eapi2_src_compile
* ebuild.sh, line 634: Called die
* The specific snippet of code:
* emake || die “emake failed”
* The die message:
* emake failed
*
* If you need support, post the topmost build error, and the call stack if relevant.
* A complete build log is located at ‘/var/tmp/portage/dev-libs/glib-2.20.5-r1/temp/build.log’.
* The ebuild environment file is located at ‘/var/tmp/portage/dev-libs/glib-2.20.5-r1/temp/environment’.
*

试用低版本:
emerge =glib-2.20.5
依旧出错。

官方 bug 系统有人说是 make.conf 中 CHOST 设置错误的问题:
http://bugs.gentoo.org/276536
不过我检查我的 make.conf,没有发现问题。

最后还是自己来分析错误原因:
gconvert.c:55:2: error: #error GNU libiconv not in use but included iconv.h is from libiconv

网上找到一种说法:

这是因为你的系统里有两种iconv。

你可以先用:./configure –help |grep conv
–enable-iconv-cache=[yes/no/auto]
cache iconv descriptors [default=auto]
–with-libiconv=[no/gnu/native]
use the libiconv library

然后./configure –enable-iconv=no –with-libiconv=gnu
make
make install

测试一下:
export EXTRA_ECONF=’–with-libiconv=gnu’; emerge glib

编译通过!

— EOF —

Gentoo 安装记录

晚上在虚拟机上重新装了下 gentoo,用了当前最新版的 gentoo,把安装过程记录下来备用。

下载安装包

下载安装 CD 和 stage3 包:

http://www.gentoo.org/main/en/where.xml

我用的是 amd64 平台的:

http://mirrors.kernel.org/gentoo/releases/amd64/autobuilds/current-iso/

wget http://mirrors.kernel.org/gentoo/releases/amd64/autobuilds/current-iso/install-amd64-minimal-20091203.iso

wget http://mirrors.kernel.org/gentoo/releases/amd64/autobuilds/current-iso/stage3-amd64-20091203.tar.bz2

wget http://distfiles.gentoo.org/snapshots/portage-20100116.tar.bz2

开始安装

将安装 CD 插入虚拟机,引导后进入命令行。

先配置好网络,之后的操作可以全部通过 ssh 连接来操作。

ifconfig eth0 192.168.1.12/24
route add default gw 192.168.1.1
echo nameserver 192.168.1.1 > /etc/resolv.conf

设置 root 用户密码:

passwd

启动 sshd 服务:

/etc/init.d/sshd start

用 SecureCRT 连接:

image

磁盘分区

fdisk /dev/sda

分区如下:

Disk /dev/sda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x3df1b937

nano -w /etc/fstab
/dev/sda1 /boot ext2 noauto,noatime 1 2
/dev/sda3 / ext3 noatime 0 1
/dev/sda2 none swap sw 0 0

格式化分区:

mke2fs /dev/sda1
mke2fs -j /dev/sda3
mkswap /dev/sda2

启动交换分区:

swapon /dev/sda2

解压 stage3 和 portage

创建基本目录结构:

mount /dev/sda3 /mnt/gentoo
mkdir /mnt/gentoo/boot
mount /dev/sda1 /mnt/gentoo/boot
cd /mnt/gentoo

使用 SecureFX 上传 stage3 包到 /mnt/gentoo,然后解压:

tar jxf stage3-amd64-20091203.tar.bz2
rm -f stage3-amd64-20091203.tar.bz2

上传 portage 包到 /mnt/gentoo/usr,然后解压:

tar jxf portage-20100116.tar.bz2
rm -f portage-20100116.tar.bz2

切换系统

cd /
mount -t proc proc /mnt/gentoo/proc
mount -o bind /dev /mnt/gentoo/dev
cp -L /etc/resolv.conf /mnt/gentoo/etc/
chroot /mnt/gentoo /bin/bash
env-update && source /etc/profile

主机域名设置

cd /etc
echo "127.0.0.1 gentoo.at.home gentoo localhost" > hosts
sed -i -e ‘s/HOSTNAME.*/HOSTNAME="gentoo"/’ conf.d/hostname
hostname gentoo

编译安装内核

lsmod

找到网卡驱动模块:

floppy 55736 0
rtc 7960 0
tg3 103228 0
libphy 24952 1 tg3
e1000 114636 0
fuse 59344 0
jfs 153104 0
raid10 20648 0

下载源码,配置内核:

emerge gentoo-sources
cd /usr/src/linux
make menuconfig

在配置界面输入/,搜索 e1000,找到驱动所在位置:

| Symbol: E1000 [=y]
| Prompt: Intel(R) PRO/1000 Gigabit Ethernet support
| Defined at drivers/net/Kconfig:1997
| Depends on: NETDEVICES && NETDEV_1000 && PCI
| Location:
| -> Device Drivers
| -> Network device support (NETDEVICES [=y])
| -> Ethernet (1000 Mbit) (NETDEV_1000 [=y])

虚拟机的硬盘使用的 SCSI 适配器为 LSI Logic。

需要增加对 Fusion MPT base driver 的支持(见 dmesg 日志):

— Fusion MPT device support
<*> Fusion MPT ScsiHost drivers for SPI
<*> Fusion MPT ScsiHost drivers for FC
<*> Fusion MPT ScsiHost drivers for SAS
(128) Maximum number of scatter gather entries (16 – 128)
<*> Fusion MPT misc device (ioctl) driver

必须添加这个驱动,否则系统启动时可能出现类似以下错误:

VFS: Unable to mount root fs via NFS, trying floppy.
VFS: Cannot open root device “sda3”or unknown-block(2,0)
Please append a correct “root=” boot option; here are the available partitions:
0b00        1048575 sr0 driver: sr
Kernel panic – not syncing: VFS: Unable to mount root fs on unknown-block(2,0)

增加对 ext2 文件系统的支持:

<*> Second extended fs support
[*] Ext2 extended attributes
[*] Ext2 POSIX Access Control Lists
[*] Ext2 Security Labels
[*] Ext2 execute in place support

make -j2
make modules_install
cp arch/x86_64/boot/bzImage /boot/kernel

安装配置 grub

emerge grub
grub
> root (hd0,0)
> setup (hd0)
> quit
nano -w /boot/grub/grub.conf

grub.conf 内容如下:

default 0
timeout 10

title Gentoo
root (hd0,0)
kernel /boot/kernel root=/dev/sda3

系统配置

文件系统挂载点:

nano -w /etc/fstab
/dev/sda1 /boot ext2 noauto,noatime 1 2
/dev/sda3 / ext3 noatime 0 1
/dev/sda2 none swap sw 0 0

网络设置:

echo ‘config_eth0=( "192.168.1.12/24" )’ >> /etc/conf.d/net
echo ‘routes_eth0=( "default via 192.168.1.1" )’ >> /etc/conf.d/net

服务设置:

rc-update add sshd default

时区设置:

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
nano -w /etc/conf.d/clock

设置 root 密码:

passwd

重启,完成安装

exit umount /mnt/gentoo/dev /mnt/gentoo/proc /mnt/gentoo/boot /mnt/gentoo
reboot

— EOF —

配置 Linux 内核,并利用 iptables 作端口映射

  • 主机 IP:192.168.1.100
  • 目标机 IP:192.168.2.101

要求将到主机 192.168.1.100:11101 的请求映射到内部网目标机的 sshd 服务端口上,即:192.168.2.101:22。

配置内核(以 2.6.18 为例)

如果执行 iptable -L 出现以下信息,那么就需要重新配置和编译内核:

iptables v1.4.2: can’t initialize iptables table `filter’: Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.

配置选项:

Networking —->

  Networking options —->

  [*] Network packet filtering (replaces ipchains)  —>

    Core Netfilter Configuration  —>

      <*> Netfilter Xtables support (required for ip_tables)

    IP: Netfilter Configuration —>

      <*> Connection tracking (required for masq/NAT)

      <*> IP tables support (required for filtering/masq/NAT)

      <*>   IP range match support

      <*>   Packet filtering

      <*>     REJECT target support

      <*>   Full NAT

以上配置只为端口映射准备,如果需要其它功能,请根据需要增加相关的配置。

编译安装内核步骤略过。

iptabes

iptables 规则如下:

iptables -t nat -A PREROUTING -p tcp –dport 11101 -d 192.168.1.100 -j DNAT –to-destination 192.168.2.101:22

查看 iptables 规则定义:

# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination        
DNAT       tcp  –  anywhere             192.168.1.100       tcp dpt:11101 to:192.168.2.101:22

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination        

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

ip_forward

除此之外,需要在主机上打开 ip 转发以保持连接通道。

查看是否已打开 ip 转发(1 表示打开):

cat /proc/sys/net/ipv4/ip_forward

如果未打开,则用以下命令打开:

echo 1 > /proc/sys/net/ipv4/ip_forward

保存设置

以上 iptables 设置和 ip 转发设置在重启系统之后就会消失,因此如果有需要,请将设置保存。

保存 iptables 设置:

/etc/init.d/iptables save

设置系统启动时自动加载 iptables 设置(以 gentoo 为例):

rc-update add iptables default

保存 ip_forward 设置(在 /etc/sysctl.conf 中设置):

net.ipv4.ip_forward = 1

安全隐患

在打开了 ip_forward 后,一般要同时打开 rp_filter (Reverse Path filter),对数据包的源地址进行检查。

如果在没有打开这个设置,就很容易受到来自内部网的 IP 欺骗。

打开 rp_filter:

for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 1 > $f ; done

保存设置(在 /etc/sysctl.conf 中设置):

net.ipv4.conf.default.rp_filter = 1

net.ipv4.conf.all.rp_filter = 1

测试

ssh root@192.168.1.100 -p 11101

看看是不是能够连接到 192.168.2.101 主机上了?

— EOF —

Ubuntu 下安装配置 fcitx 输入法

安装:

apt-get install fcitx

默认输入法引擎为 SCIM,需要切换输入法引擎为 fcitx:

im-switch -s fcitx

编译 fcitx 配置文件中的中文字体,否则输入法上的汉字会显示为方块:

gedit ~/.fcitx/config

中文字体改为:

显示字体(中)=WenQuanYi Zen Hei

“WenQuanYi Zen Hei”是我系统上已安装的字体,你可以使用 xlsfonts 或 fc-list 命令查看可用的字体列表。

保存设置后,按 Ctrl + Alt + Backspace 重启 X。

— EOF —