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