教你在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 中。
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 高效):
listen = /var/run/php-fpm.sock
修改用户组和用户名:
Unix user of processes
<value name="user">www</value>
Unix group of processes
<value name="group">www</value>
修改 PHP-FPM 运行模式为 Apache-Like 模式:
<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 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:/var/run/php-fpm.sock;
}
}
* 新建存储日志目录:
mkdir /work/www/logs
* 重新加载 Nginx 配置
/etc/init.d/nginx reload
*新建phpinfo信息测试文件
vim /work/www/test/phpinfo.php
输入内容:
<?php
phpinfo();
?>
* 访问:http://192.168.1.10/phpinfo.php
192.168.1.10 是我这台 Gentoo 机器的 IP。
如果显示正常的 phpinfo 信息,则说明安装成功。
在Nginx上设置禁止通过IP访问服务器,只允许通过域名访问,以避免别人把未备案的域名解析到自己的服务器IP而导致服务器被断网。
nginx的默认虚拟主机允许用户通过IP访问,或者通过未设置的域名访问(比如有人把他自己的域名指向了你的ip)的时候生效。
解决方法:
在server的设置里面添加这一行:
listen 80 default;
后面的default参数表示这个是默认虚拟主机。
这个设置非常有用。
比如别人通过ip或者未知域名访问你的网站的时候,你希望禁止显示任何有效内容,可以给他返回500.
目前国内很多机房都要求网站主关闭空主机头,防止未备案的域名指向过来造成麻烦。就可以这样设置:
listen 80 default;
return 500;
}
也可以把这些流量收集起来,导入到自己的网站,只要做以下跳转设置就可以:
listen 80 default;
rewrite ^(.*) http://www.mydomain.com permanent;
}
按照如上设置后,确实不能通过IP访问服务器了,但是在应该用中出现当server_name后跟多个域名时,其中一个域名怎么都无法访问:
设置如下:
{
listen 80;
server_name www.abc.com abc.com
}
没更改之前,通过server_name 中的www.abc.com abc.com均可访问服务器,加入禁止IP访问的设置后,通过abc.com无法访问服务器了,www.abc.com可以访问
用 nginx -t 检测配置文件会提示warning:
[warn]: conflicting server name “abc.com” on 0.0.0.0:80, ignored
the configuration file /usr/local/webserver/nginx/conf/nginx.conf syntax is ok
configuration file /usr/local/webserver/nginx/conf/nginx.conf test is successful
最后通过在listen 80 default;后再加server_name _;解决,形式如下:
server
{
listen 80 default;
server_name _;
return 500;
}
这样,通过abc.com就能访问服务器了,问题是解决了,但具体原因还是不清楚。
您可能感兴趣的文章:
nginx下禁止直接以IP访问的方法
两个nginx小技巧(禁止以ip方式访问、禁止列出目录)
如何在nginx中配置ip直接访问的默认站点
nginx禁止IP访问及未绑定的域名跳转的配置方法
nginx屏蔽ip直接访问的方法
nginx禁止直接以IP访问网站的方法
Nginx中一些常用的URL 重写方法介绍,有需要的朋友可以参考下。
url重写应该不陌生,不管是SEO URL 伪静态的需要,还是在非常流行的wordpress中,重写都是无处不在的。
1. 在 Apache 的写法
RewriteRule (.*) http://www.nginx.org$1
在 Nginx 可以对应写成:
listen 80;
server_name www.nginx.org nginx.org;
if ($http_host = nginx.org) {
rewrite (.*) http://www.nginx.org$1;
}
...
}
但 Nginx 作者更建议的方法是:
server {
listen 80;
server_name nginx.org;
rewrite ^ http://www.nginx.org$request_uri?;
}
server {
listen 80;
server_name www.nginx.org;
...
}
问题部分
1. 请教一下,nginx的rewrite规则怎么写?
比如将 http://www./222.html rewrite 为 http://www./222.htm
{
rewrite ^(.*)\.html $1.htm permanent;
}
2. 下面url要怎么写rewrite?
www.aaa.com/search/?wd=搜索内容 ==> www.aaa.com/searchpage?keyword=搜索内容
rewrite (.*) /searchpage$1 ;
}
3. 请求的url如下 /item/12345/index.html 重定向到/item/12/12345/index.html
规则就是id除1000,如果小于id小于1000,则为/item/0/id/index.html
不知道说清楚没有,这个rewrite规则该怎么写啊?
刚看了文档,似乎可以
http://wiki.nginx.org/HttpRewriteModule
/photos/123456 -> /path/to/photos/12/1234/123456.png
rewrite "/photos/([0-9] {2})([0-9] {2})([0-9] {2})" /path/to/photos/$1/$1$2/$1$2$3.png;
备注:
有一个工具可以apache htaccess 文件转 nginx rewrite:
http://www.anilcetin.com/convert-apache-htaccess-to-nginx/
您可能感兴趣的文章:
nginx rewrite(nginx url地址重写)的配置示例
nginx实现url重写-rewrite实例参考
nginx配置url重写及自定义404错误页面等
Nginx常用的 URL 重写方法
超详细的 NGINX URL重写实例讲解