介绍
有时,你的需求改变,新技术变得可行,或你的用户库气球意外。无论你的原因,你可能考虑改变的应用程序堆栈的组成部分之一是Web服务器。
虽然Apache Web 服务器目前是世界上最受欢迎的 Web 服务器,但 Nginx 正在以快速的速度获得基础,这并不奇怪,考虑到 Nginx 在使用很少的资源的情况下表现出色。
在本指南中,我们将讨论如何在Ubuntu 12.04 VPS上将网站从Apache迁移到Nginx。
本指南假定您使用 本教程安装了LAMP(Linux,Apache,MySQL和PHP)堆栈。如果您在创建Dropplet时仅仅选择了单击LAMP图像,您的服务器也将具有此配置。
安装 Nginx
我们开始迁移我们的网站的第一件事是安装我们的新服务器软件,这将允许我们通过查看当前的Apache配置文件来配置我们的新服务器。
幸运的是,Nginx默认情况下存在于Ubuntu存储库中,让我们现在安装它:
1sudo apt-get update
2sudo apt-get install nginx
一个在我们的应用案例中变得非常重要的实现细节是,Nginx将任何动态处理转移到一个单独的流程中,这允许 Nginx保持瘦和快速,它可以专注于其核心功能,而无需尝试通过模块添加PHP支持。
这一切在这一点上都被提到,说我们还需要安装一个PHP处理器来处理PHP脚本。
1sudo apt-get install php5-fpm
你应该拥有所有你需要改变你的网站到 Nginx 的软件,我们仍然需要配置我们的软件来模拟Apache正在运行的配置。
设置测试 Nginx 配置
由于我们目前正在运行Apache,如果我们可以避免它,我们希望将我们的Nginx服务器与Apache独立配置,以便我们的网站在过渡期间仍然运行。
这就像在替代端口上测试 Nginx 一样简单,直到我们准备好巩固我们的更改,这样我们就可以同时运行两个服务器。
首先,打开默认 Nginx 站点的配置文件:
1sudo nano /etc/nginx/sites-available/default
在服务器 {
部分中,添加一个倾听指令,告诉 Nginx 在端口 80 以外的端口上倾听 (Apache 仍在使用它来服务请求)。
1server {
2
3 listen 8000;
4 . . .
5 . . .
保存并关闭文件. 这是一个很好的时间来检查点,看看我们可以访问我们的 Nginx 服务器。
1sudo service nginx start
使用我们配置的端口号码访问默认的 Nginx 配置. 输入您的浏览器:
1http://your_ip_or_domain:8000
你的Apache实例仍然应该在默认端口80上运行。你也可以通过访问你的网站而没有8000
在末尾进行检查(我们的例子只是服务默认的Apache页面。
1http://your_ip_or_domain
翻译你的 Apache 配置
现在你有两个服务器并运行,你可以开始迁移和翻译你的Apache配置用于使用 Nginx. 这必须手动,所以重要的是你了解如何配置 Nginx。
Apache将这些文件保存在 /etc/apache2/sites-available/
和 Nginx follow suit 中,并将其服务器块声明保存在 /etc/nginx/sites-available/
在 Ubuntu 上。
对于每个虚拟服务器声明,你将创建一个服务器块. 如果你通过你的Apache文件,你可能会发现虚拟主机看起来像这样的:
1<VirtualHost *:80>
2 ServerAdmin webmaster@your_site.com
3 ServerName your_site.com
4 ServerAlias www.your_site.com
5
6 DocumentRoot /var/www
7
8 <Directory />
9 Options FollowSymLinks
10 AllowOverride None
11 </Directory>
12
13 <Directory /var/www/>
14 Options Indexes FollowSymLinks MultiViews
15 AllowOverride None
16 Order allow,deny
17 allow from all
18 </Directory>
19
20 ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
21 <Directory "/usr/lib/cgi-bin">
22 AllowOverride None
23 Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
24 Order allow,deny
25 Allow from all
26 </Directory>
27
28 ErrorLog ${APACHE_LOG_DIR}/error.log
29 LogLevel warn
30 CustomLog ${APACHE_LOG_DIR}/access.log combined
31
32 Alias /doc/ "/usr/share/doc/"
33 <Directory "/usr/share/doc/">
34 Options Indexes MultiViews FollowSymLinks
35 AllowOverride None
36 Order deny,allow
37 Deny from all
38 Allow from 127.0.0.0/255.0.0.0 ::1/128
39 </Directory>
40</VirtualHost>
我们可以使用此配置开始构建我们的 Nginx 服务器块。
在您的 /etc/nginx/sites-available/
目录中,打开我们之前编辑的文件,以声明 Nginx 端口:
1sudo nano /etc/nginx/sites-available/default
除了目前评论的行,它应该看起来像这样的东西:
1server {
2 listen 8000;
3
4 root /usr/share/nginx/www;
5 index index.html index.htm;
6
7 server_name localhost;
8
9 location / {
10 try_files $uri $uri/ /index.html;
11 }
12
13 location /doc/ {
14 alias /usr/share/doc/;
15 autoindex on;
16 allow 127.0.0.1;
17 deny all;
18 }
19}
您应该已经开始看到一些似乎与我们的Apache配置相匹配的项目,一般来说,主要指令翻译如下:
1Apache Nginx
2------ ------
3
4<VirtualHost *:80> server {
5 listen 80;
6
7ServerName yoursite.com
8ServerAlias www.yoursite.com server_name yoursite.com www.yoursite.com;
9
10DocumentRoot /path/to/root root /path/to/root;
11
12AllowOverride All (No Available Alternative)
13
14DirectoryIndex index.php index index.php;
15
16ErrorLog /path/to/log error_log /path/to/log error;
17
18CustomLog /path/to/log combined access_log /path/to/log main;
19
20Alias /url/ "/path/to/files" location /url/ {
21<Directory "/path/to/files"> alias /path/to/files;
如果我们要创建一个模拟来自上面的虚拟主机文件功能的服务器块,它可能会看起来像这样:
1server {
2 listen 8000; # We're deliberately leaving this as-is to avoid conflict at the moment
3
4 root /var/www;
5 server_name your_site.com www.your_site.com;
6
7 location / {
8 try_files $uri $uri/ /index.html;
9 }
10
11 location ~ \.php$ {
12 fastcgi_split_path_info ^(.+\.php)(/.+)$;
13 fastcgi_pass unix:/var/run/php5-fpm.sock;
14 fastcgi_index index.php;
15 include fastcgi_params;
16 }
17
18 location /doc/ {
19 alias /usr/share/doc/;
20 autoindex on;
21 allow 127.0.0.1;
22 deny all;
23 }
24
25 location ~/\.ht {
26 deny all;
27 }
28
29}
我们删除了一些项目,并添加了一些额外的行,我们应该解释。
首先,错误日志线已经从配置中删除,这是因为它们已经在 /etc/nginx/nginx.conf
文件中定义了。
我们还删除了ServerAdmin
指令,因为 Nginx 不会将这些信息嵌入错误页面中。
由于PHP在Nginx中被单独处理,我们将这些文件传送到我们之前安装的php-fpm
程序中。
文档部分被更改以反映 Nginx 文档,否则其功能相当相似。
最后,我们将 Nginx 配置为拒绝访问我们的目录中的任何.htaccess
或其他开始于.ht
的文件. 这些是 Apache 特定的配置文件,并且不会与 Nginx 合作。
保存并关闭文件,当你完成。
我们必须重新启动我们的 Nginx 服务器,以便识别这些更改:
1sudo service nginx restart
配置 PHP-FPM
现在我们已经失去了大部分的 Nginx 配置,我们需要修改 php-fpm 配置以使用我们指定的渠道进行通信。
首先,我们应该修改php.ini文件,以免它不安全地服务文件。
1sudo nano /etc/php5/fpm/php.ini
我们需要修改的行将要求PHP提供确切的请求文件,而不是猜测是否有不完整的匹配,这会阻止PHP可能向正在调查PHP处理器的弱点的人提供或暴露敏感数据。
尋找指定「cgi.fix_pathinfo」指令的行,並將其修改為:
1cgi.fix_pathinfo=0
保存并退出此文件。
接下来,我们将更改php-fpm连接到我们的服务器的方式. 在您的编辑器中打开此文件:
1sudo nano /etc/php5/fpm/pool.d/www.conf
查找并修改倾听
指令以匹配我们在服务器封锁配置文件中放置的值:
1listen = /var/run/php5-fpm.sock
如果你最终遇到处理许多PHP请求的问题,你可能想回来,并增加可以同时生成的孩子过程的数量。
1pm.max_children = Num_of_children
保存并关闭此文件。
现在,我们的php-fpm程序应该正确配置,我们需要重新启动它,以便我们的更改传播。
1sudo service php5-fpm restart
重新启动 Nginx 也不会伤害:
1sudo service nginx restart
测试你在 root 目录中的任何 PHP 文件是否正确运行,你应该能够像在 Apache 中一样执行 PHP 文件。
如果我们访问我们在Ubuntu LAMP教程中创建的info.php
文件,它应该是这样的:
1http://your_ip_or_domain:8000/info.php
在PHP变量
部分中,您应该看到 Nginx 列为SERVER_SOFTWARE
变量:
转移您的 Nginx 网站直播
完成 ** 广泛** 测试后,您可以尝试无缝地将您的网站从 Apache 过渡到 Nginx。
这是可能的,因为这些服务器都不会在重新启动之前实施更改,这使我们能够设置一切,然后在一瞬间扭转开关。
真正的,我们唯一需要做的就是修改 Nginx 服务器块中的端口。
1sudo nano /etc/nginx/sites-available/default
将端口更改为默认端口 80。这将允许它在重新启动后立即开始接受正常的 HTTP 流量。
1server {
2 # listen 8000;
3 listen 80;
4 . . .
保存并关闭文件。
如果您只是将部分网站过渡到 Nginx 并继续从 Apache 提供一些内容,则需要禁用在端口 80 上服务的 Apache 虚拟服务器,以避免冲突。
如果您打算继续运行 Apache,请检查以下文件和位置,以了解端口 80 的使用情况:
1/etc/apache2/ports.conf
2/etc/apache2/apache2.conf
3/etc/apache2/httpd.conf
4/etc/apache2/sites-enabled/ ## Search all sites in this directory
在您确定已更改所有必要的端口后,您可以像这样重新启动这两个服务:
1sudo service apache2 reload && sudo service nginx reload
Apache 应该重新加载,释放端口 80。随后, Nginx 应该重新加载并开始接受该端口上的连接. 如果一切顺利,您的网站现在应该由 Nginx 服务。
如果您不再使用Apache来服务您的网站的任何部分,您可以完全停止其Web流程:
1sudo service apache2 stop && sudo service nginx reload
如果您不再使用 Apache,您可以在此时卸载 Apache 文件,您可以轻松地通过键入来找到与 Apache 相关的文件:
1dpkg --get-selections | grep apache
1apache2 install
2apache2-mpm-prefork install
3apache2-utils install
4apache2.2-bin install
5apache2.2-common install
6libapache2-mod-auth-mysql install
7libapache2-mod-php5 install
然后您可以使用 apt-get 删除它们,例如:
1sudo apt-get remove apache2 apache2-mpm-prefork apache2-utils apache2.2-bin apache2.2-common libapache2-mod-auth-mysql libapache2-mod-php5
您还可以删除不再需要的所有依赖包:
1sudo apt-get autoremove
移民复杂性
在Apache世界中,有一些常见的事情可能会在尝试切换到Nginx时引起一些混乱。
重写翻译和.htaccess 文件
最根本的区别之一是 Nginx 不尊重目录过分。
Apache 使用 .htaccess
文件,以及 AllowOverride All
指令在一个位置块中,这允许您在存储文件的目录中放置特定目录的配置。
Nginx不允许这些文件. 容纳配置与服务的文件是一个潜在的安全问题,如果错误配置,很容易查看集中配置文件,而不是意识到一个设置正在被写过一个.htaccess 文件。
因此,您在一个活跃的.htaccess 文件中列出的所有配置都必须放在该主机的服务器块配置中的位置块中。
在.htaccess 文件中保留的一些常见的事情是 Apache 的 mod_rewrite 模块的规则,该模块改变了内容的访问 URL 以便更易于使用。 Nginx 有一个类似的重写模块,但使用不同的语法。
模块和外部配置并发症
另外要记住的是,你需要知道你已启用的Apache模块提供的功能。
一个简单的例子是dir
模块. 当启用时,您可以指定Apache将试图作为目录索引的文件的顺序,在虚拟主机文件中放置一个类似的行:
1DirectoryIndex index.html index.htm
但是,如果这个行不存在,并且启用了dir
模块,则服务的文件的顺序将由此文件确定:
1sudo nano /etc/apache2/mods-enabled/dir.conf
1<IfModule mod_dir.c>
2
3 DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
4
5</IfModule>
提出这一点的重点是,你必须意识到模块或任何类型的外部源配置可能正在做一些你必须在 Nginx 中明确地做的事情。
在本示例中,您可以通过将其添加到服务器块来指定 Nginx 中的目录索引顺序:
1server {
2 . . .
3 index index.php index.html index.htm;
4 . . .
重要的是要记住这一点。
如果您正在过渡到复杂的网站配置,可能有帮助的一件事是将所有单独来源的配置文件复制并粘贴到一个单一文件中,并系统地浏览并翻译每个行。
这可能是一个头痛,但对于一个生产服务器来说,它可以节省大量的时间来跟踪导致你无法完全识别的奇怪行为。
结论
从 Apache 到 Nginx 过渡的复杂性几乎完全取决于您特定的配置的复杂性 Nginx 可以处理 Apache 所能做的几乎任何事情,而使用更少的资源可以这样做,这意味着您的网站可以无缝地为更大的用户群提供服务。
虽然迁移对所有网站都没有意义,虽然Apache是一个很棒的服务器,可以充分满足许多项目的需求,但你可能会看到Nginx的性能提高或可扩展性增加,如果你仍然需要Apache,另一个替代方案是使用Nginx作为你的Apache服务器的反向代理程序(LINK0)。