这篇文章的题目是有点儿长,因为我也想不使用什么更简单的话来为本文命名了,所以就使用了最直白的方式。本文将教你如何在一个全新的系统上面安装 Nginx 服务器软件,配置 PHP/Perl/Python 程序的支持以及MySQL/PostgreSQL/SQLite数据库支持,因为服务器的优化是各种各样的,而且一般要去做服务器优化的人应该也不会使用包管理工具来安装这些,所以本文不会对服务器的优化做过多的讨论,仅仅只简单的带过,希望本文对你有帮助。
写在前面的话
你能阅读本文,那肯定是有下面这样的需求中的一个或者多个:
- 刚刚在 Linode 买了一个VPS,选择了Ubuntu作为服务器操作系统,想使用Wordpress/TextPattern或者Drupal建个博客或者网站;
- 公司买了个新服务器,也装了Ubuntu服务器,需要安装一个Plone给公司内部使用
- 像我一样,很喜欢使用Movable Type,我想使用它发布一些静态的网站
- 我是一个SOHOer,有很多个基于PHP开发的客户网站,但是不想再使用共享虚拟主机,想使用自己的服务器集中管理
- ......
其实这些需求可以简单的归为下面这几个:
- 服务器操作系统选择的是 Ubuntu
- 服务器需要能支持 PHP/Python/Perl Web应用
- 服务器需要提供MySQL/PostgreSQL/SQLite 数据库支持
- 服务器应该可以服务于多个网站
- 服务器端的Web服务器软件选择了Nginx而不是Apache
有了需求就只要去努力满足这些需求就成了,本文就是在帮助你知道如何满足这些需求,但是我也不是专业人士,所以,有的时候你可能在别的地方发现有更好的方法,如果你真的找到了更好的方法,请在这里留言告诉我一下,但是请不要在这里来展示你的专业,你就当我这里是放屁就成,但是不要在我这里放屁,否则后果自负。
这篇文章写的时候使用的是 Ubuntu Server 64位 LTS版本,版本号为 12.04,如果你使用的是其它版本,请注意有可能本文里面所使用的命令、参数等需要做一些修改才能适用,最主要的比如那个 /etc/apt/source.list 就肯定是要做修改的,否则肯定会有问题出现。
修改 /etc/apt/source.list 文件并更新与升级系统
我使用的软件源为美国的镜像,它的完整的软件源列表如下:
deb http://us.archive.ubuntu.com/ubuntu/ precise main restricted
deb-src http://us.archive.ubuntu.com/ubuntu/ precise main restricted
deb http://us.archive.ubuntu.com/ubuntu/ precise-updates main restricted
deb-src http://us.archive.ubuntu.com/ubuntu/ precise-updates main restricted
deb http://us.archive.ubuntu.com/ubuntu/ precise universe
deb-src http://us.archive.ubuntu.com/ubuntu/ precise universe
deb http://us.archive.ubuntu.com/ubuntu/ precise-updates universe
deb-src http://us.archive.ubuntu.com/ubuntu/ precise-updates universe
deb http://us.archive.ubuntu.com/ubuntu/ precise multiverse
deb-src http://us.archive.ubuntu.com/ubuntu/ precise multiverse
deb http://us.archive.ubuntu.com/ubuntu/ precise-updates multiverse
deb-src http://us.archive.ubuntu.com/ubuntu/ precise-updates multiverse
deb http://us.archive.ubuntu.com/ubuntu/ precise-backports main restricted universe multiverse
deb-src http://us.archive.ubuntu.com/ubuntu/ precise-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu precise-security main restricted
deb-src http://security.ubuntu.com/ubuntu precise-security main restricted
deb http://security.ubuntu.com/ubuntu precise-security universe
deb-src http://security.ubuntu.com/ubuntu precise-security universe
deb http://security.ubuntu.com/ubuntu precise-security multiverse
deb-src http://security.ubuntu.com/ubuntu precise-security multiverse
deb http://extras.ubuntu.com/ubuntu precise main
deb-src http://extras.ubuntu.com/ubuntu precise main
deb http://ppa.launchpad.net/nginx/stable/ubuntu precise main
最后一项为一个 PPA ,我们需要先更新一个密钥,使用下面这行命令:
apt-key adv --keyserver keyserver.Ubuntu.com --recv-keys C300EE8C
这里有一个小地方需要注意一下下,有可能,我是说有可能,你需要更新的Key并不是 C300EE8C 这个结尾的,那么可以先运行 apt-get update ,然后看终端中提示的是什么Key,再根据这个提示运行上面这行命令,把最后的那个参数修改成为提示信息里面的 Key 的最后8位即可。
更新完成Key之后,更新并升级一下:
sudo apt-get update
sudo apt-get upgrade
安装 Nginx
安装Nginx 很简单,使用下面这行命令即可:
sudo apt-get install nginx
这会将标准的 Nginx 包安装至服务器,但是使用下面这个命令你会看到其实Ubuntu提供了很多个Nginx版本:
aptitude search nginx
有nginx, nginx-common, nginx-extras, nginx-full, nginx-light, nginx-maxsi, nginx-passenger 等等,如果你有一些特殊的需求,而正好这里面某个版本又提供了你的所有需求,那就选择那个满足你需求的版本吧,否则,就直接安装 nginx 即可,这会安装绝大多数人都用得到的东西到你的系统里面去,不会多也不会少。
安装完成之后,可以使用下面这行命令检测你所安装的Nginx版本:
nginx -v
我安装到的版本是:nginx version: nginx/1.2.4,你的可能与我的不一样,但是如要不一样的话,那应该就是比我更新的版本,没有哪个开发者会把版本号越用越小,你也不会吧,之后使用下面这行命令启动Nginx:
/etc/init.d/nginx start
在上面这个命令中, /etc/init.d/nginx 这个文件就是Nginx的管理脚本,可用的参数有:
- start : 启动Nginx服务器
- stop : 停止Nginx服务器
- restart : 重新启动Nginx服务器
- reload : 重新加载配置文件
- force-reload : 强制重新加载配置文件
- status : 当前Nginx服务器的状态
- configtest : 测试配置文件的正确性(如果你修改了配置文件,重新加载这些配置文件之前,应该先测试一下这些配置文件的正确性,以免因为配置文件的错误而造成服务器的停止,不过像我这种人是从来不这么干的,因为网站停止服务对我来说没啥太大的影响,但是,想想,如果你的网站域名是 taobao.com ,那停止一秒钟的损失有多大?)
除上面说的这个文件还有几个文件与目录你可能需要注意:
- /etc/nginx/sites-available/ :这个目录里面存放的是所有可用的虚拟主机的配置文件
- /etc/nginx/sites-enabled :这个目录里面存放的是指向可用虚拟主机配置文件的软件链接,只有在这里面存放对应的软链接的配置文件才会被Nginx服务器加载
- /etc/nginx/nginx.conf : Nginx 服务器的主配置文件
- /etc/nginx/sites-available/default :默认网站的配置文件,这个是安装的过程中生成的,在本文中,我将修改它。
修改 Nginx 服务器的默认配置文件,创建默认虚拟主机
/etc/nginx/sites-available/default 文件(以下简称“default文件”)是在安装的过程中自动生成的一个配置文件,它定义的一个虚拟主机,但是在我们的使用中,这个虚拟订同没有太大的作用,所有我们会重新写默认虚拟主机的默认文件,它是这样的一个虚拟主机:
- 我们可以通过服务器的IP地址访问到该虚拟主机(默认使用80端口)
- 当我们使用域名访问服务器时,如果该域名没有与某个虚拟主机绑定,那么就表示该的就是这个默认的虚拟主机
- 这个默认的虚拟主机需要支持PHP程序(因为我会把phpMyAdmin这种数据库管理软件放在默认虚拟主机里面),当然这不是必须的,甚至你可以不定义这个虚拟主机都没有关系。
下面我们来满足这些需求;
首先,使用下面这几行命令配置系统自动生成的 default 文件(你可以删除它,但是这个文件也不占用太多的地方,就留着吧,它里面还有很多示例可供你学习呢):
cd /etc/nginx/sites-available/
cp default default.backup
然后清空 default文件,并使用一个你喜欢的编辑器编辑它:
cat /dev/null > default
vi default
/etc/nginx/sites-available/default 文件的内容为:
server {
listen 80;
server_name _;
root /srv/www/default/public;
error_log /srv/www/default/logs/error.log;
access_log /srv/www/default/logs/access.log;
}保存该文件,然后创建上面这些配置文件中指定的目录:
mkdir -p /srv/www/default/public
mkdir /srv/www/default/logs
chown www-data:www-data -R /srv/www/
创建完成之后可以使用下面这行命令来测试一下配置文件是否正确:
/etc/init.d/nginx configtest
如果没有报错,那么使用下面这行命令重新加载配置文件:
/etc/init.d/nginx reload
然后在浏览器中打开 http://your.server.ip.address/ 这个地址即可访问到你的默认虚拟主机,比如我现在是在自己的电脑上面,那么可以使用 http://127.0.0.1 或者 http://localhost/ 访问到该虚拟主机,我在电脑在局域网中的IP地址为 192.168.1.4,所以,使用 http://192.168.1.4 也可以访问到该虚拟主机(局域网中的其它计算机也可以使用这个地址访问你的虚拟主机)。但是你应该发现了,访问这些地址得到的都是同一个结果:
403 Forbidden
这是因为该虚拟主机的根目录中没有索引文件,而且也不允许Nginx自动对目录进行索引,可以使用下面这两种办法来检测一下你的配置是否正确:
创建一个默认的索引文件 index.html
这是推荐的方法,它不会让Nginx自动索引目录中的文件(有些文件你可能并不想让所有访问者都这么轻易的知道),在 /srv/www/default/public/ 目录下创建一个名为 index.html 的文件,输入下面这些内容:
<!DOCTYPE html><html lang="zh-CN">
<head><meta charset="utf-8" /><title>Matrix Stack Index</title></head>
<body><h1><a href="http://matrixstack.com/node/139">Matrix Stack</a></h1>
</body></html>
保存该文件,再访问上面这些地址,你将看到默认浏览器就会访问到这个文件了。
开启目录的自动索引功能:autoindex
这个文法来得更简单一些,只需要在配置文件里面加上下面这一行即可:
autoindex on;
重新加载Nginx配置文件之后再访问你的服务器地址,即可看到一个页面,它的左上角有一个标题,内容为: Index of * ,这个就是Nginx的Autoindex功能,如果你没有看到这样的一个页面,而是前面上一种方法所创建的那个 *index.html 文件的内容,那是因为当一个目录中存在索引文件时,Nginx会优先使用该索引文件而不是自动对目录进行索引,你只需要删除 index.html 这个文件即可。
关于虚拟主机根目录的设置
虚拟主机的根目录你可以自己选择,我一般并不使用上面这个路径,而是使用 /home/pantao/websites/default/public 这个作为默认,规则是这样的:
- 所有的虚拟主机根目录都为 /home/USERNAME/websites/DOMAIN.NAME/public 目录,其中 USERNAME 表示该虚拟主机所属用户的用户名,DOMAIN.NAME 为该虚拟主机的主域名,它与 /etc/nginx/sites-available/ 中该虚拟主机的配置文件名是一样的。
- 将所有的具有网站的用户的主用户组都设置为 www-data ,Nginx与PHP都是以该身份运行的,所以设置为这个,对于用户来说,文件管理的权限方面有很大的便捷性。
那么按照这种规则的话,如果我的服务器上面有一个名为 huwenxiao 的用户,它的网站主域名为 huwenxiao.com ,那么该网站的路径即为:
/home/huwenxiao/websites/huwenxiao.com/public
同样的,这个网站如果雇用了日志功能,这些日志就保存在
/home/huwenxiao/websites/huwenxiao.com/logs
目录里,public为所有公开访问的文件目录,logs为日志目录,同样的,私有文件目录则可以使用 private(这比如我使用Drupal系统的私有文件系统的话,我一般就会设置私有文件目录为 private 目录),对于像 Elgg 这样的系统的数据文件目录则可以设置为 data等。不过所有这些都只是我个人的喜好,你完全不用去在乎这些,使用你自己感觉最好的就是最好的方法。
安装数据库程序:MySQL/PostgreSQL/SQLite
使用下面这行命令安装这三个数据库系统:
apt-get install mysql-client mysql-server postgresql sqlite3
安装完成之后,对于 MySQL ,我们可以运行一下下面这个命令以提高MySQL数据库的安全性:
mysql_secure_installation
除了修改MySQL root 帐户密码那个没必须修改之外,其它的选项直接一路回车到底即可,也就是一路Yes,对于 PostgreSQL 数据库,我没有使用过,所以也不知道该如何进行下一步的设置,如果你是一个 PostgreSQL 用户,欢迎告诉我安装 PostgreSQL 之后还需要进行哪些操作。
增加 Nginx 对PHP 的支持
现在运行的网站,其程序绝大多数都是基于PHP语言开发的,Nginx支持以fastcgi 的方式对PHP进行支持,首先,使用下面这行命令安装PHP:
apt-get install php5-common php5-dev php5-cgi php5-fpm php-apc php5-mysql php5-pgsql php5-sqlite php5-curl php5-gd php5-idn php-pear php5-mcrypt php5-memcache php5-ming php5-recode php5-tidy php5-xmlrpc php5-xsl
上面这行命令会安装一些最常用的PHP库,包括 MySQL/PostgreSQL/SQLite 的支持,等待安装程序完成之后,可以使用下面这行命令检查安装的PHP版本:
php -v
还需要使用下面这行命令重新启动 php-fpm:
/etc/init.d/php5-fpm restart
为默认虚拟主机提供PHP支持,并且安装phpMyAdmin数据库管理软件
要为某一个Nginx虚拟主机提供PHP支持,需要修改该虚拟主机的配置文件,打开 /etc/nginx/sites-available/default 文件,在它的 server {} 块中添加下面这些代码:
index index.php index.html index.htm;
location ~ .php$ {
fastcgi_split_path_info ^(.+.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}保存该文件之后还需要重新加载一次该配置文件,使用下面这行命令(以后如果再遇到修改Nginx配置文件的情况,请自行加载,我这里不再重复提示):
/etc/init.d/nginx reload
重新加载之后,可以使用 phpinfo() 函数来查看当前的PHP环境了,在 /srv/www/default/public/ 目录下创建一个名为 phpinfo() 的文件,你可以使用下面这行命令:
echo "<?php phpinfo(); ?>" > /srv/www/default/public/phpinfo.php
这行命令会创建该文件之后,并在该文件中插入 <?php phpinfo(); ?> 这一行代码,现在你可以访问该文件了,如果你在前面的Nginx默认虚拟主机配置中,开启了 autoindex,那么刷新你的浏览器,就会看到,现在网页里面已经列出了该文件,点击该文件即可,如果你没有开启 autoindex,那么请访问 http://your.server.ip.address/phpinfo.php 即可。如果你不想看 phpinfo 信息,那还可以使用PHP服务器探针,这样查看起来可能更简单,本文最下方提供了一个PHP探针的下载地址,你可以将该探针下载并解压至你的虚拟主机目录中,然后访问http://your.server.ip.address/prober.php 即可。
安装 phpMyAdmin MySQL数据库管理工具
phpMyAdmin 是我一直使用的 MySQL 数据库管理工具,它基于 Web ,不像其它一些桌面客户端,它被安装在服务器上,这使得我们可以在任何时候都对 MySQL 进行管理,安装它很简单,只需要从其 官方网站(http://www.phpmyadmin.net/) 下载最新版本的程序包,将其解压至你的虚拟主机目录即可,以本文中的默认虚拟主机为例:
cd /srv/www/default/public
wget http://nchc.dl.sourceforge.net/project/phpmyadmin/phpMyAdmin/3.5.5/phpMyAdmin-3.5.5-all-languages.tar.gz
tar phpMyAdmin-3.5.5-all-languages.tar.gz
mv phpMyAdmin-3.5.5-all-languages phpmyadmin
安装完成之后访问 http://your.server.ip.address/phpmyadmin/ 即可访问 phpMyAdmin ,用户名请使用安装MySQL时设置的 root 帐户及其密码即可。
配置Drupal/WordPress/TextPattern 等常见基于PHP的内容管理系统(CMS)的网址重写
Nginx 有十分强大的网址重写能力,虽然 WordPress 或者 Drupal 等系统都是在Apache上面开发的,官方并没有提供 Nginx 的解决办法,但是我们可以根据 Apache 的网址重写规则很容易的写出 Nginx 版本,在这里,以 Drupal 的网址重写规则为例。
Drupal 的所有请求都是交由 index.php 文件负责的,它接受一个名为 q 的参数,该参数的值为一个 Drupal 路径,比如本文的URL地址为 http://www.matrixstack.com/node/139 ,在该URL地址中, node/139 就是一个 Drupal 路径,它的真实路径应该为: http://www.matrixstack.com/index.php?q=node/139 ,同样的,像本站的介绍页面的 Drupal 路径为about,它在真实路径应该是:http://www.matrixstack.com/index.php?q=about,所以,要让Nginx实现网址重写功能,很简单,只需要把类似 node/139 这样的重写为 index.php?q=node/139 即可,在 default 文件里面添加下面这段配置代码:
location / {
rewrite ^/(.*)$ /index.php?q=$1;
}似乎这样就可以了,但是这样是不行的,还有很多静态文件,它们的路径并不是一个Drupal 路径,而且也不需要Drupal去处理;还有一种情况,比如Drupal 7 的 Image Style功能以及 Drupal 6 中的 Imagecache 等,它们的需求更复杂,当静态文件存在时,直接返回静态文件,不存在是,则由Drupal生成相应的静态文件再返回,下一次请求时直接返回静态文件即可,需求似乎很复杂,但是其实让Nginx来实现这些复杂的需求所需要的网址重写是很简单的一件事情,删除上面的这三行代码,而加入下面这些代码:
location / {
try_files $uri $uri/ @drupal;
}
location @drupal {
rewrite ^/(.*)$ /index.php?q=$1;
}上面这两块代码, location / 部分中 ,try_files 表示,先将请求的URI地址当作文件处理($uri),如果该文件不存在,则再将其当作一个目录处理($uri/),如果该目录也不存在,则当作Drupal路径处理(@drupal),然后在下面的 location @drupal 块中,对 @drupal 路径的进行了定义,即网址重写定义。