在Ubuntu上扩展Web应用程序
缩放Web应用程序是Web管理员必须做的最令人兴奋的事情之一。 缩放是系统管理员利用多个服务器为单个Web应用程序提供服务的过程。
大多数扩展涉及到分离Web服务器和数据库,并向每个方面添加冗余系统。
本文将引导您完成通过添加冗余Web服务器从单个服务器到两个应用程序的步骤。
这两个服务器(将被称为“服务器A”和“服务器B”)将是您的Web服务器,并将使用nginx进行负载平衡。
在本教程的所有示例中,以下服务器到IP映射将应用:
服务器A:1.1.1.1
服务器B:2.2.2.2
服务器A和B将通过使用名为nginx的程序进行负载平衡。 Nginx可以通过Web服务器本身来运行,但是在我们的示例中,我们将只使用它作为运行Apache的两台服务器之间的负载平衡器。
第1步 - 在服务器A上配置Nginx
以下步骤将导致服务器A和服务器B共享来自网站流量的负载。
我们要做的第一件事是在服务器A上安装nginx,以执行我们的负载平衡。
sudo apt-get install nginx php5-fpm
一旦安装,我们需要配置它一点。 我们需要编辑/ etc / nginx / sites-enabled / default,并告诉nginx实际托管网站的IP地址和端口号。
继续打开该文件:
sudo nano /etc/nginx/sites-enabled/default
我们可以使用上游块。 示例上游块在这里示出并且逐行解释。 在以下一组示例中,
upstream nodes { ip_hash; server 1.1.1.1:8080 max_fails=3 fail_timeout=30s; server 2.2.2.2:8080 max_fails=3 fail_timeout=30s; }
第一行定义上游块并将其命名为“nodes”,最后一行关闭该块。
您可以创建任意数量的上游块,但它们必须是唯一命名的。
两个“服务器”行是重要的; 它们定义了我们实际Web服务器正在监听的IP地址和端口号。
请记住,这个IP地址可以是我们运行nginx的同一台服务器的IP地址。
无论是否是这种情况,建议您使用除80之外的端口。
建议使用默认HTTP端口以外的端口,因为您想要使最终用户难以意外地绊到用于Web服务器负载平衡的任何单独的服务器。
防火墙也可以用作预防措施,因为与上游中任何服务器的所有Web连接都源自运行nginx的服务器的IP地址。 将在本文后面部分介绍增强Web服务器安全性的步骤。
接下来我们要做的是配置nginx,以便它将响应并转发对特定主机名的请求。 我们可以使用包含proxy_pass行的虚拟主机块来完成这两个任务。
见下面的例子和解释。
server { listen 1.1.1.1:80; root /path/to/document/root/; index index.html index.htm; server_name domain.tld www.domain.tld; location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } location / { proxy_pass http://nodes; } }
此配置有几个关键的部分,包括“listen”行,“server_name”行和“location”块。
确保编辑文档根目录以指向您的网站
前两个是标准配置元素,指定了我们的Web服务器正在监听的IP地址和端口,但它是最后一个元素,“位置”块,允许我们负载平衡我们的服务器。
由于服务器A将作为用户将连接到的端点和作为负载平衡服务器之一,我们需要创建第二个虚拟主机块,在非标准端口上监听传入连接。
server { listen 127.0.0.1:8080; root /path/to/document/root/; index index.html index.htm index.php; server_name domain.tld www.domain.tld; location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } }
一旦你完成,重新加载nginx:
sudo service nginx reload
第2步 - 在服务器B上配置nginx
我们需要在服务器B上设置一个类似的虚拟主机块,它也将响应我们域的请求。 它看起来非常类似于我们在服务器A上的第二个服务器块。
server { listen 2.2.2.2:8080; root /path/to/document/root/; index index.html index.htm index.php; server_name domain.tld www.domain.tld; location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; include fastcgi_params; } }
在第二台服务器上重新加载nginx:
sudo service nginx reload
这是我们在这个服务器上需要做的唯一配置!
处理负载平衡Web服务器时的一个缺点是数据在服务器之间不同步的可能性。
这个问题的解决方案可能是使用git存储库来同步到每个服务器,这将是未来教程的主题。
您现在应该有一个工作的负载平衡配置。 和往常一样,欢迎任何反馈意见的评论!