分类 系统运维 下的文章

大家好,这篇文章将要讲述如何在 CentOS 7 / Ubuntu 15.04 上安装 Laravel。如果你是一个 PHP Web 的开发者,你并不需要考虑如何在琳琅满目的现代 PHP 框架中选择,Laravel 是最轻松启动和运行的,它省时省力,能让你享受到 web 开发的乐趣。Laravel 信奉着一个普世的开发哲学,通过简单的指导创建出可维护代码是最优先的,你将保持着高速的开发效率,能够随时毫不畏惧更改你的代码来改进现有功能。

Laravel 安装并不繁琐,你只要跟着本文章一步步操作就能在 CentOS 7 或者 Ubuntu 15 服务器上安装。

1) 服务器要求

在安装 Laravel 前需要安装一些它的依赖前提条件,主要是一些基本的参数调整,比如升级系统到最新版本,sudo 权限和安装依赖包。

当你连接到你的服务器时,请确保你能通以下命令能成功的使用 EPEL 仓库并且升级你的服务器。

CentOS-7

# yum install epel-release

# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

# yum update

Ubuntu

# apt-get install python-software-properties
# add-apt-repository ppa:ondrej/php5

# apt-get update

# apt-get install -y php5 mcrypt php5-mcrypt php5-gd

2) 防火墙安装

系统防火墙和 SELinux 设置对于用于产品应用安全来说非常重要,当你使用测试服务器的时候可以关闭防火墙,用以下命令行设置 SELinux 成 宽容模式 permissive 来保证安装程序不受它们的影响。

# setenforce 0

3) Apache, MariaDB, PHP 安装

Laravel 安装程序需要完成安装 LAMP 整个环境,需要额外安装 OpenSSL、PDO,Mbstring 和 Tokenizer 等 PHP 扩展。如果 LAMP 已经运行在你的服务器上你可以跳过这一步,直接确认一些必要的 PHP 插件是否安装好。

要安装完整 AMP 你需要在自己的服务器上运行以下命令。

CentOS

# yum install httpd mariadb-server php56w php56w-mysql php56w-mcrypt php56w-dom php56w-mbstring

要在 CentOS 7 上实现 MySQL / Mariadb 服务开机自动启动,你需要运行以下命令。

# systemctl start httpd
# systemctl enable httpd

#systemctl start mysqld
#systemctl enable mysqld

在启动 MariaDB 服务之后,你需要运行以下命令配置一个足够安全的密码。

#mysql_secure_installation

Ubuntu

# apt-get install mysql-server apache2 libapache2-mod-php5 php5-mysql

4) 安装 Composer

在我们安装 Laravel 前,先让我们开始安装 composer。安装 composer 是安装 Laravel 的最重要步骤之一,因为 composer 能帮我们安装 Laravel 的各种依赖。

CentOS/Ubuntu

在 CentOS / Ubuntu 下运行以下命令来配置 composer 。

# curl -sS https://getcomposer.org/installer | php
# mv composer.phar /usr/local/bin/composer
# chmod +x /usr/local/bin/composer

composer installation

5) 安装 Laravel

我们可以运行以下命令从 github 上下载 Laravel 的安装包。

# wget https://github.com/laravel/laravel/archive/develop.zip

运行以下命令解压安装包并且移动 document 的根目录。

# unzip develop.zip

# mv laravel-develop /var/www/

现在使用 compose 命令来安装目录下所有 Laravel 所需要的依赖。

# cd /var/www/laravel-develop/
# composer install

compose laravel

6) 密钥

为了加密服务器,我们使用以下命令来生成一个加密后的 32 位的密钥。

# php artisan key:generate

Application key [Lf54qK56s3qDh0ywgf9JdRxO2N0oV9qI] set successfully

现在把这个密钥放到 'app.php' 文件,如以下所示。

# vim /var/www/laravel-develop/config/app.php

Key encryption

7) 虚拟主机和所属用户

在 composer 安装好后,分配 document 根目录的权限和所属用户,如下所示。

# chmod 775 /var/www/laravel-develop/app/storage

# chown -R apache:apache /var/www/laravel-develop

用任意一款编辑器打开 apache 服务器的默认配置文件,在文件最后加上虚拟主机配置。

# vim /etc/httpd/conf/httpd.conf

ServerName laravel-develop
DocumentRoot /var/www/laravel/public

<Directory /var/www/laravel>
  AllowOverride All
</Directory>

现在我们用以下命令重启 apache 服务器,打开浏览器查看 localhost 页面。

CentOS

# systemctl restart httpd

Ubuntu

# service apache2 restart

8) Laravel 5 网络访问

打开浏览器然后输入你配置的 IP 地址或者 完整域名 Fully qualified domain name 你将会看到 Laravel 5 的默认页面。

Laravel Default

总结

Laravel 框架对于开发网页应用来说是一个绝好的的工具。所以,看了这篇文章你将学会在 Ubuntu 15 和 CentOS 7 上安装 Laravel, 之后你就可以使用这个超棒的 PHP 框架提供的各种功能和舒适便捷性来进行你的开发工作。

如果您有什么意见或者建议请在以下评论区中回复,我们将根据您宝贵的反馈来使我们的文章更加浅显易懂。


via: http://linoxide.com/linux-how-to/install-laravel-php-centos-7-ubuntu-15-04/

作者:Kashif 译者:NearTan 校对:Caroline

本文由 LCTT 原创编译,Linux中国 荣誉推出

动态主机控制协议 Dynamic Host Control Protocol (DHCP)给网络管理员提供了一种便捷的方式,为不断变化的网络主机或是动态网络提供网络层地址。其中最常用的 DHCP 服务工具是 ISC DHCP Server。DHCP 服务的目的是给主机提供必要的网络信息以便能够和其他连接在网络中的主机互相通信。DHCP 服务提供的信息包括:DNS 服务器信息,网络地址(IP),子网掩码,默认网关信息,主机名等等。

本教程介绍运行在 Debian 7.7 上 4.2.4 版的 ISC-DHCP-Server 如何管理多个虚拟局域网(VLAN),也可以非常容易应用到单一网络上。

测试用的网络是通过思科路由器使用传统的方式来管理 DHCP 租约地址的。目前有 12 个 VLAN 需要通过集中式服务器来管理。把 DHCP 的任务转移到一个专用的服务器上,路由器可以收回相应的资源,把资源用到更重要的任务上,比如路由寻址,访问控制列表,流量监测以及网络地址转换等。

另一个将 DHCP 服务转移到专用服务器的好处,以后会讲到,它可以建立动态域名服务器(DDNS),这样当主机从服务器请求 DHCP 地址的时候,这样新主机的主机名就会被添加到 DNS 系统里面。

安装和配置 ISC DHCP 服务器

1、使用 apt 工具用来安装 Debian 软件仓库中的 ISC 软件,来创建这个多宿主服务器。与其他教程一样需要使用 root 或者 sudo 访问权限。请适当的修改,以便使用下面的命令。(LCTT 译注:下面中括号里面是注释,使用的时候请删除,#表示使用的 root 权限)

# apt-get install isc-dhcp-server       [安装 the ISC DHCP Server 软件]
# dpkg --get-selections isc-dhcp-server     [确认软件已经成功安装]
# dpkg -s isc-dhcp-server           [用另一种方式确认成功安装]

Install ISC DHCP Server in Debian

2、 确认服务软件已经安装完成,现在需要提供网络信息来配置服务器,这样服务器才能够根据我们的需要来分发网络信息。作为管理员最起码需要了解的 DHCP 信息如下:

  • 网络地址
  • 子网掩码
  • 动态分配的地址范围

其他一些服务器动态分配的有用信息包括:

  • 默认网关
  • DNS 服务器 IP 地址
  • 域名
  • 主机名
  • 网络广播地址

这只是能让 ISC DHCP 服务器处理的选项中非常少的一部分。如果你想查看所有选项及其描述需要在安装好软件后输入以下命令:

# man dhcpd.conf

3、 一旦管理员已经确定了这台服务器分发的所有必要信息,那么是时候配置服务器并且分配必要的地址池了。在配置任何地址池或服务器配置之前,必须配置 DHCP 服务器侦听这台服务器上面的一个接口。

在这台特定的服务器上,设置好网卡后,DHCP 会侦听名称名为'bond0'的接口。请适根据你的实际情况来更改服务器以及网络环境。下面的配置都是针对本教程的。

Configure ISC DHCP Network

这行指定的是 DHCP 服务侦听接口(一个或多个)上的 DHCP 流量。修改主配置文件,分配适合的 DHCP 地址池到所需要的网络上。主配置文件在 /etc/dhcp/dhcpd.conf。用文本编辑器打开这个文件

# nano /etc/dhcp/dhcpd.conf

这个配置文件可以配置我们所需要的地址池/主机。文件顶部有 ‘ddns-update-style‘ 这样一句,在本教程中它设置为 ‘none‘。在以后的教程中会讲到动态 DNS,ISC-DHCP-Server 将会与 BIND9 集成,它能够使主机名更新指向到 IP 地址。

4、 接下来的部分是管理员配置全局网络设置,如 DNS 域名,默认的租约时间,IP地址,子网的掩码,以及其它。如果你想了解所有的选项,请阅读 man 手册中的 dhcpd.conf 文件,命令如下:

# man dhcpd.conf

对于这台服务器,我们需要在配置文件顶部配置一些全局网络设置,这样就不用到每个地址池中去单独设置了。

Configure ISC DDNS

我们花一点时间来解释一下这些选项,在本教程中虽然它们是一些全局设置,但是也可以单独的为某一个地址池进行配置。

  • option domain-name “comptech.local”; – 所有使用这台 DHCP 服务器的主机,都将成为 DNS 域 “comptech.local” 的一员
  • option domain-name-servers 172.27.10.6; DHCP 向所有配置这台 DHCP 服务器的的网络主机分发 DNS 服务器地址为 172.27.10.6
  • option subnet-mask 255.255.255.0; – 每个网络设备都分配子网掩码 255.255.255.0 或 /24
  • default-lease-time 3600; – 默认有效的地址租约时间(单位是秒)。如果租约时间耗尽,那么主机可以重新申请租约。如果租约完成,那么相应的地址也将被尽快回收。
  • max-lease-time 86400; – 这是一台主机所能租用的最大的租约时间(单位为秒)。
  • ping-check true; – 这是一个额外的测试,以确保服务器分发出的网络地址不是当前网络中另一台主机已使用的网络地址。
  • ping-timeout; – 在判断地址以前没有使用过前,服务器将等待 ping 响应多少秒。
  • ignore client-updates; 现在这个选项是可以忽略的,因为 DDNS 在前面已在配置文件中已经被禁用,但是当 DDNS 运行时,这个选项会忽略主机更新其 DNS 主机名的请求。

5、 文件中下面一行是权威 DHCP 所在行。这行的意义是如果服务器是为文件中所配置的网络分发地址的服务器,那么取消对该 权威关键字 authoritative stanza 的注释。

通过去掉关键字 authoritative 前面的 ‘#’,取消注释全局权威关键字。这台服务器将是它所管理网络里面的唯一权威。

Enable ISC Authoritative

默认情况下服务器被假定为不是网络上的权威服务器。之所以这样做是出于安全考虑。如果有人因为不了解 DHCP 服务的配置,导致配置不当或配置到一个不该出现的网络里面,这都将带来非常严重的连接问题。这行还可用在每个网络中单独配置使用。也就是说如果这台服务器不是整个网络的 DHCP 服务器,authoritative 行可以用在每个单独的网络中,而不是像上面截图中那样的全局配置。

6、 这一步是配置服务器将要管理的所有 DHCP 地址池/网络。简短起见,本教程只讲到配置的地址池之一。作为管理员需要收集一些必要的网络信息(比如域名,网络地址,有多少地址能够被分发等等)

以下这个地址池所用到的信息都是管理员收集整理的:网络 ID 172.27.60.0, 子网掩码 255.255.255.0 或 /24, 默认子网网关 172.27.60.1,广播地址 172.27.60.255.0 。

以上这些信息对于构建 dhcpd.conf 文件中新网络非常重要。使用文本编辑器修改配置文件添加新网络进去,这里我们需要使用 root 或 sudo 访问权限。

# nano /etc/dhcp/dhcpd.conf

Configure DHCP Pools and Networks

当前这个例子是给用 VMWare 创建的虚拟服务器分配 IP 地址。第一行显示是该网络的子网掩码。括号里面的内容是 DHCP 服务器应该提供给网络上面主机的所有选项。

第一行, range 172.27.60.50 172.27.60.254; 这一行显示的是,DHCP 服务在这个网络上能够给主机动态分发的地址范围。

第二行,option routers 172.27.60.1; 这里显示的是给网络里面所有的主机分发的默认网关地址。

最后一行, option broadcast-address 172.27.60.255; 显示当前网络的广播地址。这个地址不能被包含在要分发放的地址范围内,因为广播地址不能分配到一个主机上面。

必须要强调的是每行的结尾必须要用(;)来结束,所有创建的网络必须要在 {} 里面。

7、 如果要创建多个网络,继续创建完它们的相应选项后保存文本文件即可。配置完成以后如果有更改,ISC-DHCP-Server 进程需要重启来使新的更改生效。重启进程可以通过下面的命令来完成:

# service isc-dhcp-server restart

这条命令将重启 DHCP 服务,管理员能够使用几种不同的方式来检查服务器是否已经可以处理 dhcp 请求。最简单的方法是通过 lsof 命令来查看服务器是否在侦听67端口,命令如下:

# lsof -i :67

Check DHCP Listening Port

这里输出的结果表明 dhcpd(DHCP 服务守护进程)正在运行并且侦听67端口。由于在 /etc/services 文件中67端口的映射,所以输出中的67端口实际上被转换成了 “bootps”。

在大多数的系统中这是非常常见的,现在服务器应该已经为网络连接做好准备,我们可以将一台主机接入网络请求DHCP地址来验证服务是否正常。

测试客户端连接

8、 现在许多系统使用网络管理器来维护网络连接状态,因此这个设备应该预先配置好的,只要对应的接口处于活跃状态就能够获取 DHCP。

然而当一台设备无法使用网络管理器时,它可能需要手动获取 DHCP 地址。下面的几步将演示怎样手动获取以及如何查看服务器是否已经按需要分发地址。

ifconfig‘工具能够用来检查接口的配置。这台被用来测试的 DHCP 服务器的设备,它只有一个网络适配器(网卡),这块网卡被命名为 ‘eth0‘。

# ifconfig eth0

Check Network Interface IP Address

从输出结果上看,这台设备目前没有 IPv4 地址,这样很便于测试。我们把这台设备连接到 DHCP 服务器并发出一个请求。这台设备上已经安装了一个名为 ‘dhclient‘ 的DHCP客户端工具。因为操作系统各不相同,所以这个客户端软件也是互不一样的。

# dhclient eth0

Request IP Address from DHCP

当前 'inet addr:' 字段中显示了属于 172.27.60.0 网络地址范围内的 IPv4 地址。值得欣慰的是当前网络还配置了正确的子网掩码并且分发了广播地址。

到这里看起来还都不错,让我们来测试一下,看看这台设备收到新 IP 地址是不是由服务器发出的。这里我们参照服务器的日志文件来完成这个任务。虽然这个日志的内容有几十万条,但是里面只有几条是用来确定服务器是否正常工作的。这里我们使用一个工具 ‘tail’,它只显示日志文件的最后几行,这样我们就可以不用拿一个文本编辑器去查看所有的日志文件了。命令如下:

# tail /var/log/syslog

Check DHCP Logs

OK!服务器记录表明它分发了一个地址给这台主机 (HRTDEBXENSRV)。服务器按预期运行,给它充当权威服务器的网络分发了适合的网络地址。至此 DHCP 服务器搭建成功并且运行。如果有需要你可以继续配置其他的网络,排查故障,确保安全。

在以后的Debian教程中我会讲一些新的 ISC-DHCP-Server 功能。有时间的话我将写一篇关于 Bind9 和 DDNS 的教程,融入到这篇文章里面。


via: http://www.tecmint.com/install-and-configure-multihomed-isc-dhcp-server-on-debian-linux/

作者:Rob Turner 译者:ivo-wang 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

在建站和 web 应用程序交付方面,WordPress 是全球最大的一个平台。全球大约四分之一 的站点现在正在使用开源 WordPress 软件,包括 eBay、 Mozilla、 RackSpace、 TechCrunch、 CNN、 MTV、纽约时报、华尔街日报 等等。

最流行的个人博客平台 WordPress.com,其也运行在 WordPress 开源软件上。而 NGINX 则为 WordPress.com 提供了动力。在 WordPress.com 的用户当中,许多站点起步于 WordPress.com,然后换成了自己运行 WordPress 开源软件;它们中越来越多的站点也使用了 NGINX 软件。

WordPress 的吸引力源于其简单性,无论是对于最终用户还是安装架设。然而,当使用量不断增长时,WordPress 站点的体系结构也存在一定的问题 - 这里有几个方法,包括使用缓存,以及将 WordPress 和 NGINX 组合起来,可以解决这些问题。

在这篇博客中,我们提供了九个提速技巧来帮助你解决 WordPress 中一些常见的性能问题:

  • 缓存静态资源
  • 缓存动态文件
  • 迁移到 NGINX
  • 添加 NGINX 静态链接支持
  • 为 NGINX 配置 FastCGI
  • 为 NGINX 配置 W3TotalCache
  • 为 NGINX 配置 WP-Super-Cache
  • 为 NGINX 配置安全防范措施
  • 配置 NGINX 支持 WordPress 多站点

深入浅出讲述提升 WordPress 性能的九大秘笈

在 LAMP 架构下 WordPress 的性能

大多数 WordPress 站点都运行在传统的 LAMP 架构下:Linux 操作系统,Apache Web 服务器软件,MySQL 数据库软件(通常是一个单独的数据库服务器)和 PHP 编程语言。这些都是非常著名的,广泛应用的开源工具。在 WordPress 世界里,很多人都用的是 LAMP,所以很容易寻求帮助和支持。

当用户访问 WordPress 站点时,浏览器为每个用户创建六到八个连接来连接到 Linux/Apache 上。当用户请求连接时,PHP 即时生成每个页面,从 MySQL 数据库获取资源来响应请求。

LAMP 或许对于数百个并发用户依然能照常工作。然而,流量突然增加是常见的,并且通常这应该算是一件好事。

但是,当 LAMP 站点变得繁忙时,当同时在线的用户达到数千个时,它的瓶颈就会被暴露出来。瓶颈存在主要是两个原因:

  1. Apache Web 服务器 - Apache 的每个/每次连接需要消耗大量资源。如果 Apache 接受了太多的并发连接,内存可能会耗尽,从而导致性能急剧降低,因为数据必须交换到磁盘了。如果以限制连接数来提高响应时间,新的连接必须等待,这也导致了用户体验变得很差。
  2. PHP/MySQL 的交互 - 一个运行 PHP 和 MySQL 数据库服务器的应用服务器上每秒的请求量有一个最大限制。当请求的数量超过这个最大限制时,用户必须等待。超过这个最大限制时也会增加所有用户的响应时间。超过其两倍以上时会出现明显的性能问题。

LAMP 架构的网站出现性能瓶颈是常见的情况,这时就需要升级硬件了 - 增加 CPU,扩大磁盘空间等等。当 Apache 和 PHP/MySQL 的架构超载后,在硬件上不断的提升却跟不上系统资源指数增长的需求。

首选替代 LAMP 架构的是 LEMP 架构 – Linux, NGINX, MySQL, 和 PHP。 (这是 LEMP 的缩写,E 代表着 “engine-x.” 的发音。) 我们在 技巧 3 中会描述 LEMP 架构。

技巧 1. 缓存静态资源

静态资源是指不变的文件,像 CSS,JavaScript 和图片。这些文件往往在网页的数据中占半数以上。页面的其余部分是动态生成的,像在论坛中评论,性能仪表盘,或个性化的内容(可以看看 Amazon.com 产品)。

缓存静态资源有两大好处:

  • 更快的交付给用户 - 用户可以从它们浏览器的缓存或者从互联网上离它们最近的缓存服务器获取静态文件。有时候文件较大,因此减少等待时间对它们来说帮助很大。
  • 减少应用服务器的负载 - 从缓存中检索到的每个文件会让 web 服务器少处理一个请求。你的缓存越多,用户等待的时间越短。

要让浏览器缓存文件,需要在静态文件中设置正确的 HTTP 首部。看看 HTTP Cache-Control 首部,特别是设置了 max-age 参数,Expires 首部,以及 Entity 标记。这里 有详细的介绍。

当启用本地缓存,然后用户请求以前访问过的文件时,浏览器首先检查该文件是否在缓存中。如果在,它会询问 Web 服务器该文件是否改变过。如果该文件没有改变,Web 服务器将立即响应一个304状态码(未改变),这意味着该文件没有改变,而不是返回状态码200 OK 并检索和发送已改变的文件。

要在浏览器之外支持缓存,可以考虑下面讲到的技巧,以及考虑使用内容分发网络(CDN)。CDN 是一​​种流行且​​强大的缓存工具,但我们在这里不详细描述它。在你实现了这里讲到的其它技术之后可以考虑 CDN。此外,当你的站点从 HTTP/1.x 过渡到 HTTP/2 协议时,CDN 的用处可能不太大;根据需要调查和测试,找到你网站需要的正确方法。

如果你转向 NGINX Plus 或将开源的 NGINX 软件作为架构的一部分,建议你考虑 技巧 3,然后配置 NGINX 缓存静态资源。使用下面的配置,用你 Web 服务器的 URL 替换 www.example.com。

server {
    ### 将 www.example.com 替换为你的 URL
    server_name www.example.com;
    root /var/www/example.com/htdocs;
    index index.php;

    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;
        ### 使用你 WordPress 服务器的套接字,地址和端口来替换
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        #fastcgi_pass 127.0.0.1:9000;
    }   

    location ~* .(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
        expires max;
        log_not_found off;
        access_log off;
    }
}

技巧 2. 缓存动态文件

WordPress 动态地生成网页,这意味着每次请求时它都要生成一个给定的网页(即使和前一次的结果相同)。这意味着用户随时获得的是最新内容。

想一下,当用户访问一个帖子时,并在文章底部有用户的评论时。你希望用户能够看到所有的评论 - 即使评论刚刚发布。动态内容就是处理这种情况的。

但现在,当帖子每秒出现十几二十几个请求时。应用服务器可能每秒需要频繁生成页面导致其压力过大,造成延误。为了给用户提供最新的内容,每个访问理论上都是新的请求,因此它们不得不在原始出处等待很长时间。

为了防止页面由于不断提升的负载而变得缓慢,需要缓存动态文件。这需要减少文件的动态内容来提高整个系统的响应速度。

要在 WordPress 中启用缓存中,需要使用一些流行的插件 - 如下所述。WordPress 的缓存插件会请求最新的页面,然后将其缓存短暂时间 - 也许只有几秒钟。因此,如果该网站每秒中会有几个请求,那大多数用户获得的页面都是缓存的副本。这也有助于提高所有用户的检索时间:

  • 大多数用户获得页面的缓存副本。应用服务器没有做任何工作。
  • 用户会得到一个之前的崭新副本。应用服务器只需每隔一段时间生成一个崭新页面。当服务器产生一个崭新页面(对于缓存过期后的第一个用户访问),它这样做要快得多,因为它的请求并没有超载。

你可以缓存运行在 LAMP 架构或者 LEMP 架构 上 WordPress 的动态文件(在 技巧 3 中说明了)。有几个缓存插件,你可以在 WordPress 中使用。运用到了最流行的缓存插件和缓存技术,从最简单到最强大的:

  • Hyper-CacheQuick-Cache – 这两个插件为每个 WordPress 页面创建单个 PHP 文件。它支持绕过多个 WordPress 与数据库的连接核心处理的一些动态功能,创建一个更快的用户体验。它们不会绕过所有的 PHP 处理,所以并不会如下面那些取得同样的性能提升。它们也不需要修改 NGINX 的配置。
  • WP Super Cache – 最流行的 WordPress 缓存插件。在它易用的界面易用上提供了许多功能,如下所示。我们在 技巧 7 中展示了一个简单的 NGINX 配置实例。
  • W3 Total Cache – 这是第二流行的 WordPress 缓存插件。它比 WP Super Cache 的功能更强大,但它有些配置选项比较复杂。样例 NGINX 配置,请看 技巧 6。
  • FastCGI – CGI 的意思是 通用网关接口 Common Gateway Interface ,在因特网上发送请求和接收文件的一种通用方式。它不是一个插件,而是一种与缓存交互缓存的方法。FastCGI 可以被用在 Apache 和 Nginx 上,它也是最流行的动态缓存方法;我们在 技巧 5 中描述了如何配置 NGINX 来使用它。

这些插件和技术的文档解释了如何在典型的 LAMP 架构中配置它们。配置方式包括数据库和对象缓存;最小化 HTML、CSS 和 JavaScript;集成流行的 CDN 集成环境。对于 NGINX 的配置,请看列表中的提示技巧。

注意:缓存不会用于已经登录的 WordPress 用户,因为他们的 WordPress 页面都是不同的。(对于大多数网站来说,只有一小部分用户可能会登录)此外,大多数缓存不会对刚刚评论过的用户显示缓存页面,因为当用户刷新页面时希望看到他们的评论。若要缓存页面的非个性化内容,如果它对整体性能来说很重要,可以使用一种称为 碎片缓存(fragment caching) 的技术。

技巧 3. 使用 NGINX

如上所述,当并发用户数超过某一数量时 Apache 会导致性能问题 – 可能是数百个用户同时使用。Apache 对于每一个连接会消耗大量的资源,因而容易耗尽内存。Apache 可以配置连接数的值来避免耗尽内存,但是这意味着,超过限制时,新的连接请求必须等待。

此外,Apache 为每个连接加载一个 mod\_php 模块副本到内存中,即使只有服务于静态文件(图片,CSS,JavaScript 等)。这使得每个连接消耗更多的资源,从而限制了服务器的性能。

要解决这些问题,从 LAMP 架构迁到 LEMP 架构 – 使用 NGINX 取代 Apache 。NGINX 在一定的内存之下就能处理成千上万的并发连接数,所以你不必经历颠簸,也不必限制并发连接数到很小的数量。

NGINX 处理静态文件的性能也较好,它有内置的,容易调整的 缓存 控制策略。减少应用服务器的负载,你的网站的访问速度会更快,用户体验更好。

你可以在部署环境的所有 Web 服务器上使用 NGINX,或者你可以把一个 NGINX 服务器作为 Apache 的“前端”来进行反向代理 - NGINX 服务器接收客户端请求,将请求的静态文件直接返回,将 PHP 请求转发到 Apache 上进行处理。

对于动态页面的生成,这是 WordPress 核心体验,可以选择一个缓存工具,如 技巧 2 中描述的。在下面的技巧中,你可以看到 FastCGI,W3\_Total\_Cache 和 WP-Super-Cache 在 NGINX 上的配置示例。 (Hyper-Cache 和 Quick-Cache 不需要改变 NGINX 的配置。)

技巧 缓存通常会被保存到磁盘上,但你可以用 tmpfs 将缓存放在内存中来提高性能。

为 WordPress 配置 NGINX 很容易。仅需四步,其详细的描述在指定的技巧中:

  1. 添加永久链接的支持 - 让 NGINX 支持永久链接。此步消除了对 .htaccess 配置文件的依赖,这是 Apache 特有的。参见 技巧 4。
  2. 配置缓存 - 选择一个缓存工具并安装好它。可选择的有 FastCGI cache,W3 Total Cache, WP Super Cache, Hyper Cache, 和 Quick Cache。请看技巧 5、 6 和 7。
  3. 落实安全防范措施 - 在 NGINX 上采用对 WordPress 最佳安全的做法。参见 技巧 8。
  4. 配置 WordPress 多站点 - 如果你使用 WordPress 多站点,在 NGINX 下配置子目录,子域,或多域名架构。见 技巧9。

技巧 4. 让 NGINX 支持永久链接

许多 WordPress 网站依赖于 .htaccess 文件,此文件为 WordPress 的多个功能所需要,包括永久链接支持、插件和文件缓存。NGINX 不支持 .htaccess 文件。幸运的是,你可以使用 NGINX 的简单而全面的配置文件来实现大部分相同的功能。

你可以在你的主 server 块下添加下面的 location 块中为使用 NGINX 的 WordPress 启用 永久链接。(此 location 块在其它代码示例中也会被包括)。

try\_files 指令告诉 NGINX 检查请求的 URL 在文档根目录(/var/www/example.com/htdocs)下是作为文件($uri**)还是目录(**$uri/) 存在的。如果都不是,NGINX 将重定向到 /index.php,并传递查询字符串参数作为参数。

server {
    server_name example.com www.example.com;
    root /var/www/example.com/htdocs;
    index index.php;

    access_log /var/log/nginx/example.com.access.log;
    error_log  /var/log/nginx/example.com.error.log;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }
}

技巧 5. 在 NGINX 中配置 FastCGI

NGINX 可以缓存来自 FastCGI 应用程序的响应,如 PHP 响应。此方法可提供最佳的性能。

对于开源的 NGINX,编译入第三方模块 ngx\_cache\_purge 可以提供缓存清除能力,配置代码如下所示。NGINX Plus 已经包含了它自己实现此代码。

当使用 FastCGI 时,我们建议你安装 NGINX 辅助插件 并使用下面的配置文件,尤其是要注意 fastcgi\_cache\_key 的使用和包括 fastcgi\_cache\_purge 的 location 块。当页面发布或有改变时,有新评论被发布时,该插件会自动清除你的缓存,你也可以从 WordPress 管理控制台手动清除。

NGINX 的辅助插件还可以在你网页的底部添加一个简短的 HTML 代码,以确认缓存是否正常并显示一些统计数据。(你也可以使用 $upstreamcachestatus 确认缓存功能是否正常。)

fastcgi_cache_path /var/run/nginx-cache levels=1:2       
               keys_zone=WORDPRESS:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

server {
    server_name example.com www.example.com;
    root /var/www/example.com/htdocs;
    index index.php;

    access_log /var/log/nginx/example.com.access.log;
    error_log  /var/log/nginx/example.com.error.log;

    set $skip_cache 0;

    ### POST 请求和带有查询参数的网址应该交给 PHP
    if ($request_method = POST) {
        set $skip_cache 1;
    }   

    if ($query_string != "") {
        set $skip_cache 1;
    }   

    ### 以下 uris 中包含的部分不缓存
    if ($request_uri ~* "/wp-admin/|/xmlrpc.php|wp-.*.php|/feed/|index.php
                         |sitemap(_index)?.xml") {
        set $skip_cache 1;
    }   

    ### 不要为登录用户或最近的评论者进行缓存
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass
        |wordpress_no_cache|wordpress_logged_in") {
        set $skip_cache 1;
    }

    location / {
        try_files $uri $uri/ /index.php?$args;
    }    

    location ~ \.php$ {
        try_files $uri /index.php;
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_cache_bypass $skip_cache;
        fastcgi_no_cache $skip_cache;
        fastcgi_cache WORDPRESS;
        fastcgi_cache_valid  60m;
    }

    location ~ /purge(/.*) {
        fastcgi_cache_purge WORDPRESS "$scheme$request_method$host$1";
    }   

    location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css|rss|atom|js|jpg|jpeg|gif|png
                      |ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {

        access_log off; 
        log_not_found off;
        expires max;
    }

    location = /robots.txt {
        access_log off;
        log_not_found off;
    }

    location ~ /\. {
        deny  all; 
        access_log off;
        log_not_found off;
    }
}

技巧 6. 为 NGINX 配置 W3\_Total\_Cache

W3 Total Cache, 是 W3-Edge 的 Frederick Townes 出品的, 是一个支持 NGINX 的 WordPress 缓存框架。其有众多选项配置,可以替代 FastCGI 缓存。

这个缓存插件提供了各种缓存配置,还包括数据库和对象的缓存,最小化 HTML、CSS 和 JavaScript,并可选与流行的 CDN 整合。

这个插件会通过写入一个位于你的域的根目录的 NGINX 配置文件来控制 NGINX。

server {
    server_name example.com www.example.com;

    root /var/www/example.com/htdocs;
    index index.php;
    access_log /var/log/nginx/example.com.access.log;
    error_log  /var/log/nginx/example.com.error.log;

    include /path/to/wordpress/installation/nginx.conf;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
    }
}

技巧 7. 为 NGINX 配置 WP Super Cache

WP Super Cache 是由 Donncha O Caoimh 开发的, 他是 Automattic 的一个 WordPress 开发者, 这是一个 WordPress 缓存引擎,它可以将 WordPress 的动态页面转变成静态 HTML 文件,以使 NGINX 可以很快的提供服务。它是第一个 WordPress 缓存插件,和其它的相比,它更专注于某一特定的领域。

配置 NGINX 使用 WP Super Cache 可以根据你的喜好而进行不同的配置。以下是一个示例配置。

在下面的配置中,带有名为 supercache 的 location 块是 WP Super Cache 特有的部分。 WordPress 规则的其余代码用于不缓存已登录用户的信息,不缓存 POST 请求,并对静态资源设置过期首部,再加上标准的 PHP 处理;这部分可以根据你的需求进行定制。

server {
    server_name example.com www.example.com;
    root /var/www/example.com/htdocs;
    index index.php;

    access_log /var/log/nginx/example.com.access.log;
    error_log  /var/log/nginx/example.com.error.log debug;

    set $cache_uri $request_uri;

    ### POST 请求和带有查询字符串的网址应该交给 PHP
    if ($request_method = POST) {
        set $cache_uri 'null cache';
    }  
    if ($query_string != "") {
        set $cache_uri 'null cache';
    }   

    ### 以下 uris 中包含的部分不缓存
    if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php
                          |wp-.*.php|/feed/|index.php|wp-comments-popup.php
                          |wp-links-opml.php|wp-locations.php |sitemap(_index)?.xml
                          |[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {

        set $cache_uri 'null cache';
    }  

    ### 不对已登录用户和最近的评论者使用缓存
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+
                         |wp-postpass|wordpress_logged_in") {
        set $cache_uri 'null cache';
    }

    ### 当请求的文件存在时使用缓存,否则将请求转发给 WordPress
    location / {
        try_files /wp-content/cache/supercache/$http_host/$cache_uri/index.html 
                  $uri $uri/ /index.php;
    }    

    location = /favicon.ico {
        log_not_found off; 
        access_log off;
    }

    location = /robots.txt {
        log_not_found off
        access_log off;
    }

    location ~ .php$ {
        try_files $uri /index.php;
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        #fastcgi_pass 127.0.0.1:9000;
    }

    ### 尽可能的缓存静态文件
    location ~*.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|css
           |rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2
           |doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
        expires max;
        log_not_found off;
        access_log off;
    }
}

技巧 8. 为 NGINX 配置安全防范措施

为了防止攻击,可以控制对关键资源的访问并限制机器人对登录功能的过量攻击。

只允许特定的 IP 地址访问 WordPress 的仪表盘。

### 对访问 WordPress 的仪表盘进行限制
location /wp-admin {
    deny  192.192.9.9;
    allow 192.192.1.0/24;
    allow 10.1.1.0/16;
    deny  all;
}

只允许上传特定类型的文件,以防止恶意代码被上传和运行。

### 当上传的不是图像,视频,音乐等时,拒绝访问。
location ~* ^/wp-content/uploads/.*.(html|htm|shtml|php|js|swf)$ {
    deny all;
}

拒绝其它人访问 WordPress 的配置文件 wp-config.php。拒绝其它人访问的另一种方法是将该文件的一个目录移到域的根目录之上的目录。

### 拒绝其它人访问 wp-config.php
location ~* wp-config.php {
    deny all;
}

wp-login.php 进行限速来防止暴力破解。

### 拒绝访问 wp-login.php
location = /wp-login.php {
    limit_req zone=one burst=1 nodelay;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    #fastcgi_pass 127.0.0.1:9000;
}

技巧 9. 配置 NGINX 支持 WordPress 多站点

WordPress 多站点 WordPress Multisite ,顾名思义,这个版本 WordPress 可以让你以单个实例管理两个或多个网站。WordPress.com 运行的就是 WordPress 多站点,其主机为成千上万的用户提供博客服务。

你可以从单个域的任何子目录或从不同的子域来运行独立的网站。

使用此代码块添加对子目录的支持。

### 在 WordPress 多站点中添加对子目录结构的支持
if (!-e $request_filename) {
    rewrite /wp-admin$ $scheme://$host$uri/ permanent;  
    rewrite ^(/[^/]+)?(/wp-.*) $2 last;                     
    rewrite ^(/[^/]+)?(/.*\.php) $2 last;                   
}

使用此代码块来替换上面的代码块以添加对子目录结构的支持,替换为你自己的子目录名。

### 添加支持子域名
server_name example.com *.example.com;

旧版本(3.4以前)的 WordPress 多站点使用 readfile() 来提供静态内容。然而,readfile() 是 PHP 代码,它会导致在执行时性能会显著降低。我们可以用 NGINX 来绕过这个非必要的 PHP 处理。该代码片段在下面被(==============)线分割出来了。

### 避免对子目录中 /blogs.dir/ 结构执行  PHP readfile() 
location ^~ /blogs.dir {
    internal;
    alias /var/www/example.com/htdocs/wp-content/blogs.dir;
    access_log off;
    log_not_found off;
    expires max;
}

============================================================

### 避免对子目录中 /files/ 结构执行  PHP readfile() 
    location ~ ^(/[^/]+/)?files/(?.+) {
    try_files /wp-content/blogs.dir/$blogid/files/$rt_file /wp-includes/ms-files.php?file=$rt_file;
    access_log off;
    log_not_found off;
    expires max;
}

============================================================

### 子域路径的WPMU 文件结构
location ~ ^/files/(.*)$ {
    try_files /wp-includes/ms-files.php?file=$1 =404;
    access_log off;
    log_not_found off;
    expires max;
}

============================================================

### 映射博客 ID 到特定的目录
map $http_host $blogid {
    default           0;
    example.com       1;
    site1.example.com 2;
    site1.com         2;
}

结论

可扩展性对许多要让他们的 WordPress 站点取得成功的开发者来说是一项挑战。(对于那些想要跨越 WordPress 性能门槛的新站点而言。)为 WordPress 添加缓存,并将 WordPress 和 NGINX 结合,是不错的答案。

NGINX 不仅用于 WordPress 网站。世界上排名前 1000、10000 和 100000 网站中 NGINX 也是 遥遥领先的 web 服务器

欲了解更多有关 NGINX 的性能,请看我们最近的博客,让应用性能提升 10 倍的 10 个技巧

NGINX 软件有两个版本:

  • NGINX 开源软件 - 像 WordPress 一样,此软件你可以自行下载,配置和编译。
  • NGINX Plus - NGINX Plus 包括一个预构建的参考版本的软件,以及服务和技术支持。

想要开始,先到 nginx.org 下载开源软件并了解下 NGINX Plus


via: https://www.nginx.com/blog/9-tips-for-improving-wordpress-performance-with-nginx/

作者:Floyd Smith 译者:strugglingyouth 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

简介

PostgreSQL 是一款强大的,开源的,对象关系型数据库系统。它支持所有的主流操作系统,包括 Linux、Unix(AIX、BSD、HP-UX,SGI IRIX、Mac OS、Solaris、Tru64) 以及 Windows 操作系统。

下面是 Ubuntu 发起者 Mark Shuttleworth 对 PostgreSQL 的一段评价。

PostgreSQL 是一款极赞的数据库系统。刚开始我们在 Launchpad 上使用它的时候,并不确定它能否胜任工作。但我是错了。它很强壮、快速,在各个方面都很专业。

— Mark Shuttleworth.

在这篇简短的指南中,让我们来看看如何在 Ubuntu 15.10 服务器中安装 PostgreSQL 9.4。

安装 PostgreSQL

默认仓库中就有可用的 PostgreSQL。在终端中输入下面的命令安装它。

sudo apt-get install postgresql postgresql-contrib

如果你需要其它的版本,按照下面那样先添加 PostgreSQL 仓库然后再安装。

PostgreSQL apt 仓库 支持 amd64 和 i386 架构的 Ubuntu 长期支持版(10.04、12.04 和 14.04),以及非长期支持版(14.10)。对于其它非长期支持版,该软件包虽然没有完全支持,但使用和 LTS 版本近似的也能正常工作。

Ubuntu 14.10 系统:

新建文件/etc/apt/sources.list.d/pgdg.list

sudo vi /etc/apt/sources.list.d/pgdg.list

用下面一行添加仓库:

deb http://apt.postgresql.org/pub/repos/apt/ utopic-pgdg main

注意: 上面的库只能用于 Ubuntu 14.10。还没有升级到 Ubuntu 15.04 和 15.10。

对于 Ubuntu 14.04,添加下面一行:

deb http://apt.postgresql.org/pub/repos/apt/ trusty-pgdg main

对于 Ubuntu 12.04,添加下面一行:

deb http://apt.postgresql.org/pub/repos/apt/ precise-pgdg main

导入库签名密钥:

wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

更新软件包列表:

sudo apt-get update

然后安装需要的版本。

sudo apt-get install postgresql-9.4

访问 PostgreSQL 命令窗口

默认的数据库名称和数据库用户名称都是 “postgres”。切换到 postgres 用户进行 postgresql 相关的操作:

sudo -u postgres psql postgres

示例输出:

psql (9.4.5)
Type "help" for help.
postgres=#

要退出 postgresql 窗口,在 psql 窗口输入 \q 退出到终端。

设置 “postgres” 用户密码

登录到 postgresql 窗口,

sudo -u postgres psql postgres

用下面的命令为用户 postgres 设置密码:

postgres=# \password postgres 
Enter new password: 
Enter it again: 
postgres=# \q

要安装 PostgreSQL Adminpack 扩展,在 postgresql 窗口输入下面的命令:

sudo -u postgres psql postgres

postgres=# CREATE EXTENSION adminpack;
CREATE EXTENSION

psql 窗口输入 \q 从 postgresql 窗口退回到终端。

创建新用户和数据库

例如,让我们创建一个新的用户,名为 “senthil”,密码是 “ubuntu”,以及名为 “mydb” 的数据库。

sudo -u postgres createuser -D -A -P senthil

sudo -u postgres createdb -O senthil mydb

删除用户和数据库

要删除数据库,首先切换到 postgres 用户:

sudo -u postgres psql postgres

输入命令:

$ drop database <database-name>

要删除一个用户,输入下面的命令:

$ drop user <user-name>

配置 PostgreSQL-MD5 验证

MD5 验证 要求用户提供一个 MD5 加密的密码用于认证。首先编辑 /etc/postgresql/9.4/main/pg\_hba.conf 文件:

sudo vi /etc/postgresql/9.4/main/pg_hba.conf

按照下面所示添加或修改行

[...]
# TYPE  DATABASE        USER            ADDRESS                 METHOD
# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
host    all             all             192.168.1.0/24          md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
[...]

其中, 192.168.1.0/24 是我的本地网络 IP 地址。用你自己的地址替换。

重启 postgresql 服务以使更改生效:

sudo systemctl restart postgresql

或者,

sudo service postgresql restart

配置 PostgreSQL TCP/IP 配置

默认情况下,没有启用 TCP/IP 连接,因此其它计算机的用户不能访问 postgresql。为了允许其它计算机的用户访问,编辑文件 /etc/postgresql/9.4/main/postgresql.conf:

sudo vi /etc/postgresql/9.4/main/postgresql.conf

找到下面一行:

[...]
#listen_addresses = 'localhost'
[...]
#port = 5432
[...]

取消该行的注释,然后设置你 postgresql 服务器的 IP 地址,或者设置为 ‘*’ 监听所有用户。你应该谨慎设置所有远程用户都可以访问 PostgreSQL。

[...]
listen_addresses = '*'
[...]
port = 5432
[...]

重启 postgresql 服务保存更改:

sudo systemctl restart postgresql

或者,

sudo service postgresql restart

用 phpPgAdmin 管理 PostgreSQL

phpPgAdmin 是基于 web 用 PHP 写的 PostgreSQL 管理工具。

默认仓库中有可用的 phpPgAdmin。用下面的命令安装 phpPgAdmin:

sudo apt-get install phppgadmin

默认情况下,你可以在本地系统的 web 浏览器用 http://localhost/phppgadmin 访问 phppgadmin。

要访问远程系统,在 Ubuntu 15.10 上做如下操作:

编辑文件 /etc/apache2/conf-available/phppgadmin.conf,

sudo vi /etc/apache2/conf-available/phppgadmin.conf

找到 Require local 的一行在这行前面添加 # 注释掉它。

#Require local

添加下面的一行:

allow from all

保存并退出文件。

然后重启 apache 服务。

sudo systemctl restart apache2

对于 Ubuntu 14.10 及之前版本:

编辑 /etc/apache2/conf.d/phppgadmin:

sudo nano /etc/apache2/conf.d/phppgadmin

注释掉下面一行:

[...]
#allow from 127.0.0.0/255.0.0.0 ::1/128

取消下面一行的注释使所有系统都可以访问 phppgadmin。

allow from all

编辑 /etc/apache2/apache2.conf:

sudo vi /etc/apache2/apache2.conf

添加下面一行:

Include /etc/apache2/conf.d/phppgadmin

然后重启 apache 服务。

sudo service apache2 restart

配置 phpPgAdmin

编辑文件 /etc/phppgadmin/config.inc.php, 做以下更改。下面大部分选项都带有解释。认真阅读以便了解为什么要更改这些值。

sudo nano /etc/phppgadmin/config.inc.php

找到下面一行:

$conf['servers'][0]['host'] = '';

按照下面这样更改:

$conf['servers'][0]['host'] = 'localhost';

找到这一行:

$conf['extra_login_security'] = true;

更改值为 false

$conf['extra_login_security'] = false;

找到这一行:

$conf['owned_only'] = false;

更改值为 true

$conf['owned_only'] = true;

保存并关闭文件。重启 postgresql 服务和 Apache 服务。

sudo systemctl restart postgresql

sudo systemctl restart apache2

或者,

sudo service postgresql restart

sudo service apache2 restart

现在打开你的浏览器并导航到 http://ip-address/phppgadmin。你会看到以下截图。

phpPgAdmin

用你之前创建的用户登录。我之前已经创建了一个名为 “senthil” 的用户,密码是 “ubuntu”,因此我以 “senthil” 用户登录。

phpPgAdmin

然后你就可以访问 phppgadmin 面板了。

phpPgAdmin

用 postgres 用户登录:

phpPgAdmin

就是这样。现在你可以用 phppgadmin 可视化创建、删除或者更改数据库了。

加油!


via: http://www.unixmen.com/install-postgresql-9-4-and-phppgadmin-on-ubuntu-15-10/

作者:SK 译者:ictlyh 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Copyright (C) 2015 greenbytes GmbH

刚发布的 Apache httpd 2.4.17 终于支持 HTTP/2 了。这个页面给出了一些如何构建/部署/配置的建议。目的是为了大家发现 bugs 时能升级它,或者给一些能更好工作的建议。

最后,这会归并回到官方 Apache 文档,这里只会留下一个到那里的链接。暂时我们还没做到。

源码

你可以从这里得到 Apache 版本。Apache 2.4.17 及其更高版本都支持 HTTP/2。我不会再重复介绍如何构建该服务器的指令。在很多地方有很好的指南,例如这里

(有任何这个试验性软件包的相关链接?在 Twitter 上告诉我吧 @icing)

编译支持 HTTP/2

在你编译版本之前,你要进行一些配置。这里有成千上万的选项。和 HTTP/2 相关的是:

  • --enable-http2

启用在 Apache 服务器内部实现该协议的 ‘http2’ 模块。

  • --with-nghttp2=

指定 http2 模块需要的 libnghttp2 模块的非默认位置。如果 nghttp2 是在默认的位置,配置过程会自动采用。

  • --enable-nghttp2-staticlib-deps

很少用到的选项,你可能想将 nghttp2 库静态链接到服务器里。在大部分平台上,只有在找不到共享 nghttp2 库时才有用。

如果你想自己编译 nghttp2,你可以到 nghttp2.org 查看文档。最新的 Fedora 以及其它版本已经附带了这个库。

TLS 支持

大部分人想在浏览器上使用 HTTP/2, 而浏览器只在使用 TLS 连接(https:// 开头的 url)时才支持 HTTP/2。你需要一些我下面介绍的配置。但首先你需要的是支持 ALPN 扩展的 TLS 库。

ALPN 用来 协商 negotiate 服务器和客户端之间的协议。如果你服务器上 TLS 库还没有实现 ALPN,客户端只能通过 HTTP/1.1 通信。那么,可以和 Apache 链接并支持它的是什么库呢?

  • OpenSSL 1.0.2 及其以后。
  • ??? (别的我也不知道了)

如果你的 OpenSSL 库是 Linux 版本自带的,这里使用的版本号可能和官方 OpenSSL 版本的不同。如果不确定的话检查一下你的 Linux 版本吧。

配置

另一个给服务器的好建议是为 http2 模块设置合适的日志等级。添加下面的配置:

# 放在某个地方的这样一行
LoadModule http2_module modules/mod_http2.so

<IfModule http2_module>
    LogLevel http2:info
</IfModule>

当你启动服务器的时候,你可以在错误日志中看来类似的一行:

[timestamp] [http2:info] [pid XXXXX:tid numbers] 
  mod_http2 (v1.0.0, nghttp2 1.3.4), initializing...

协议

那么,假设你已经编译部署好了服务器, TLS 库也是最新的,你启动了你的服务器,打开了浏览器。。。你怎么知道它在工作呢?

如果除此之外你没有添加其它的服务器配置,很可能它没有工作。

你需要告诉服务器在哪里使用该协议。默认情况下,你的服务器并没有启动 HTTP/2 协议。因为这样比较安全,也许才能让你已有的部署可以继续工作。

你可以用新的 Protocols 指令启用 HTTP/2 协议:

# 对于 https 服务器
Protocols h2 http/1.1
...

# 对于 http 服务器
Protocols h2c http/1.1

你可以给整个服务器或者指定的 vhosts 添加这个配置。

SSL 参数

对于 TLS (SSL),HTTP/2 有一些特殊的要求。阅读下面的“ https:// 连接”一节了解更详细的信息。

http:// 连接 (h2c)

尽管现在还没有浏览器支持,但是 HTTP/2 协议也工作在 http:// 这样的 url 上, 而且 mod\_h[ttp]2 也支持。启用它你唯一所要做的是在 Protocols 配置中启用它:

# 对于 http 服务器
Protocols h2c http/1.1

这里有一些支持 h2c 的客户端(和客户端库)。我会在下面介绍:

curl

Daniel Stenberg 维护的用于访问网络资源的命令行客户端 curl 当然支持。如果你的系统上有 curl,有一个简单的方法检查它是否支持 http/2:

sh> curl -V
curl 7.43.0 (x86_64-apple-darwin15.0) libcurl/7.43.0 SecureTransport zlib/1.2.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz UnixSockets 

不好了。这些功能中没有 'HTTP2'。你想要的是下面这样:

sh> curl -V
url 7.45.0 (x86_64-apple-darwin15.0.0) libcurl/7.45.0 OpenSSL/1.0.2d zlib/1.2.8 nghttp2/1.3.4
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 
Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets

如果你的 curl 支持 HTTP2 功能,你可以用一些简单的命令检查你的服务器:

sh> curl -v --http2 http://<yourserver>/
...
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h2c
> HTTP2-Settings: AAMAAABkAAQAAP__
> 
< HTTP/1.1 101 Switching Protocols
< Upgrade: h2c
< Connection: Upgrade
* Received 101
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
...
<the resource>

恭喜,如果看到了有 ...101 Switching... 的行就表示它正在工作!

有一些情况不会发生 HTTP/2 的 升级切换 Upgrade 。如果你的第一个请求有 请求数据 body ,例如你上传一个文件时,就不会触发升级切换。h2c 限制部分有详细的解释。

nghttp

nghttp2 可以一同编译它自己的客户端和服务器。如果你的系统中有该客户端,你可以简单地通过获取一个资源来验证你的安装:

sh> nghttp -uv http://<yourserver>/
[  0.001] Connected
[  0.001] HTTP Upgrade request
...
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings: AAMAAABkAAQAAP__
...
[  0.005] HTTP Upgrade response
HTTP/1.1 101 Switching Protocols
Upgrade: h2c
Connection: Upgrade

[  0.006] HTTP Upgrade success
...

这和我们上面 curl 例子中看到的 Upgrade 输出很相似。

有另外一种在命令行参数中不用 -u 参数而使用 h2c 的方法。这个参数会指示 nghttp 进行 HTTP/1 升级切换过程。但如果我们不使用呢?

sh> nghttp -v http://<yourserver>/
[  0.002] Connected
[  0.002] send SETTINGS frame 
...
[  0.002] send HEADERS frame 
          ; END_STREAM | END_HEADERS | PRIORITY
          (padlen=0, dep_stream_id=11, weight=16, exclusive=0)
          ; Open new stream
          :method: GET
          :path: /
          :scheme: http
...

连接马上使用了 HTTP/2!这就是协议中所谓的 直接 direct 模式,当客户端发送一些特殊的 24 字节到服务器时就会发生:

0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a

用 ASCII 表示是:

PRI * HTTP/2.0

SM


支持 h2c 的服务器在一个新的连接中看到这些信息就会马上切换到 HTTP/2。HTTP/1.1 服务器则认为是一个可笑的请求,响应并关闭连接。

因此,直接模式只适合于那些确定服务器支持 HTTP/2 的客户端。例如,当前一个升级切换过程成功了的时候。

直接模式的魅力是零开销,它支持所有请求,即使带有请求数据部分(查看h2c 限制)。

对于 2.4.17 版本,明文连接时默认启用 H2Direct 。但是有一些模块和这不兼容。因此,在下一版本中,默认会设置为off,如果你希望你的服务器支持它,你需要设置它为:

H2Direct on

https:// 连接 (h2)

当你的 mod\_h[ttp]2 可以支持 h2c 连接时,那就可以一同启用 h2 兄弟了,现在的浏览器仅支持它和 https: 一同使用。

HTTP/2 标准对 https:(TLS)连接增加了一些额外的要求。上面已经提到了 ALNP 扩展。另外的一个要求是不能使用特定黑名单中的加密算法。

尽管现在版本的 mod\_h[ttp]2 不增强这些算法(以后可能会),但大部分客户端会这么做。如果让你的浏览器使用不恰当的算法打开 h2 服务器,你会看到不明确的警告 INADEQUATE\_SECURITY,浏览器会拒接连接。

一个可行的 Apache SSL 配置类似:

SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK
SSLProtocol All -SSLv2 -SSLv3
...

(是的,这确实很长。)

这里还有一些应该调整,但不是必须调整的 SSL 配置参数:SSLSessionCacheSSLUseStapling 等,其它地方也有介绍这些。例如 Ilya Grigorik 写的一篇超赞的博客: 高性能浏览器网络

curl

再次回到 shell 使用 curl(查看上面的“curl h2c”章节了解要求),你也可以通过 curl 用简单的命令检测你的服务器:

sh> curl -v --http2 https://<yourserver>/
...
* ALPN, offering h2
* ALPN, offering http/1.1
...
* ALPN, server accepted to use h2
...
<the resource>

恭喜你,能正常工作啦!如果还不能,可能原因是:

  • 你的 curl 不支持 HTTP/2。查看上面的“检测 curl”一节。
  • 你的 openssl 版本太低不支持 ALPN。
  • 不能验证你的证书,或者不接受你的算法配置。尝试添加命令行选项 -k 停用 curl 中的这些检查。如果可以工作,就重新配置你的 SSL 和证书。

nghttp

我们已经在 h2c 讨论过 nghttp。如果你用它来进行 https: 连接,你会看到类似下面的信息:

sh> nghttp https://<yourserver>/
[ERROR] HTTP/2 protocol was not selected. (nghttp2 expects h2)

这有两种可能,你可以通过添加 -v 来检查。如果是:

sh> nghttp -v https://<yourserver>/
[  0.034] Connected
[ERROR] HTTP/2 protocol was not selected. (nghttp2 expects h2)

这意味着你服务器使用的 TLS 库没有实现 ALPN。有时候正确安装有点困难。多看看 Stackoverflow 吧。

你看到的也可能是:

sh> nghttp -v https://<yourserver>/
[  0.034] Connected
The negotiated protocol: http/1.1
[ERROR] HTTP/2 protocol was not selected. (nghttp2 expects h2)

这表示 ALPN 能正常工作,但并没有用 h2 协议。你需要像上面介绍的那样检查你服务器上的 Protocols 配置。如果一开始在 vhost 部分设置不能正常工作,试着在通用部分设置它。

Firefox

更新: Apache Lounge 的 Steffen Land 告诉我 Firefox 上有个 HTTP/2 指示插件。你可以看到有多少地方用到了 h2(提示:Apache Lounge 用 h2 已经有一段时间了...)

你可以在 Firefox 浏览器中打开开发者工具,在那里的网络标签页查看 HTTP/2 连接。当你打开了 HTTP/2 并重新刷新 html 页面时,你会看到类似下面的东西:

在响应头中,你可以看到奇怪的 X-Firefox-Spdy 条目中列出了 “h2”。这表示在这个 https: 连接中使用了 HTTP/2。

Google Chrome

在 Google Chrome 中,你在开发者工具中看不到 HTTP/2 指示器。相反,Chrome 用特殊的地址 chrome://net-internals/#http2 给出了相关信息。(LCTT 译注:Chrome 已经有一个 “HTTP/2 and SPDY indicator” 可以很好的在地址栏识别 HTTP/2 连接)

如果你打开了一个服务器的页面,可以在 Chrome 中查看那个 net-internals 页面,你可以看到类似下面这样:

如果你的服务器在上面的列表中,就表示它正在工作。

Microsoft Edge

Windows 10 中 Internet Explorer 的继任者 Edge 也支持 HTTP/2。你也可以在开发者工具的网络标签页看到 HTTP/2 协议。

Safari

在 Apple 的 Safari 中,打开开发者工具,那里有个网络标签页。重新加载你的服务器上的页面,并在开发者工具中选择显示了加载的那行。如果你启用了在右边显示详细视图,看 Status 部分。那里显示了 HTTP/2.0 200,像这样:

重新协商

https: 连接重新协商是指正在运行的连接中特定的 TLS 参数会发生变化。在 Apache httpd 中,你可以在 directory 配置中改变 TLS 参数。如果进来一个获取特定位置资源的请求,配置的 TLS 参数会和当前的 TLS 参数进行对比。如果它们不相同,就会触发重新协商。

这种最常见的情形是算法变化和客户端证书。你可以要求客户访问特定位置时需要通过验证,或者对于特定资源,你可以使用更安全的、对 CPU 压力更大的算法。

但不管你的想法有多么好,HTTP/2 中都不可以发生重新协商。在同一个连接上会有 100 多个请求,那么重新协商该什么时候做呢?

对于这种配置,现有的 mod\_h[ttp]2 还没有办法。如果你有一个站点使用了 TLS 重新协商,别在上面启用 h2!

当然,我们会在后面的版本中解决这个问题,然后你就可以安全地启用了。

限制

非 HTTP 协议

实现除 HTTP 之外协议的模块可能和 mod\_http2 不兼容。这在其它协议要求服务器首先发送数据时无疑会发生。

NNTP 就是这种协议的一个例子。如果你在服务器中配置了 mod\_nntp\_like\_ssl,那么就不要加载 mod\_http2。等待下一个版本。

h2c 限制

h2c 的实现还有一些限制,你应该注意:

在虚拟主机中拒绝 h2c

你不能对指定的虚拟主机拒绝 h2c 直连。连接建立而没有看到请求时会触发直连,这使得不可能预先知道 Apache 需要查找哪个虚拟主机。

有请求数据时的升级切换

对于有数据的请求,h2c 升级切换不能正常工作。那些是 PUT 和 POST 请求(用于提交和上传)。如果你写了一个客户端,你可能会用一个简单的 GET 或者 OPTIONS * 来处理那些请求以触发升级切换。

原因从技术层面来看显而易见,但如果你想知道:在升级切换过程中,连接处于半疯状态。请求按照 HTTP/1.1 的格式,而响应使用 HTTP/2 帧。如果请求有一个数据部分,服务器在发送响应之前需要读取整个数据。因为响应可能需要从客户端处得到应答用于流控制及其它东西。但如果仍在发送 HTTP/1.1 请求,客户端就仍然不能以 HTTP/2 连接。

为了使行为可预测,几个服务器在实现上决定不在任何带有请求数据的请求中进行升级切换,即使请求数据很小。

302 时的升级切换

有重定向发生时,当前的 h2c 升级切换也不能工作。看起来 mod\_http2 之前的重写有可能发生。这当然不会导致断路,但你测试这样的站点也许会让你迷惑。

h2 限制

这里有一些你应该意识到的 h2 实现限制:

连接重用

HTTP/2 协议允许在特定条件下重用 TLS 连接:如果你有带通配符的证书或者多个 AltSubject 名称,浏览器可能会重用现有的连接。例如:

你有一个 a.example.org 的证书,它还有另外一个名称 b.example.org。你在浏览器中打开 URL https://a.example.org/,用另一个标签页加载 https://b.example.org/

在重新打开一个新的连接之前,浏览器看到它有一个到 a.example.org 的连接并且证书对于 b.example.org 也可用。因此,它在第一个连接上面发送第二个标签页的请求。

这种连接重用是刻意设计的,它使得使用了 HTTP/1 切分 sharding 来提高效率的站点能够不需要太多变化就能利用 HTTP/2。

Apache mod\_h[ttp]2 还没有完全实现这点。如果 a.example.orgb.example.org 是不同的虚拟主机, Apache 不会允许这样的连接重用,并会告知浏览器状态码 421 Misdirected Request。浏览器会意识到它需要重新打开一个到 b.example.org 的连接。这仍然能工作,只是会降低一些效率。

我们期望下一次的发布中能有合适的检查。

Münster, 12.10.2015,

Stefan Eissing, greenbytes GmbH

Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. See LICENSE for details.


该项目由 icing 维护。


via: https://icing.github.io/mod_h2/howto.html

作者:icing 译者:ictlyh 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

大家好,本文的主题是 Redis,我们将要在 CentOS 7 上安装它。编译源代码,安装二进制文件,创建、安装文件。在安装了它的组件之后,我们还会配置 redis ,就像配置操作系统参数一样,目标就是让 redis 运行的更加可靠和快速。

Runnins Redis

Redis 服务器

Redis 是一个开源的多平台数据存储软件,使用 ANSI C 编写,直接在内存使用数据集,这使得它得以实现非常高的效率。Redis 支持多种编程语言,包括 Lua, C, Java, Python, Perl, PHP 和其他很多语言。redis 的代码量很小,只有约3万行,它只做“很少”的事,但是做的很好。尽管是在内存里工作,但是数据持久化的保存还是有的,而redis 的可靠性就很高,同时也支持集群,这些可以很好的保证你的数据安全。

构建 Redis

redis 目前没有官方 RPM 安装包,我们需要从源代码编译,而为了要编译就需要安装 Make 和 GCC。

如果没有安装过 GCC 和 Make,那么就使用 yum 安装。

yum install gcc make

官网下载 tar 压缩包。

curl http://download.redis.io/releases/redis-3.0.4.tar.gz -o redis-3.0.4.tar.gz

解压缩。

tar zxvf redis-3.0.4.tar.gz

进入解压后的目录。

cd redis-3.0.4

使用Make 编译源文件。

make

安装

进入源文件的目录。

cd src

复制 Redis 的服务器和客户端到 /usr/local/bin。

cp redis-server redis-cli /usr/local/bin

最好也把 sentinel,benchmark 和 check 复制过去。

cp redis-sentinel redis-benchmark redis-check-aof redis-check-dump /usr/local/bin

创建redis 配置文件夹。

mkdir /etc/redis

/var/lib/redis 下创建有效的保存数据的目录

mkdir -p /var/lib/redis/6379

系统参数

为了让 redis 正常工作需要配置一些内核参数。

配置 vm.overcommit_memory 为1,这可以避免数据被截断,详情见此

sysctl -w vm.overcommit_memory=1

修改 backlog 连接数的最大值超过 redis.conf 中的 tcp-backlog 值,即默认值511。你可以在kernel.org 找到更多有关基于 sysctl 的 ip 网络隧道的信息。

sysctl -w net.core.somaxconn=512

取消对透明巨页内存(transparent huge pages)的支持,因为这会造成 redis 使用过程产生延时和内存访问问题。

echo never > /sys/kernel/mm/transparent_hugepage/enabled

redis.conf

redis.conf 是 redis 的配置文件,然而你会看到这个文件的名字是 6379.conf ,而这个数字就是 redis 监听的网络端口。如果你想要运行超过一个的 redis 实例,推荐用这样的名字。

复制示例的 redis.conf 到 /etc/redis/6379.conf

cp redis.conf /etc/redis/6379.conf

现在编辑这个文件并且配置参数。

vi /etc/redis/6379.conf

daemonize

设置 daemonize 为 no,systemd 需要它运行在前台,否则 redis 会突然挂掉。

daemonize no

pidfile

设置 pidfile/var/run/redis_6379.pid

pidfile /var/run/redis_6379.pid

port

如果不准备用默认端口,可以修改。

port 6379

loglevel

设置日志级别。

loglevel notice

logfile

修改日志文件路径。

logfile /var/log/redis_6379.log

dir

设置目录为 /var/lib/redis/6379

dir /var/lib/redis/6379

安全

下面有几个可以提高安全性的操作。

Unix sockets

在很多情况下,客户端程序和服务器端程序运行在同一个机器上,所以不需要监听网络上的 socket。如果这和你的使用情况类似,你就可以使用 unix socket 替代网络 socket,为此你需要配置 port 为0,然后配置下面的选项来启用 unix socket。

设置 unix socket 的套接字文件。

 unixsocket /tmp/redis.sock

限制 socket 文件的权限。

unixsocketperm 700

现在为了让 redis-cli 可以访问,应该使用 -s 参数指向该 socket 文件。

redis-cli -s /tmp/redis.sock

requirepass

你可能需要远程访问,如果是,那么你应该设置密码,这样子每次操作之前要求输入密码。

requirepass "bTFBx1NYYWRMTUEyNHhsCg"

rename-command

想象一下如下指令的输出。是的,这会输出服务器的配置,所以你应该在任何可能的情况下拒绝这种访问。

CONFIG GET *

为了限制甚至禁止这条或者其他指令可以使用 rename-command 命令。你必须提供一个命令名和替代的名字。要禁止的话需要设置替代的名字为空字符串,这样禁止任何人猜测命令的名字会比较安全。

rename-command FLUSHDB "FLUSHDB_MY_SALT_G0ES_HERE09u09u"
rename-command FLUSHALL ""
rename-command CONFIG "CONFIG_MY_S4LT_GO3S_HERE09u09u"

Access Redis through unix with password and command changes

使用密码通过 unix socket 访问,和修改命令

快照

默认情况下,redis 会周期性的将数据集转储到我们设置的目录下的 dump.rdb 文件。你可以使用 save 命令配置转储的频率,它的第一个参数是以秒为单位的时间帧,第二个参数是在数据文件上进行修改的数量。

每隔15分钟并且最少修改过一次键。

save 900 1

每隔5分钟并且最少修改过10次键。

save 300 10

每隔1分钟并且最少修改过10000次键。

save 60 10000

文件 /var/lib/redis/6379/dump.rdb 包含了从上次保存以来内存里数据集的转储数据。因为它先创建临时文件然后替换之前的转储文件,这里不存在数据破坏的问题,你不用担心,可以直接复制这个文件。

开机时启动

你可以使用 systemd 将 redis 添加到系统开机启动列表。

复制示例的 init\_script 文件到 /etc/init.d,注意脚本名所代表的端口号。

cp utils/redis_init_script /etc/init.d/redis_6379

现在我们要使用 systemd,所以在 /etc/systems/system 下创建一个单位文件名字为 redis_6379.service

vi /etc/systemd/system/redis_6379.service

填写下面的内容,详情可见 systemd.service。

[Unit]
Description=Redis on port 6379

[Service]
Type=forking
ExecStart=/etc/init.d/redis_6379 start
ExecStop=/etc/init.d/redis_6379 stop

[Install]
WantedBy=multi-user.target

现在添加我之前在 /etc/sysctl.conf 里面修改过的内存过量使用和 backlog 最大值的选项。

vm.overcommit_memory = 1

net.core.somaxconn=512

对于透明巨页内存支持,并没有直接 sysctl 命令可以控制,所以需要将下面的命令放到 /etc/rc.local 的结尾。

echo never > /sys/kernel/mm/transparent_hugepage/enabled

总结

这样就可以启动了,通过设置这些选项你就可以部署 redis 服务到很多简单的场景,然而在 redis.conf 还有很多为复杂环境准备的 redis 选项。在一些情况下,你可以使用 replicationSentinel 来提高可用性,或者将数据分散在多个服务器上,创建服务器集群。

谢谢阅读。


via: http://linoxide.com/storage/install-redis-server-centos-7/

作者:Carlos Alberto 译者:ezio 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出