分类 技术 下的文章

网站是我们生活中重要的一部分。它们是实现扩大业务、分享知识以及其它更多功能的方式。早期受制于只能提供静态内容,随着动态客户端和服务器端脚本语言的引入和现有静态语言的持续改进,例如从 html 到 html5,动态网站成为可能,剩下的也许在不久的将来也会实现。

对于网站,随之而来的是需要一个能向全球大规模用户显示站点的某个东西。这个需求可以通过托管网站的服务器实现。这包括一系列的服务器,例如:Apache HTTP Server、Joomla 以及 允许个人拥有自己网站的 WordPress。

Apache htaccess 小技巧

25 个 htaccess 小技巧

想要拥有一个网站,可以创建一个自己的本地服务器,或者联系任何上面提到的或其它服务器管理员来托管他的网站。但实际问题也从这点开始。网站的性能主要取决于以下因素:

  • 网站消耗的带宽。
  • 面对黑客,网站有多安全。
  • 对数据库进行数据检索时的优化。
  • 显示导航菜单和提供更多 UI 功能时的用户友好性。

除此之外,保证托管网站服务器成功的多种因素还包括:

  • 对于一个流行站点的数据压缩量。
  • 同时为多个对请求同一或不同站点的用户服务的能力。
  • 保证网站上输入的机密数据安全,例如:Email、信用卡信息等等。
  • 允许更多的选项用于增强站点的动态性。

这篇文章讨论一个服务器提供的用于增强网站性能和提高针对坏机器人、热链等的安全性的功能:‘.htaccess’ 文件。

.htaccess 是什么?

htaccess (hypertext access,超文本访问) 是为网站所有者提供用于控制服务器环境变量以及其它参数的选项,从而增强他们网站的功能的文件。这些文件可以在网站目录树的任何一个目录中,并向该目录以及目录中的文件和子目录提供功能。

这些功能是什么呢?其实这些是服务器的指令,例如命令服务器执行特定任务的行,这些命令只对该文件所在目录中的文件和子目录有效。这些文件默认是隐藏的,因为所有操作系统和网站服务器默认配置为忽略它们,但如果查看隐藏文件的话,你就可以看到这些特殊文件。后续章节的话题将讨论能控制什么类型的参数。

注意:如果 .htaccess 文件保存在 /apache/home/www/Gunjit/ 目录,那么它会向该目录中的所有文件和子目录提供命令,但如果该目录包含一个名为 /Gunjit/images/ 子目录,且该子目录中也有一个 .htaccess 文件,那么这个子目录中的命令会覆盖父目录中 .htaccess 文件(或者目录层次结构中更上层的文件)提供的命令。

Apache Server 和 .htaccess 文件

Apache HTTP Server 俗称为 Apache,是为了表示对一个有卓越战争策略技能的美洲土著部落的尊敬而命名。它基于 NCSA HTTPd 服务器 ,是用 C/C++ 和 XML 建立的跨平台 Web 服务器,它在万维网的成长和发展中起到了关键作用。

它最常用于 UNIX,但 Apache 也能用于多种平台,包括 FreeBSD、Linux、Windows、Mac OS、Novel Netware 等。在 2009 年,Apache 成为第一个为超过一亿站点提供服务的服务器。

Apache 服务器可以让 www/ 目录中的每个用户有一个单独的 .htaccess 文件。尽管这些文件是隐藏的,但如果需要的话可以使它们可见。在 www/ 目录中可以有很多子目录,每个子目录通过用户名或所有者名称命名,包含了一个站点。除此之外你可以在每个子目录中有一个 .htaccess 文件,像之前所述用于配置子目录中的文件。

下面介绍如果配置 Apache 服务器上的 htaccess 文件。

Apache 服务器上的配置

这里有两种情况:

在自己的服务器上托管网站

在这种情况下,如果没有启用 .htaccess 文件,你可以通过在 http.conf(Apache HTTP 守护进程的默认配置文件) 中找到 部分启用。

<Directory "/var/www/htdocs">

定位如下行

AllowOverride None 

更改为

AllowOverride All

现在,重启 Apache 后就启用了 .htaccess。

在不同的托管服务提供商的服务器上托管网站

在这种情况下最好咨询托管管理员,如果他们允许访问 .htaccess 文件的话。

用于网站的 25 个 Apache Web 服务器 ‘.htaccess’ 小技巧

1. 如何在 .htaccess 文件中启用 mod\_rewrite

mod\_rewrite 选项允许你使用重定向并通过重定向到其它 URL 来隐藏你真实的 URL。这个选项非常有用,允许你用短的容易记忆的 URL 替换长 URL。

要允许 mod\_rewrite,只需要在你的 .htaccess 文件的第一行添加如下一行。

Options +FollowSymLinks

该选项允许你跟踪符号链接从而在站点中启用 modrewrite。后面会介绍用短 URL 替换。(LCTT 译注:+FollowSymLinks 只是启用 modrewrite 的前提之一,还需要在全局和虚拟机中设置 RewriteEngine on 才能启用重写模块。)

2. 如何允许或禁止对站点的访问

通过使用 order、allow 和 deny 关键字,htaccess 文件可以允许或者禁止对站点或目录中子目录或文件的访问。

只允许 IP 192.168.3.1 的访问

Order Allow, Deny
Deny from All
Allow from 192.168.3.1

或

Order Allow, Deny
Allow from 192.168.3.1

这里的 Order 关键字指定处理 allow 和 deny 访问的顺序。对于上面的 ‘Order’ 语句,首先会处理 Allow 语句,然后是 deny 语句。

只禁止某个 IP 的访问

下面一行的意思是除了 IP 地址 192.168.3.1,允许所有用户访问网站。

Order Allow, Deny
Deny from 192.168.3.1
Allow from All

或

Order Deny, Allow
Deny from 192.168.3.1

3. 为不同错误码生成 Apache 错误文档

用简单几行,我们可以解决当用户/客户端请求一个站点上不可用的网页时服务器产生的错误码的错误文档,例如我们大部分人见过的浏览器中显示的 ‘404 Page not found’。‘.htaccess’ 文件指定了发生这些错误情况时采取何种操作。

要做到这点,需要添加下面的行到 ‘.htaccess’ 文件:

ErrorDocument <error-code> <path-of-document/string-representing-html-file-content>

‘ErrorDocument’ 是一个关键字,error-code 可以是 401、403、404、500 或任何有效的表示错误的代码,最后 ‘path-of-document’ 表示本地机器上的路径(如果你使用的是你自己的本地服务器) 或服务器上的路径(如果你使用任何其它服务器来托管网站)。

例子:

ErrorDocument 404 /error-docs/error-404.html

上面一行设置客户请求任何无效页面,服务器报告 404 错误时显示 error-docs 目录下的 ‘error-404.html’ 文档。

<html><head><title>404 Page not found</title></head><body><p>The page you request is not present. Check the URL you have typed</p></body></html> 

上面的表示也正确,其中字符串相当于一个普通的 html 文件。

4. 设置/取消 Apache 服务器环境变量

在 .htaccess 文件中你可以设置或者取消站点所有者可以更改的全局环境变量。要设置或取消环境变量,你需要在你的 .htaccess 文件中添加下面的行。

设置环境变量

SetEnv OWNER “Gunjit Khera”

取消环境变量

UnsetEnv OWNER

5. 为文件定义不同 MIME 类型

MIME(多用途 Internet 多媒体扩展)是浏览器运行任何页面所默认识别的类型。你可以在 .htaccess 文件中为你的站点定义 MIME 类型,然后服务器就可以识别你定义类型的文件并运行。

<IfModule mod_mime.c>
    AddType application/javascript      js
    AddType application/x-font-ttf      ttf ttc
</IfModule>

这里,mod\_mime.c 是用于控制定义不同 MIME 类型的模块,如果在你的系统中已经安装了这个模块,那么你就可以用该模块去为你站点中不同的扩展名定义不同的 MIME 类型,从而让服务器可以理解这些文件。

6. 如何在 Apache 中限制上传和下载的大小

.htaccess 文件允许你能够控制某个用户从你的站点(通过 PHP)单次上传数据量的大小(LCTT 译注:原文有误,修改)。要做到这点你只需要添加下面的行到你的 .htaccess 文件:

php_value upload_max_filesize 20M
php_value post_max_size 20M
php_value max_execution_time 200
php_value max_input_time 200

上面的行设置最大上传大小、最大POST 提交数据大小、最长执行时间(例如,允许用户在他的本地机器上单次执行一个请求的最大时间)、限制的最大输入时间。

7. 让用户不能在你的站点上在线播放 .mp3 和其它文件

大部分情况下,人们在下载检查音乐质量之前会在网站上播放等等。作为一个聪明的销售者,你可以添加一个简单的功能,不允许任何用户在线播放音乐或视频,而是必须下载完成后才能播放。这非常有用,因为(无缓冲的)在线播放音乐和视频会消耗很多带宽。

要添加下面的行到你的 .htaccess 文件:

AddType application/octet-stream .mp3 .zip 

8. 为站点设置目录索引

大部分网站开发者都知道第一个显示的页面是哪个,例如一个站点的首页,被命名为 ‘index.html’。我们大部分也见过这个。但是如何设置呢?

.htaccess 文件提供了一种方式用于列出一个客户端请求访问网站的主页面时会顺序扫描的一些网页集合,相应地如果找到了列出的页面中的任何一个就会作为站点的主页面并显示给用户。

需要添加下面的行产生所需的效果。

DirectoryIndex index.html index.php yourpage.php

上面一行指定如果有任何访问首页的请求到来,首先会在目录中顺序搜索上面列出的网页:如果发现了 index.html 则显示为主页面,否则会找下一个页面,例如 index.php,如此直到你在列表中输入的最后一个页面。

9. 如何为文件启用 GZip 压缩以节省网站带宽

繁忙的站点通常比只占少量空间的轻量级站点运行更慢,这是常见的现象。因为对于繁忙的站点需要时间加载巨大的脚本文件和图片以在客户端的 Web 浏览器上显示。

通常的机制是这样的,当浏览器请求一个 web 页面时,服务器提供给浏览器该页面,并在浏览器端显示该 web 页面,浏览器需要下载该页面并运行页面内的脚本。

这里 GZip 压缩所做的就是节省单个用户的服务时间而不用增加带宽。服务器上站点的源文件以压缩形式保存,当用户请求到来的时候,这些文件以压缩形式传送,然后在客户端上解压(LCTT 译注:原文此处有误)。这改善了带宽限制。

下面的行允许你压缩站点的源文件,但要求在你的服务器上安装 mod\_deflate.c 模块。

<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/plain
    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/xml
    AddOutputFilterByType DEFLATE application/html
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE application/x-javascript
</IfModule>

10. 处理文件类型

服务器默认的有一些特定情况。例如:在服务器上运行 .php 文件,显示 .txt 文件。像这些我们可以以源代码形式只显示一些可执行 cgi 脚本或文件而不是执行它们(LCTT 译注:这是为了避免攻击者通过上传恶意脚本,进而在服务器上执行恶意脚本进行破坏和窃取)。

要做到这点在 .htaccess 文件中有如下行。

RemoveHandler cgi-script .php .pl .py
AddType text/plain .php .pl .py

这些行告诉服务器只显示而不执行 .pl (perl 脚本)、.php (PHP 文件) 和 .py (Python 文件) 。

11. 为 Apache 服务器设置时区

从 .htaccess 文件可用于为服务器设置时区可以看出它的能力和重要性。这可以通过设置一个服务器为每个托管站点提供的一系列全局环境变量中的 ‘TZ’ 完成。

由于这个原因,我们可以在网站上看到根据我们的时区显示的时间。也许服务器上其他拥有网站的人会根据他居住地点的位置设置时区。

下面的一行为服务器设置时区。

SetEnv TZ India/Kolkata

12. 如果在站点上启用缓存控制

浏览器很有趣的一个功能是,很多时间你可以看到,当多次同时打开一个网站和第一次打开相比前者会更快。但为什么会这样呢?事实上,浏览器在它的缓存中保存了一些通常访问的页面用于加快后面的访问。

但保存多长时间呢?这取决于你自己。例如,你的 .htaccess 文件中设置的缓存控制时间。.htaccess 文件指定了站点的网页可以在浏览器缓存中保存的时间,时间到期后需要重新验证缓存,页面可能会从缓存中删除然后在下次用户访问站点的时候重建。

下面的行为你的站点实现缓存控制。

<FilesMatch "\.(ico|png|jpeg|svg|ttf)$">
    Header Set Cache-Control "max-age=3600, public"
</FilesMatch>
<FilesMatch "\.(js|css)$">
    Header Set Cache-Control "public"
    Header Set Expires "Sat, 24 Jan 2015 16:00:00 GMT"
</FilesMatch>

上面的行允许缓存 .htaccess 文件所在目录中的页面一小时。

13. 配置单个文件

通常 .htaccess 文件中的内容会对该文件所在目录中的所有文件和子目录起作用,但是你也可以对特殊文件设置一些特殊权限,例如只禁止对某个文件的访问等等。

要做到这点,你需要在文件中以类似方式添加 标记:

<files conf.html="">
Order allow, deny
Deny from 188.100.100.0
</files>

这是一个禁止 IP 188.100.100.0 访问 ‘conf.html’ 的简单例子,但是你也可以添加介绍过的 .htaccess 文件的任何功能,包括将要介绍的功能,例如:缓存控制、GZip 压缩。

大部分服务器会用这个功能增强 .htaccess 文件的安全,这也是我们在浏览器上看不到 .htaccess 文件的原因。在后面的章节中会介绍如何给文件授权。

14. 启用在 cgi-bin 目录以外运行 CGI 脚本

通常服务器运行的 CGI 脚本都保存在 cgi-bin 目录中,但是你可以在你需要的目录运行 CGI 脚本,只需要在所需的目录中的 .htaccess 文件添加下面的行,如果没有该文件就创建一个,并添加下面的行:

AddHandler cgi-script .cgi
Options +ExecCGI

15.如何用 .htaccess 在站点上启用 SSI

服务器端包括(SSI)顾名思义是和服务器部分相关的东西。这是什么呢?通常当我们在站点上有很多页面的时候,我们在主页上会有一个显示到其它页面链接的导航菜单,我们可以启用 SSI 选项允许导航菜单中显示的所有页面完全包含在主页面中。

SSI 允许多个页面包含同样的内容,因此只需要编辑一个文件就行,从而可以节省很多磁盘空间。对于 .shtml 文件,服务器默认启用了该选项。

如果你想要对 .html 启用该选项,你需要添加下面的行:

AddHandler server-parsed .html

这样 html 文件中如下部分会被替换为 SSI。

<!--#inlcude virtual="gk/document.html"-->

16. 如何防止网站列出目录列表

为防止任何客户端在本地机器罗列服务器上的网站目录列表,添加下面的行到你不想列出的目录的文件中。

Options -Indexes

17. 更改默认字符集和语言头

.htaccess 文件允许你更改网站使用的字符集,例如 ASCII 或 UNICODE,UTF-8 等,以及用于显示内容的默认语言。

在服务器的全局环境变量之后添加下面语句可以实现上述功能。

AddDefaultCharset UTF-8
DefaultLanguage en-US

18. 重定向一个非 www URL 到 www URL

在开始解释之前,首先看看如何启用该功能,添加下列行到 .htaccess 文件。

RewriteEngine ON
RewriteCond %{HTTP_HOST} ^abc\.net$
RewriteRule (.*) http://www.abc.net/$1 [R=301,L]

上面的行启用重写引擎,然后在第二行检查所有涉及到主机 abc.net 或 环境变量 HTTP\_HOST 为 “abc.net” 的 URL。

对于所有这样的 URL,代码永久重定向它们(如果启用了 R=301 规则)到新 URL http://www.abc.net/$1,其中 $1 是主机为 abc.net 的非 www URL。非 www URL 是大括号内的内容,并通过 $1 引用。

重写 URL 的重定向规则

重写功能简单的说,就是用短而易记的 URL 替换长而难以记忆的 URL。但是,在开始这个话题之前,这里有一些本文后面会使用的特殊字符的规则和约定。

特殊符号:

符号              含义
^         -     字符串开头
$         -     字符串结尾
|         -     或 [a|b] : a 或 b
[a-z]     -     a 到 z 的任意字母
+         -     之前字母的一次或多次出现
*         -     之前字母的零次或多次出现
?         -     之前字母的零次或一次出现

常量和它们的含义:

常量          含义
NC          -   区分大小写
L           -   最后的规则 – 停止处理后面规则
R           -   临时重定向到新 URL
R=301       -   永久重定向到新 URL
F           -   禁止发送 403 头给用户
P           -   代理 - 获取远程内容代替部分并返回
G           -   Gone, 不再存在
S=x         -   跳过后面的 x 条规则
T=mime-type -   强制指定 MIME 类型
E=var:value -   设置环境变量 var 的值为 value
H=handler   -   设置处理器
PT          -   Pass through - 用于 URL 还有额外的头
QSA         -   将查询字符串追加到替换 URL 

19. 重定向整个站点到 https

下面的行会帮助你转换整个网站到 https:

RewriteEngine ON
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

上面的行启用重写引擎,然后检查环境变量 HTTPS 的值。如果设置了那么重写所有网站页面到 https。

20.一个自定义重写例子

例如,重定向 url ‘http://www.abc.net?p=100&q=20’ 到 ‘http://www.abc.net/10020pq’。

RewriteEngine ON
RewriteRule ^http://www.abc.net/([0-9]+)([0-9]+)pq$ ^http://www.abc.net?p=$1&q=$2

在上面的行中,$1 表示第一个括号,$2 表示第二个括号。

21. 重命名 htaccess 文件

为了防止入侵者和其他人查看 .htaccess 文件,你可以重命名该文件,这样就不能通过客户端浏览器访问。实现该目标的语句是:

AccessFileName  htac.cess

22. 如何为你的网站禁用图片盗链

网站带宽消耗比较大的另外一个重要问题是盗链问题,这是其它站点用于显示你网站的图片而链接到你的网站的链接,这会消耗你的带宽。这问题也被成为 ‘带宽盗窃’。

一个常见现象是当一个网站要显示其它网站所包含的图片时,由于该链接需要从你的网站加载内容,消耗你站点的带宽而为其它站点显示图片。为了防止出现这种情况,比如对于 .gif、.jpeg 图片等,下面的代码行会有所帮助:

RewriteEngine ON
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERERER} !^http://(www\.)?mydomain.com/.*$ [NC]
RewriteRule \.(gif|jpeg|png)$ - [F].

上面的行检查 HTTP\_REFERER 是否没有设为空或没有设为你站点上的任何链接。如果是这样的话,你网页上的所有图片会用 403 禁止访问代替。

23. 如何将用户重定向到维护页面

如果你的网站需要进行维护并且你想向所有需要访问该网站的你的所有客户通知这个消息,对于这种情况,你可以添加下面的行到你的 .htaccess 文件,从而只允许管理员访问并替换所有访问 .jpg、.css、.gif、.js 等的页面内容。

RewriteCond %{REQUEST_URI} !^/admin/ [NC]
RewriteCond %{REQUEST_URI} !^((.*).css|(.*).js|(.*).png|(.*).jpg)    [NC]
RewriteRule ^(.*)$ /ErrorDocs/Maintainence_Page.html [NC,L,U,QSA]

这些行检查请求 URL 是否包含任何例如以 ‘/admin/’ 开头的管理页面的请求,或任何到 ‘.png, .jpg, .js, .css’ 页面的请求,对于任何这样的请求,用 ‘ErrorDocs/Maintainence\_Page.html’ 替换那个页面。

24. 映射 IP 地址到域名

名称服务器是将特定 IP 地址转换为域名的服务器。这种映射也可以在 .htaccess 文件中用以下形式指定。

# 为了将IP地址 L.M.N.O 映射到域名 www.hellovisit.com
RewriteCond %{HTTP_HOST} ^L\.M\.N\.O$ [NC]
RewriteRule ^(.*)$ http://www.hellovisit.com/$1 [L,R=301]

上面的行检查任何页面的主机是否包含类似 L.M.N.O 的 IP 地址,如果是的话第三行会通过永久重定向将页面映射到域名 http://www.hellovisit.com

25. FilesMatch 标签

类似用于应用条件到单个文件的 标签, 能用于匹配一组文件并对该组文件应用一些条件,如下:

<FilesMatch “\.(png|jpg)$”>
Order Allow, Deny 
Deny from All
</FilesMatch>

结论

.htaccess 文件能实现的小技巧还有很多。这告诉了我们这个文件有多么强大,通过该文件能给你的站点添加多少安全性、动态性以及其它功能。

我们已经在这篇文章中尽最大努力覆盖尽可能多的 htaccess 小技巧,但如果我们缺少了任何重要的技巧,或者你愿意告诉我们你的 htaccess 想法和技巧,你可以在下面的评论框中提交,我们也会在文章中进行介绍。


via: http://www.tecmint.com/apache-htaccess-tricks/

作者:Gunjit Khera 译者:ictlyh 校对:wxy

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

MySQL 是一个强大的开源关系数据库管理系统(简称 RDBMS)。它发布于 1995 年(20年前)。它采用结构化查询语言(SQL),这可能是数据库内容管理中最流行的选择。最新的 MySQL 版本是 5.6.25,于 2015 年 5 月 29 日发布。

关于 MySQL 一个有趣的事实是它的名字来自于 Michael Widenius(MySQL 的创始人)的女儿“ My”。尽管有许多关于 MySQL 有趣的传闻,不过本文主要是向你展示一些有用的实践,以帮助你管理你的 MySQL 服务器。

MySQL 性能优化

MySQL 性能优化

2009 年 4 月,MySQL 被 Oracle 收购。其结果是MySQL 社区分裂,创建了一个叫 MariaDB 的分支 。创建该分支的主要原因是为了保持这个项目可以在 GPL 下的自由。

今天,MySQL 和 MariaDB 是用于类似 WordPress、Joomla、Magento 和其他 web 应用程序的最流行的 RDMS 之一(如果不是最多的)。

这篇文章将告诉你一些基本的,但非常有用的关于如何优化 MySQL/MariaDB 性能的技巧。注意,本文假定您已经安装了 MySQL 或 MariaDB。如果你仍然不知道如何在系统上安装它们,你可以按照以下说明去安装:

重要提示: 在开始之前,不要盲目的接受这些建议。每个 MySQL 设置都是不同的,在进行任何更改之前需要慎重考虑。

你需要明白这些:

  • MySQL/MariaDB 配置文件位于 /etc/my.cnf。 每次更改此文件后你需要重启 MySQL 服务,以使更改生效。
  • 这篇文章使用 MySQL 5.6 版本。

1. 启用 InnoDB 的每张表一个数据文件设置

首先,有一个重要的解释, InnoDB 是一个存储引擎。MySQL 和 MariaDB 使用 InnoDB 作为默认存储引擎。以前,MySQL 使用系统表空间来保存数据库中的表和索引。这意味着服务器唯一的目的就是数据库处理,它们的存储盘不用于其它目的。

InnoDB 提供了更灵活的方式,它把每个数据库的信息保存在一个 .ibd 数据文件中。每个 .idb 文件代表它自己的表空间。通过这样的方式可以更快地完成类似 “TRUNCATE” 的数据库操作,当删除或截断一个数据库表时,你也可以回收未使用的空间。

这样配置的另一个好处是你可以将某些数据库表放在一个单独的存储设备。这可以大大提升你磁盘的 I/O 负载。

MySQL 5.6及以上的版本默认启用 innodb_file_per_table。你可以在 /etc/my.cnf 文件中看到。该指令看起来是这样的:

innodb_file_per_table=1

2. 将 MySQL 数据库数据存储到独立分区上

注意:此设置只在 MySQL 上有效, 在 MariaDB 上无效。

有时候操作系统的读/写会降低你 MySQL 服务器的性能,尤其是如果操作系统和数据库的数据位于同一块磁盘上。因此,我建议你使用单独的磁盘(最好是 SSD)用于 MySQL 服务。

要完成这步,你需要将新的磁盘连接到你的计算机/服务器上。对于这篇文章,我假定磁盘挂在到 /dev/sdb。

下一步是准备新的分区:

# fdisk /dev/sdb

现在按 “N” 来创建新的分区。接着按 “P”,使其创建为主分区。在此之后,从 1-4 设置分区号。之后,你可以选择分区大小。这里按 enter。在下一步,你需要配置分区的大小。

如果你希望使用全部的磁盘,再按一次 enter。否则,你可以手动设置新分区的大小。准备就绪后按 “w” 保存更改。现在,我们需要为我们的新分区创建一个文件系统。这可以用下面命令轻松地完成:

# mkfs.ext4 /dev/sdb1

现在我们会挂载新分区到一个目录。我在根目录下创建了一个名为 “ssd” 的目录:

# mkdir /ssd/

挂载新分区到刚才创建的目录下:

# mount /dev/sdb1  /ssd/

你可以在 /etc/fstab 文件中添加如下行设置为开机自动挂载:

/dev/sdb1 /ssd ext3 defaults 0 0

现在我们将 MySQL 移动到新磁盘中

首先停止 MySQL 服务:

# service mysqld stop

我建议你​​同时停止 Apache/nginx,以防止任何试图写入数据库的操作:

# service httpd stop
# service nginx stop

现在复制整个 MySQL 目录到新分区中:

# cp /var/lib/mysql /ssd/ -Rp

这可能需要一段时间,具体取决于你的 MySQL 数据库的大小。一旦这个过程完成后重命名 MySQL 目录:

# mv /var/lib/mysql /var/lib/mysql-backup

然后创建一个符号链接:

# ln -s /ssd/mysql /var/lib/mysql

现在启动你的 MySQL 和 web 服务:

# service mysqld start
# service httpd start
# service nginx start

以后你的数据库将使用新的磁盘访问。

3. 优化使用 InnoDB 的缓冲池

InnoDB 引擎在内存中有一个缓冲池用于缓存数据和索引。这当然有助于你更快地执行 MySQL/MariaDB 查询语句。选择合适的内存大小需要一些重要的决策并对系统的内存消耗有较多的认识。

下面是你需要考虑的:

  • 其它的进程需要消耗多少内存。这包括你的系统进程,页表,套接字缓冲。
  • 你的服务器是否专门用于 MySQL 还是你运行着其它非常消耗内存的服务。

在一个专用的机器上,你可能会把 60-70% 的内存分配给 innodb_buffer_pool_size。如果你打算在一个机器上运行更多的服务,你应该重新考虑专门用于 innodb_buffer_pool_size 的内存大小。

你需要设置 my.cnf 中的此项:

innodb_buffer_pool_size

4. 在 MySQL 中避免使用 Swappiness

“交换”是一个当系统移动部分内存到一个称为 “交换空间” 的特殊磁盘空间时的过程。通常当你的系统用完物理内存后就会出现这种情况,系统将信息写入磁盘而不是释放一些内存。正如你猜测的磁盘比你的内存要慢得多。

该选项默认情况下是启用的:

# sysctl vm.swappiness 

vm.swappiness = 60

运行以下命令关闭 swappiness:

# sysctl -w vm.swappiness=0

5. 设置 MySQL 的最大连接数

max_connections 指令告诉你当前你的服务器允许多少并发连接。MySQL/MariaDB 服务器允许有 SUPER 权限的用户在最大连接之外再建立一个连接。只有当执行 MySQL 请求的时候才会建立连接,执行完成后会关闭连接并被新的连接取代。

请记住,太多的连接会导致内存的使用量过高并且会锁住你的 MySQL 服务器。一般小网站需要 100-200 的连接数,而较大可能需要 500-800 甚至更多。这里的值很大程度上取决于你 MySQL/MariaDB 的使用情况。

你可以动态地改变 max_connections 的值而无需重启MySQL服务器:

# mysql -u root -p
mysql> set global max_connections = 300;

6. 配置 MySQL 的线程缓存数量

thread_cache_size 指令用来设置你服务器缓存的线程数量。当客户端断开连接时,如果当前线程数小于 thread_cache_size,它的线程将被放入缓存中。下一个请求通过使用缓存池中的线程来完成。

要提高服务器的性能,你可以设置 thread_cache_size 的值相对高一些。你可以通过以下方法来查看线程缓存命中率:

mysql> show status like 'Threads_created';
mysql> show status like 'Connections';

你可以用以下公式来计算线程池的命中率:

100 - ((Threads_created / Connections) * 100)

如果你得到一个较低的数字,这意味着大多数 mysql 连接使用新的线程,而不是从缓存加载。在这种情况下,你需要增加 thread_cache_size

这里有一个好处是可以动态地改变 thread_cache_size 而无需重启 MySQL 服务。你可以通过以下方式来实现:

mysql> set global thread_cache_size = 16;

7. 禁用 MySQL 的 DNS 反向查询

默认情况下当新的连接出现时,MySQL/MariaDB 会进行 DNS 查询解析用户的 IP 地址/主机名。对于每个客户端连接,它的 IP 都会被解析为主机名。然后,主机名又被反解析为 IP 来验证两者是否一致。

当 DNS 配置错误或服务器出现问题时,这很可能会导致延迟。这就是为什么要关闭 DNS 的反向查询的原因,你可以在你的配置文件中添加以下选项去设定:

[mysqld]
# Skip reverse DNS lookup of clients
skip-name-resolve

更改后你需要重启 MySQL 服务。

8. 配置 MySQL 的查询缓存容量

如果你有很多重复的查询并且数据不经常改变 – 请使用缓存查询。 人们常常不理解 query_cache_size 的实际含义而将此值设置为 GB 级,这实际上会降低服务器的性能。

背后的原因是,在更新过程中线程需要锁定缓存。通常设置为 200-300 MB应该足够了。如果你的网站比较小的,你可以尝试给 64M 并在以后及时去增加。

在你的 MySQL 配置文件中添加以下设置:

query_cache_type = 1
query_cache_limit = 256K
query_cache_min_res_unit = 2k
query_cache_size = 80M

9. 配置临时表容量和内存表最大容量

tmp_table_sizemax_heap_table_size 这两个变量的大小应该相同,它们可以让你避免磁盘写入。tmp_table_size 是内置内存表的最大空间。如果表的大小超出限值将会被转换为磁盘上的 MyISAM 表。

这会影响数据库的性能。管理员通常建议在服务器上设置这两个值为每 GB 内存给 64M。

[mysqld]
tmp_table_size= 64M
max_heap_table_size= 64M

10. 启用 MySQL 慢查询日志

记录慢查询可以帮助你定位数据库中的问题并帮助你调试。这可以通过在你的 MySQL 配置文件中添加以下值来启用:

slow-query-log = 1
slow-query-log-file = /var/lib/mysql/mysql-slow.log
long_query_time = 1

第一个变量启用慢查询日志,第二个告诉 MySQL 实际的日志文件存储位置。使用 long_query_time 来定义完成 MySQL 查询多少用时算长。

11. 检查 MySQL 的空闲连接

空闲连接会消耗资源,可以的话应该被终止或者刷新。空闲连接是指处于 “sleep” 状态并且保持了很长一段时间的连接。你可以通过运行以下命令查看空闲连接:

# mysqladmin processlist -u root -p | grep “Sleep”

这会显示处于睡眠状态的进程列表。当代码使用持久连接到数据库时会出现这种情况。使用 PHP 调用 mysql\_pconnect 可以打开这个连接,执行完查询之后,删除认证信息并保持连接为打开状态。这会导致每个线程的缓冲都被保存在内存中,直到该线程结束。

首先你要做的就是检查代码问题并修复它。如果你不能访问正在运行的代码,你可以修改 wait_timeout 变量。默认值是 28800 秒,而你可以安全地将其降低到 60 :

wait_timeout=60

12. 为 MySQL 选择正确的文件系统

选择正确的文件系统对数据库至关重要。在这里你需要考虑的最重要的事情是 - 数据的完整性,性能和易管理性。

按照 MariaDB 的建议,最好的文件系统是XFS、ext4 和 Btrfs。它们都是可以使用超大文件和大容量存储卷的企业级日志型文件系统。

下面你可以找到一些关于这三个文件系统的有用信息:

文件系统XFSExt4Btrfs
文件系统最大容量8EB1EB16EB
最大文件大小8EB16TB16EB

我们的这篇文章详细介绍了 Linux 文件系统的利与弊: Linux 文件系统解析

13. 设置 MySQL 允许的最大数据包

MySQL 把数据拆分成包。通常一个包就是发送到客户端的一行数据。max_allowed_pa​​cket 变量定义了可以被发送的最大的包。

此值设置得过低可能会导致查询速度变得非常慢,然后你会在 MySQL 的错误日志看到一个错误。建议将该值设置为最大包的大小。

14. 测试 MySQL 的性能优化

你应该定期检查 MySQL/MariaDB 的性能。这将帮助你了解资源的使用情况是否发生了改变或需要进行改进。

有大量的测试工具可用,但我推荐你一个简单易用的。该工具被称为 mysqltuner。

使用下面的命令下载并运行它:

# wget https://github.com/major/MySQLTuner-perl/tarball/master
# tar xf master
# cd major-MySQLTuner-perl-993bc18/
# ./mysqltuner.pl 

你将收到有关 MySQL 使用的详细报告和推荐提示。下面是默认 MariaDB 安装的输出样例:

MySQL 性能优化

15. 优化和修复 MySQL 数据库

有时候 MySQL/MariaDB 数据库中的表很容易崩溃,尤其是服务器意外关机、文件系统突然崩溃或复制过程中仍然访问数据库。幸运的是,有一个称为 'mysqlcheck' 的免费开源工具,它会自动检查、修复和优化 Linux 中数据库的所有表。

# mysqlcheck -u root -p --auto-repair --check --optimize --all-databases
# mysqlcheck -u root -p --auto-repair --check --optimize databasename

就是这些!我希望上述文章对你有用,并帮助你优化你的 MySQL 服务器。一如往常,如果你有任何疑问或评论,请在下面的评论部分提交。


via: http://www.tecmint.com/mysql-mariadb-performance-tuning-and-optimization/

作者:Marin Todorov 译者:strugglingyouth 校对:ictlyh

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

DNF即Dandified YUM,是基于RPM的Linux发行版的下一代软件包管理工具。它首先在Fedora 18中出现,并且在最近发行的Fedora 22中替代了YUM工具集

DNF致力于改善YUM的瓶颈,即性能、内存占用、依赖解决、速度和许多其他方面。DNF使用RPM、libsolv和hawkey库进行包管理。尽管它并未预装在CentOS和RHEL 7中,但您可以通过yum安装,并同时使用二者。

您也许想阅读更多关于DNF的信息:

最新的DNF稳定版本是2015年5月11日发布的1.0(在写这篇文章之前)。它(以及所有DNF之前版本)主要由Python编写,并以GPL v2许可证发布。

安装DNF

尽管Fedora 22官方已经过渡到了DNF,但DNF并不在RHEL/CentOS 7的默认仓库中。

为了在RHEL/CentOS系统中安装DNF,您需要首先安装和开启epel-release仓库。

# yum install epel-release
或
# yum install epel-release -y

尽管并不建议在使用yum时添上'-y'选项,因为最好还是看看什么将安装在您的系统中。但如果您对此并不在意,则您可以使用'-y'选项以自动化的安装而无需用户干预。

接下来,使用yum命令从epel-realease仓库安装DNF包。

# yum install dnf

在您装完dnf后,我会向您展示27个实用的dnf命令和例子,以便帮您更容易和高效的管理基于RPM包的发行版。

1. 检查DNF版本

检查您的系统上安装的DNF版本。

# dnf --version

检查DNF版本

2. 列出启用的DNF仓库

dnf命令中的'repolist'选项将显示您系统中所有启用的仓库。

# dnf repolist

检查所有开启的仓库

3. 列出所有启用和禁用的DNF仓库

'repolist all'选项将显示您系统中所有启用/禁用的仓库。

# dnf repolist all

列出所有启用/禁用的仓库

4. 用DNF列出所有可用的且已安装的软件包

'dnf list'命令将列出所有仓库中所有可用的软件包和您Linux系统中已安装的软件包。

# dnf list

用DNF列出所有的软件包

5. 用DNF列出所有已安装的软件包

尽管'dnf list'命令将列出所有仓库中所有可用的软件包和已安装的软件包。然而像下面一样使用'list installed'选项将只列出已安装的软件包。

# dnf list installed

列出已安装的软件包

6. 用DNF列出所有可用的软件包

类似的,可以用'list available'选项列出所有开启的仓库中所有可用的软件包。

# dnf list available

用DNF列出可用的软件包

7. 使用DNF查找软件包

如果您不太清楚您想安装的软件包的名字,这种情况下,您可以使用'search'选项来搜索匹配该字符(例如,nano)和字符串的软件包。

# dnf search nano

通过关键字搜索软件包

8. 查看哪个软件包提供了某个文件/子软件包?

dnf的选项'provides'能查找提供了某个文件/子软件包的软件包名。例如,如果您想找找哪个软件包提供了您系统中的'/bin/bash'文件,可以使用下面的命令

# dnf provides /bin/bash

查找提供文件的软件包

9. 使用DNF获得一个软件包的详细信息

如果您想在安装一个软件包前知道它的详细信息,您可以使用'info'来获得一个软件包的详细信息,例如:

# dnf info nano

用DNF查看软件信息

10. 使用DNF安装软件包

想安装一个叫nano的软件包,只需运行下面的命令,它会为nano自动的解决和安装所有的依赖。

# dnf install nano

用DNF安装软件

11. 使用DNF更新一个软件包

您可能只想更新一个特定的包(例如,systemd)并且保留系统内剩余软件包不变。

# dnf update systemd

更新一个软件包

12. 使用DNF检查系统更新

检查系统中安装的所有软件包的更新可以简单的使用如下命令:

# dnf check-update

检查系统更新

13. 使用DNF更新系统中所有的软件包

您可以使用下面的命令来更新整个系统中所有已安装的软件包。

# dnf update
或
# dnf upgrade

更新系统

14. 使用DNF来移除/删除一个软件包

您可以在dnf命令中使用'remove'或'erase'选项来移除任何不想要的软件包。

# dnf remove nano
或
# dnf erase nano

移除系统中的软件

15. 使用DNF移除于依赖无用的软件包(Orphan Packages)

这些为了满足依赖安装的软件包在相应的程序删除后便不再需要了。可以用过下面的命令来将它们删除。

# dnf autoremove

移除无用的依赖包

16. 使用DNF移除缓存的软件包

我们在使用dnf时经常会碰到过期的头部信息和不完整的事务,它们会导致错误。我们可以使用下面的语句清理缓存的软件包和包含远程包信息的头部信息。

# dnf clean all

移除DNF缓存

17. 获得特定DNF命令的帮助

您可能需要特定的DNF命令的帮助(例如,clean),可以通过下面的命令来得到:

# dnf help clean

获得某一命令帮助

18. 列出所有DNF的命令和选项

要显示所有dnf的命令和选项,只需要:

# dnf help

获得命令选项帮助

19. 查看DNF的历史记录

您可以调用'dnf history'来查看已经执行过的dnf命令的列表。这样您便可以知道什么被安装/移除及其时间戳。

# dnf history

查看历史记录

20. 显示所有软件包组

'dnf grouplist'命令可以显示所有可用的或已安装的软件包,如果没有什么输出,则它会列出所有已知的软件包组。

# dnf grouplist

列出所有软件包组

21. 使用DNF安装一个软件包组

要安装一组由许多软件打包在一起的软件包组(例如,Educational Softaware),只需要执行:

# dnf groupinstall 'Educational Software'

安装一个软件包组

22. 更新一个软件包组

可以通过下面的命令来更新一个软件包组(例如,Educational Software):

# dnf groupupdate 'Educational Software'

更新软件包组

23. 移除一个软件包组

可以使用下面的命令来移除一个软件包组(例如,Educational Software):

# dnf groupremove 'Educational Software'

移除软件包组

24. 从某个特定的仓库安装一个软件包

DNF可以从任何特定的仓库(比如 epel)安装一个软件包(例如,phpmyadmin):

# dnf --enablerepo=epel install phpmyadmin

从特定的仓库安装软件

25. 将已安装的软件包同步到稳定发行版

'dnf distro-sync'将同步所有已安装的软件包到所有开启的仓库中最近的稳定版本。如果没有选择软件包,则会同步所有已安装的软件包。

# dnf distro-sync

将包同步至稳定版

26. 重新安装一个软件包

'dnf reinstall nano'命令将重新安装一个已经安装的软件包(例如,nano):

# dnf reinstall nano

重新安装软件包

27. 降级一个软件包

选项'downgrade'将会使一个软件包(例如,acpid)回退到低版本。

# dnf downgrade acpid

示例输出

Using metadata from Wed May 20 12:44:59 2015
No match for available package: acpid-2.0.19-5.el7.x86_64
Error: Nothing to do.

我观察到:dnf不会按预想的那样降级一个软件包。这已做为一个bug被提交。

结论

DNF是YUM管理器的优秀替代品。它试着自动做许多甚至不推荐有经验的Linux系统管理员做的工作。例如:

  • --skip-broken不被DNF识别,并且DNF中没有其替代命令。
  • 尽管您可能会运行dnf provides,但再也没有'resolvedep'命令了。
  • 没有'deplist'命令用来发现软件包依赖。
  • 您排除一个仓库意味着在所有操作上排除该仓库,而在yum中,排除一个仓库只在安装和升级等时刻排除他们。

许多Linux用户对于Linux生态系统的走向不甚满意。首先Systemd替换了init系统v,现在DNF将于不久后替换YUM,首先是Fedora 22,接下来是RHEL和CentOS。

您怎么看呢?是不是发行版和整个Linux生态系统并不注重用户并且在朝着与用户愿望相悖的方向前进呢?IT行业里有这样一句话 - “如果没有坏,为什么要修呢?”,System V和YUM都没有坏。

上面便是这篇文章的全部了。请在下方留言以让我了解您的宝贵想法。点赞和分享以帮助我们传播。谢谢!


via: http://www.tecmint.com/dnf-commands-for-fedora-rpm-package-management/

作者:Avishek Kumar 译者:wwy-hust 校对:wxy

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

curl -s 'https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md' | egrep -o '<code>\w+</code>' | tr -d '`' | cowsay -W50

流畅地使用命令行是一个常被忽略的技能,或被认为是神秘的奥义。但是,它会以明显而微妙的方式改善你作为工程师的灵活度和生产力。这是我在 Linux 上工作时发现的有用的命令行使用小窍门和笔记的精粹。有些小窍门是很基础的,而有些是相当地特别、复杂、或者晦涩难懂。这篇文章不长,但是如果你可以使用并记得这里的所有内容,那么你就懂得很多了。

其中大部分最初出现Quora上,但是考虑到兴趣所在,似乎更应该放到 Github 上,这里的人比我更能提出改进建议。如果你看到一个错误,或者更好的某种东西,请提交问题或 PR!(当然,提交前请看看必读小节和已有的 PR/Issue。)

必读

范围:

  • 本文是针对初学者和专业人员的,选题目标是覆盖面广(全都很重要)、有针对性(大多数情况下都给出具体实例)而简洁(避免不必要内容以及你能在其它地方轻松找到的离题的内容)。每个小窍门在某种情形下都很必需的,或者能比替代品大大节省时间。
  • 这是为 Linux 写的。绝大部分条目都可以同样应用到 MacOS(或者甚至 Cygwin)。
  • 主要针对交互式 Bash,尽管大多数小窍门也可以应用到其它 shell,以及常规 Bash 脚本。
  • 包括了“标准的”UNIX 命令以及那些需要安装的软件包(它们很重要,值得安装)。

注意:

  • 为了能在一篇文章内展示尽量多的东西,一些具体的信息会被放到引用页里。你可以使用 Google 来获得进一步的内容。(如果需要的话,)你可以使用 apt-get/yum/dnf/pacman/pip/brew 来安装这些新的程序。
  • 使用 Explainshell 来获取命令、参数、管道等内容的解释。

基础

  • 学习基本 Bash 技能。实际上,键入man bash,然后至少浏览一遍所有内容;它很容易理解,没那么长。其它 shell 也不错,但是 Bash 很强大,而且到处都可以找到(如果在你自己的笔记本上学习 zsh、fish 之类,会在很多情形下受到限制,比如使用现存的服务器时)。
  • 至少学好一种基于文本的编辑器。理想的一个是 Vim(vi),因为在终端中编辑时随时都能找到它(即使大多数时候你在使用 Emacs、一个大型的 IDE、或一个现代的时髦编辑器)。
  • 学习怎样使用 man 来阅读文档(好奇的话,用 man man 来列出分区号,比如 1 是常规命令,5 是文件描述,8 用于管理员)。用 apropos 找到帮助页。了解哪些命令不是可执行程序,而是 Bash 内置的,你可以用 helphelp -d 得到帮助。
  • 学习使用 >< 来进行输出和输入重定向,以及使用 | 来管道重定向,学习关于 stdout 和 stderr 的东西。
  • 学习 *(也许还有 ?{...} )文件通配扩展和应用,以及双引号 " 和单引号 ' 之间的区别。(更多内容请参看下面关于变量扩展部分)。
  • 熟悉 Bash 作业管理:&ctrl-zctrl-cjobsfgbgkill 等等。
  • 掌握ssh,以及通过 ssh-agentssh-add 等进行无密码验证的基础技能。
  • 基本的文件管理:lsls -l(特别是,知道ls -l各个列的意义),lessheadtailtail -f(或者更好的less +F),lnln -s(知道硬链接和软链接的区别,以及硬链接相对于软链接的优势),chownchmoddu(用于查看磁盘使用率的快速摘要:du -sk *)。文件系统管理:dfmountfdiskmkfslsblk
  • 基本的网络管理: ipifconfigdig
  • 熟知正则表达式,以及各种使用grep/egrep的选项。-i-o-A-B 选项值得掌握。
  • 学会使用 apt-getyumdnfpacman(这取决于你的发行版)来查找并安装软件包。确保你可以用 pip 来安装基于 Python 的命令行工具(下面的一些东西可以很容易地通过 pip 安装)。

日常使用

  • 在Bash中,使用 tab 补完参数,使用 ctrl-r 来搜索命令历史。
  • 在Bash中,使用 ctrl-w 来删除最后的单词,使用 ctrl-u 来删除整行,返回行首。使用 alt-balt-f 来逐词移动,使用 ctrl-k 来清除到行尾的内容,以及使用 ctrl-l 清屏。参见 man readline 来查看 Bash 中所有默认的键盘绑定,有很多。例如,alt-. 可以循环显示先前的参数,而alt- 扩展通配。(LCTT 译注:关于 Bash 下的快捷键,可以参阅: </article-5660-1.html> )
  • 另外,如果你喜欢 vi 风格的键盘绑定,可以使用 set -o vi
  • 要查看最近用过的命令,请使用 history 。 有许多缩写形式,比如 !$(上次的参数)和!!(上次的命令),虽然使用 ctrl-ralt-. 更容易些。(LCTT 译注:关于历史扩展功能,可以参阅: </article-5658-1.html> )
  • 返回先前的工作目录: cd -
  • 如果你命令输入到一半,但是改变主意了,可以敲 alt-# 来添加一个 # 到开头,然后将该命令作为注释输入(或者使用快捷键 ctrl-a#enter 输入)。然后,你可以在后面通过命令历史来回到该命令。
  • 使用 xargs(或 parallel),它很强大。注意,你可以控制每行(-L)执行多少个项目,以及并行执行(-P)。如果你不确定它是否会做正确的事情,可以首先使用 xargs echo。同时,使用 -I{} 也很方便。样例:
  find . -name '*.py' | xargs grep some_function
  cat hosts | xargs -I{} ssh root@{} hostname
  • pstree -p 对于显示进程树很有帮助。
  • 使用 pgreppkill 来按名称查找进程或给指定名称的进程发送信号(-f 很有帮助)。
  • 掌握各种可以发送给进程的信号。例如,要挂起进程,可以使用 kill -STOP [pid]。完整的列表可以查阅 man 7 signal
  • 如果你想要一个后台进程一直保持运行,使用 nohupdisown
  • 通过 netstat -lntpss -plat 检查哪些进程在监听(用于 TCP,对 UDP 使用 -u 替代 -t)。
  • lsof来查看打开的套接字和文件。
  • 在 Bash 脚本中,使用 set -x 调试脚本输出。尽可能使用严格模式。使用 set -e 在遇到错误时退出。也可以使用 set -o pipefail,对错误进行严格处理(虽然该话题有点微妙)。对于更复杂的脚本,也可以使用 trap
  • 在 Bash 脚本中,子 shell(写在括号中的)是组合命令的便利的方式。一个常见的例子是临时移动到一个不同的工作目录,如:
  # 在当前目录做些事
  (cd /some/other/dir; other-command)
  # 继续回到原目录
  • 注意,在 Bash 中有大量的各种各样的变量扩展。检查一个变量是否存在:${name:?error message}。例如,如果一个Bash脚本要求一个单一参数,只需写 input_file=${1:?usage: $0 input_file}。算术扩展:i=$(( (i + 1) % 5 ))。序列: {1..10}。修剪字符串:${var%suffix}${var#prefix}。例如,if var=foo.pdf ,那么 echo ${var%.pdf}.txt 会输出 foo.txt
  • 命令的输出可以通过 <(some command) 作为一个文件来处理。例如,将本地的 /etc/hosts 和远程的比较:
  diff /etc/hosts <(ssh somehost cat /etc/hosts)
  • 了解 Bash 中的“嵌入文档”,就像在 cat <<EOF ... 中。
  • 在 Bash 中,通过:some-command >logfile 2>&1 同时重定向标准输出和标准错误。通常,要确保某个命令不再为标准输入打开文件句柄,而是将它捆绑到你所在的终端,添加 </dev/null 是个不错的做法。
  • man ascii 可以得到一个不错的ASCII表,带有十六进制和十进制值两种格式。对于常规编码信息,man unicodeman utf-8man latin1 将很有帮助。
  • 使用 screentmux 来复用屏幕,这对于远程 ssh 会话尤为有用,使用它们来分离并重连到会话。另一个只用于保持会话的最小可选方案是 dtach
  • 在 ssh 中,知道如何使用 -L-D(偶尔也用-R)来打开端口通道是很有用的,如从一台远程服务器访问网站时。
  • 为你的 ssh 配置进行优化很有用;例如,这个 ~/.ssh/config 包含了可以避免在特定网络环境中连接被断掉的情况的设置、使用压缩(这对于通过低带宽连接使用 scp 很有用),以及使用一个本地控制文件来开启到同一台服务器的多通道:
  TCPKeepAlive=yes
  ServerAliveInterval=15
  ServerAliveCountMax=6
  Compression=yes
  ControlMaster auto
  ControlPath /tmp/%r@%h:%p
  ControlPersist yes
  • 其它一些与 ssh 相关的选项对会影响到安全,请小心开启,如各个子网或主机,或者在信任的网络中:StrictHostKeyChecking=noForwardAgent=yes
  • 要获得八进制格式的文件的权限,这对于系统配置很有用而用 ls 又没法查看,而且也很容易搞得一团糟,可以使用像这样的东西:
  stat -c '%A %a %n' /etc/timezone
  • 对于从另一个命令的输出结果中交互选择值,可以使用percol
  • 对于基于另一个命令(如git)输出的文件交互,可以使用fpp (路径选择器)。
  • 要为当前目录(及子目录)中的所有文件构建一个简单的 Web 服务器,让网络中的任何人都可以获取,可以使用: python -m SimpleHTTPServer 7777 (使用端口 7777 和 Python 2)。

处理文件和数据

  • 要在当前目录中按名称定位文件,find . -iname '*something*'(或者相类似的)。要按名称查找任何地方的文件,使用 locate something(但请记住,updatedb 可能还没有索引最近创建的文件)。
  • 对于源代码或数据文件进行的常规搜索(要比 grep -r 更高级),使用 ag
  • 要将 HTML 转成文本:lynx -dump -stdin
  • 对于 Markdown、HTML,以及各种类型的文档转换,可以试试 pandoc
  • 如果你必须处理 XML,xmlstarlet 虽然有点老旧,但是很好用。
  • 对于 JSON,使用jq
  • 对于 Excel 或 CSV 文件,csvkit 提供了 in2csvcsvcutcsvjoincsvgrep 等工具。
  • 对于亚马逊 S3 ,s3cmd 会很方便,而 s4cmd 则更快速。亚马逊的 aws 则是其它 AWS 相关任务的必备。
  • 掌握 sortuniq,包括 uniq 的 -u-d 选项——参见下面的单行程序。
  • 掌握 cutpastejoin,它们用于处理文本文件。很多人会使用 cut,但常常忘了 join
  • 了解 tee,它会将 stdin 同时复制到一个文件和 stdout,如 ls -al | tee file.txt
  • 知道 locale 会以微妙的方式对命令行工具产生大量的影响,包括排序的顺序(整理)以及性能。大多数安装好的 Linux 会设置 LANG 或其它 locale 环境变量为本地设置,比如像 US English。但是,你要明白,如果改变了本地环境,那么排序也将改变。而且 i18n 过程会让排序或其它命令的运行慢好多倍。在某些情形中(如像下面那样的设置操作或唯一性操作),你可以安全地整个忽略缓慢的 i18n 过程,然后使用传统的基于字节的排序顺序 export LC_ALL=C
  • 了解基本的改动数据的 awksed 技能。例如,计算某个文本文件第三列所有数字的和:awk '{ x += $3 } END { print x }'。这可能比 Python 的同等操作要快3倍,而且要短3倍。
  • 在一个或多个文件中,替换所有出现在特定地方的某个字符串:
  perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt
  • 要立即根据某个模式对大量文件重命名,使用 rename。对于复杂的重命名,repren 可以帮助你达成。
  # 恢复备份文件 foo.bak -> foo:
  rename 's/\.bak$//' *.bak
  # 完整的文件名、目录名 foo -> bar:
  repren --full --preserve-case --from foo --to bar .
  • 使用 shuf 来从某个文件中打乱或随机选择行。
  • 了解 sort 的选项。知道这些键是怎么工作的(-t-k)。特别是,注意你需要写-k1,1来只通过第一个字段排序;-k1意味着根据整行排序。
  • 稳定排序(sort -s)会很有用。例如,要首先按字段2排序,然后再按字段1排序,你可以使用 sort -k1,1 | sort -s -k2,2
  • 如果你曾经需要在 Bash 命令行中写一个水平制表符(如,用于 -t 参数的排序),按ctrl-v [Tab],或者写$'\t'(后面的更好,因为你可以复制/粘贴)。
  • 对源代码进行补丁的标准工具是 diffpatch。 用 diffstat 来统计 diff 情况。注意 diff -r 可以用于整个目录,所以可以用 diff -r tree1 tree2 | diffstat 来统计(两个目录的)差异。
  • 对于二进制文件,使用 hd 进行简单十六进制转储,以及 bvi 用于二进制编辑。
  • 还是用于二进制文件,strings(加上 grep 等)可以让你找出一点文本。
  • 对于二进制文件的差异(delta 压缩),可以使用 xdelta3
  • 要转换文本编码,试试 iconv 吧,或者对于更高级的用途使用 uconv;它支持一些高级的 Unicode 的东西。例如,这个命令可以转换为小写并移除所有重音符号(通过扩展和丢弃):
  uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt
  • 要将文件分割成几个部分,来看看 split(按大小分割)和 csplit(按格式分割)吧。
  • 使用 zlesszmorezcatzgrep 来操作压缩文件。

系统调试

  • 对于 Web 调试,curlcurl -I 很方便灵活,或者也可以使用它们的同行 wget,或者更现代的 httpie
  • 要了解磁盘、CPU、网络的状态,使用 iostatnetstattop(或更好的 htop)和(特别是)dstat。它们对于快速获知系统中发生的状况很好用。
  • 对于更深层次的系统总览,可以使用 glances。它会在一个终端窗口中为你呈现几个系统层次的统计数据,对于快速检查各个子系统很有帮助。
  • 要了解内存状态,可以运行 freevmstat,看懂它们的输出结果吧。特别是,要知道“cached”值是Linux内核为文件缓存所占有的内存,因此,要有效地统计“free”值。
  • Java 系统调试是一件截然不同的事,但是对于 Oracle 系统以及其它一些 JVM 而言,不过是一个简单的小把戏,你可以运行 kill -3 <pid>,然后一个完整的堆栈追踪和内存堆的摘要(包括常规的垃圾收集细节,这很有用)将被转储到stderr/logs。
  • 使用 mtr 作路由追踪更好,可以识别网络问题。
  • 对于查看磁盘满载的原因,ncdu 会比常规命令如 du -sh * 更节省时间。
  • 要查找占用带宽的套接字和进程,试试 iftopnethogs 吧。
  • (Apache附带的)ab工具对于临时应急检查网络服务器性能很有帮助。对于更复杂的负载测试,可以试试 siege
  • 对于更仔细的网络调试,可以用 wiresharktsharkngrep
  • 掌握 straceltrace。如果某个程序失败、挂起或崩溃,而你又不知道原因,或者如果你想要获得性能的大概信息,这些工具会很有帮助。注意,分析选项(-c)和使用 -p 关联运行进程。
  • 掌握 ldd 来查看共享库等。
  • 知道如何使用 gdb 来连接到一个运行着的进程并获取其堆栈追踪信息。
  • 使用 /proc。当调试当前的问题时,它有时候出奇地有帮助。样例:/proc/cpuinfo/proc/xxx/cwd/proc/xxx/exe/proc/xxx/fd//proc/xxx/smaps
  • 当调试过去某个东西为何出错时,sar 会非常有帮助。它显示了 CPU、内存、网络等的历史统计数据。
  • 对于更深层的系统和性能分析,看看 stap (SystemTap),perf) 和 sysdig 吧。
  • 确认是正在使用的 Linux 发行版版本(支持大多数发行版):lsb_release -a
  • 每当某个东西的行为异常时(可能是硬件或者驱动器问题),使用dmesg

单行程序

这是将命令连成一行的一些样例:

  • 有时候通过 sort/uniq 对文本文件做交集、并集和差集运算时,这个例子会相当有帮助。假定 ab 是已经进行了唯一性处理的文本文件。这会很快,而且可以处理任意大小的文件,总计可达数千兆字节。(Sort不受内存限制,不过如果 /tmp 放在一个很小的根分区的话,你可能需要使用 -T 选项。)也可参见上面关于LC_ALL的注解和 -u 选项(参见下面例子更清晰)。
sh cat a b | sort | uniq > c # c 是 a 和 b 的并集 
cat a b | sort | uniq -d > c # c 是 a 和 b 的交集 
cat a b b | sort | uniq -u > c # c 是 a 减去 b 的差集
  • 使用 grep . * 来可视化查看一个目录中的所有文件的所有内容,例如,对于放满配置文件的目录: /sys/proc/etc
  • 对某个文本文件的第三列中所有数据进行求和(该例子可能比同等功能的Python要快3倍,而且代码也少于其3倍):
  awk '{ x += $3 } END { print x }' myfile
  • 如果想要查看某个文件树的大小/日期,该例子就像一个递归ls -l,但是比ls -lR要更容易读懂:
  find . -type f -ls
  • 只要可以,请使用 xargsparallel。注意,你可以控制每行(-L)执行多少个项目,以及并行执行(-P)。如果你不确定它是否会做正确的事情,可以首先使用 xargs echo。同时,使用 -I{} 也很方便。样例:
  find . -name '*.py' | xargs grep some_function
  cat hosts | xargs -I{} ssh root@{} hostname
  • 比如说,你有一个文本文件,如 Web 服务器的日志,在某些行中出现了某个特定的值,如 URL 中出现的 acct_id 参数。如果你想要统计有多少个 acct_id 的请求:
cat access.log | egrep -o 'acct_id=[0-9]+' | cut -d= -f2 | sort | uniq -c | sort -rn
  • 运行该函数来获得来自本文的随机提示(解析Markdown并从中提取某个项目):
function taocl() {
    curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md |
      pandoc -f markdown -t html |
      xmlstarlet fo --html --dropdtd |
      xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" |
      xmlstarlet unesc | fmt -80
  }

晦涩难懂,但却有用

  • expr:实施算术或布林操作,或者求正则表达式的值
  • m4:简单的宏处理器
  • yes:大量打印一个字符串
  • cal:漂亮的日历
  • env:(以特定的环境变量设置)运行一个命令(脚本中很有用)
  • look:查找以某个字符串开头的英文单词(或文件中的行)
  • cutpaste 以及 join:数据处理
  • fmt:格式化文本段落
  • pr:格式化文本为页/列
  • fold:文本折行
  • column:格式化文本为列或表
  • expandunexpand:在制表符和空格间转换
  • nl:添加行号
  • seq:打印数字
  • bc:计算器
  • factor:分解质因子
  • gpg:加密并为文件签名
  • toe:terminfo 条目表
  • nc:网络调试和数据传输
  • socat:套接字中继和 tcp 端口转发(类似 netcat
  • slurm:网络流量可视化
  • dd:在文件或设备间移动数据
  • file:识别文件类型
  • tree:以树形显示目录及子目录;类似 ls,但是是递归的。
  • stat:文件信息
  • tac:逆序打印文件
  • shuf:从文件中随机选择行
  • comm:逐行对比分类排序的文件
  • hdbvi:转储或编辑二进制文件
  • strings:从二进制文件提取文本
  • tr:字符转译或处理
  • iconvuconv:文本编码转换
  • splitcsplit:分割文件
  • units:单位转换和计算;将每双周(fortnigh)一浪(浪,furlong,长度单位,约201米)转换为每瞬(blink)一缇(缇,twip,一种和屏幕无关的长度单位)(参见: /usr/share/units/definitions.units)(LCTT 译注:这都是神马单位啊!)
  • 7z:高比率文件压缩
  • ldd:动态库信息
  • nm:目标文件的符号
  • ab:Web 服务器基准测试
  • strace:系统调用调试
  • mtr:用于网络调试的更好的路由追踪软件
  • cssh:可视化并发 shell
  • rsync:通过 SSH 同步文件和文件夹
  • wiresharktshark:抓包和网络调试
  • ngrep:从网络层摘取信息
  • hostdig:DNS查询
  • lsof:处理文件描述符和套接字信息
  • dstat:有用的系统统计数据
  • glances:高级,多个子系统概览
  • iostat:CPU和磁盘使用率统计
  • htop:top的改进版
  • last:登录历史
  • w:谁登录进来了
  • id:用户/组身份信息
  • sar:历史系统统计数据
  • iftopnethogs:按套接口或进程的网络使用率
  • ss:套接口统计数据
  • dmesg:启动和系统错误信息
  • hdparm:SATA/ATA 磁盘操作/改善性能
  • lsb_release:Linux 发行版信息
  • lsblk:列出块设备,以树形展示你的磁盘和分区
  • lshw:硬件信息
  • fortuneddatesl:嗯,好吧,它取决于你是否认为蒸汽机车和 Zippy 引用“有用”

更多资源

免责声明

除了非常小的任务外,其它都写出了代码供大家阅读。伴随力量而来的是责任。事实是,你在Bash中做的,并不意味着是你所应该做的!;)


via: https://github.com/jlevy/the-art-of-command-line

作者:jlevy 译者:GOLinux 校对:wxy

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

由于一切都迁移到了云上,作为提高职员生产力的一种方式,虚拟远程桌面在工业中越来越流行。尤其对于那些需要在多个地方和设备之间不停漫游的人,远程桌面可以让他们和工作环境保持无缝连接。远程桌面对于雇主同样有吸引力,可以在工作环境中提高敏捷性和灵活性,由于硬件整合、桌面安全加固等原因降低 IT 花费。

在 Linux 世界中,理所当然设置远程桌面有很多选择,支持许多协议(例如 RDP、RFB、NX) 和服务器/客户端实现(例如 TigerVNC、RealVNC、FreeNX、x2go、X11vnc、TeamViewer 等等)。

这当中有个出色的产品叫做 X2Go,它是一个基于 NX(译者注:通过计算机网络显示远程桌面环境的一种技术,可参考 Wiki)的远程桌面服务器和客户端的开源(GPLv2)实现。在这个教程中,我会介绍 如何为 Linux VPS 使用 X2Go 设置远程桌面环境

X2Go 是什么?

X2Go 的历史要追溯到 NoMachine 的 NX 技术。NX 远程桌面协议的设计目的是通过利用主动压缩和缓存解决低带宽和高延迟的网络连接问题。后来,NX 转为闭源,但 NX 库还是采用 GPL 协议。这导致出现了多种基于 NX 的远程桌面解决方案开源实现,X2Go 就是其中之一。

和其它解决方案例如 VNC 相比,X2Go 有哪些好处呢? X2Go 继承了 NX 技术的所有高级功能,很自然能在慢速网络连接上良好工作。另外,由于它内置的基于 SSH 的加密技术,X2Go 保持了确保安全的良好业绩记录。不再需要手动设置 SSH 隧道 。X2Go 默认支持音频,这意味着远程桌面的音乐播放可以通过网络传送,并进入本地扬声器。在易用性方面,远程桌面上运行的应用程序可以在你的本地桌面中以一个独立窗口无缝呈现,会给你造成一种应用程序实际上在你本地桌面运行的错觉。正如你看到的,这些都是一些基于 VNC 的解决方案所缺少的强大功能

X2GO 的桌面环境兼容性

和其它远程桌面服务器一样,X2Go 服务器也有一些已知的兼容性问题。像 KDE 3/4、Xfce、MATE 和 LXDE 是对 X2Go 服务器最友好的桌面环境。但是,用其它桌面管理器效果可能有所不同。例如,已知 GNOME 3 之后的版本、KDE 5、Unity 和 X2Go 并不兼容。如果你的远程主机的桌面管理器和 X2Go 兼容,你可以继续以下的教程。

在 Linux 上安装 X2Go 服务器

X2Go 由远程桌面服务器和客户端组件组成。让我们首先安装 X2Go 服务器。我假设你已经有一个和 X2Go 兼容的桌面管理器并且在远程主机上运行,我们会安装 X2Go 服务器到该远程主机。

注意系统启动后 X2Go 服务器组件没有需要单独启动的服务。你只需要保证开启了 SSH 服务并在正常运行。

Ubuntu 或 Linux Mint:

配置 X2Go PPA 库。对于 Ubuntu 14.04 以及更高版本,有可用的 X2Go PPA。

$ sudo add-apt-repository ppa:x2go/stable
$ sudo apt-get update
$ sudo apt-get install x2goserver x2goserver-xsession

Debian (Wheezy):

$ sudo apt-key adv --recv-keys --keyserver keys.gnupg.net E1F958385BFE2B6E
$ sudo sh -c "echo deb http://packages.x2go.org/debian wheezy main > /etc/apt/sources.list.d/x2go.list"
$ sudo sh -c "echo deb-src http://packages.x2go.org/debian wheezy main >> /etc/apt/sources.list.d/x2go.list"
$ sudo apt-get update
$ sudo apt-get install x2goserver x2goserver-xsession

Fedora:

$ sudo yum install x2goserver x2goserver-xsession

CentOS/RHEL:

首先启用 EPEL 库 然后运行:

$ sudo yum install x2goserver x2goserver-xsession 

在 Linux 上安装 X2Go 客户端

在将会连接到远程桌面的本地主机上,安装以下命令安装 X2Go 客户端。

Ubuntu 或 Linux Mint:

配置 X2Go PPA 库。对于 Ubuntu 14.04 以及更高版本,有可用的 X2Go PPA。

$ sudo add-apt-repository ppa:x2go/stable
$ sudo apt-get update
$ sudo apt-get install x2goclient

Debian (Wheezy):

$ sudo apt-key adv --recv-keys --keyserver keys.gnupg.net E1F958385BFE2B6E
$ sudo sh -c "echo deb http://packages.x2go.org/debian wheezy main > /etc/apt/sources.list.d/x2go.list"
$ sudo sh -c "echo deb-src http://packages.x2go.org/debian wheezy main >> /etc/apt/sources.list.d/x2go.list"
$ sudo apt-get update
$ sudo apt-get install x2goclient

Fedora:

$ sudo yum install x2goclient

CentOS/RHEL:

首先启用 EPEL 库 ,然后运行:

$ sudo yum install x2goclient 

用 X2Go 客户端连接到远程桌面

现在可以连接到远程桌面了。在本地主机上,只需运行以下命令或者使用桌面启动器启动 X2Go 客户端。

$ x2goclient

输入远程主机的 IP 地址和 SSH 用户名称。同时,指定会话类型(例如,远程主机的桌面管理器)。

如果需要的话,你可以自定义其它东西(通过点击其它的标签),例如连接速度、压缩、屏幕分辨率等等。

当你初始化一个远程桌面连接的时候,会要求你登录。输入你的 SSH 登录名和密码。

成功登陆后,你会看到远程桌面屏幕。

如果你想测试 X2Go 的无缝窗口功能,选择 "Single application" 会话类型,然后指定远处主机上可执行文件的路径。在该例子中,我选择远程 KDE 主机上的 Dolphin 文件管理器。

你成功连接后,你会在本地桌面上看到一个远程应用窗口,而不是完整的远程桌面屏幕。

总结

在这篇教程中,我介绍了如何在 Linux VPS 实例上设置 X2Go 远程桌面。正如你所看到的,整个设置过程都非常简单(如果你使用一个合适的桌面环境的话)。尽管对于特定桌面仍有问题,X2Go 是一个安全、功能丰富、快速并且免费的远程桌面解决方案。

X2Go 的什么功能最吸引你?欢迎分享你的观点。


via: http://xmodulo.com/x2go-remote-desktop-linux.html

作者:Dan Nanni 译者:ictlyh 校对:wxy

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

Nginx (engine-x)是一个开源的高性能 HTTP 服务器、反向代理和 IMAP/POP3 代理服务器。nginx 杰出的功能有:稳定、丰富的功能集、简单的配置和低资源消耗。nginx 被用于一些高性能网站并在站长之间变得越来越流行。本教程会从源码构建一个带有 google paespeed 模块的用于 Ubuntu 15.04 的 nginx .deb 安装包。

pagespeed 是一个由 google 开发的 web 服务器模块来加速网站响应时间、优化 html 和减少页面加载时间。ngx\_pagespeed 的功能如下:

  • 图像优化:去除元数据、动态缩放、重压缩。
  • CSS 与 JavaScript 压缩、串联、内联、外联。
  • 小资源内联
  • 图像与 JavaScript 延迟加载
  • HTML 重写
  • 缓存生命期插件

更多请见 https://developers.google.com/speed/pagespeed/module/

前置要求

  • Ubuntu Server 15.04 64位
  • root 权限

本篇我们将要:

  • 安装必备软件包
  • 安装带 ngx\_pagespeed 的 nginx
  • 测试

安装必备包

sudo apt-get install dpkg-dev build-essential zlib1g-dev libpcre3 libpcre3-dev

安装带 ngx\_pagespeed 的 nginx

第一步 - 添加nginx仓库

vim /etc/apt/sources.list.d/nginx.list

加入下面的行:

deb http://nginx.org/packages/ubuntu/ trusty nginx
deb-src http://nginx.org/packages/ubuntu/ trusty nginx

更新仓库:

sudo apt-get update

注意:如果你看到信息:GPG error [...] NO\_PUBKEY [...] 等等

请添加key:

sudo sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys KEYNUMBER
sudo apt-get update

第二步 - 从仓库下载 nginx 1.8

sudo su
cd ~
mkdir -p ~/new/nginx_source/
cd ~/new/nginx_source/
apt-get source nginx
apt-get build-dep nginx

第三步 - 下载 Pagespeed

cd ~
mkdir -p ~/new/ngx_pagespeed/
cd ~/new/ngx_pagespeed/
ngx_version=1.9.32.3
wget https://github.com/pagespeed/ngx_pagespeed/archive/release-${ngx_version}-beta.zip
unzip release-${ngx_version}-beta.zip

cd ngx_pagespeed-release-1.9.32.3-beta/
wget https://dl.google.com/dl/page-speed/psol/${ngx_version}.tar.gz
tar -xzf 1.9.32.3.tar.gz

第四步 - 配置 nginx 来编译 Pagespeed

cd ~/new/nginx_source/nginx-1.8.0/debin/
vim rules

在两处 CFLAGS .configure 下添加模块:

--add-module=../../ngx_pagespeed/ngx_pagespeed-release-1.9.32.3-beta \

adding pagespeed to nginx

adding pagespeed to nginx

第五步 - 打包 nginx 软件包并安装

cd ~/new/nginx_source/nginx-1.8.0/
dpkg-buildpackage -b

dpkg-buildpackage 会编译 ~/new/ngix\_source/ 为 nginx.deb。打包完成后,看一下目录:

cd ~/new/ngix_source/
ls

nginx builded with pagespeed

接着安装 nginx。

dpkg -i nginx_1.8.0-1~trusty_amd64.deb

Install nginx

测试

运行 nginx -V 测试 nginx 是否已经自带 ngx\_pagespeed。

nginx -V

nginx -V

总结

稳定、快速、开源的 nginx 支持许多不同的优化模块。这其中之一是 google 开发的‘pagespeed’。不像 apache,nginx 模块不是动态加载的,因此你必须在编译之前就选择好需要的模块。


via: https://www.howtoforge.com/tutorial/how-to-install-nginx-and-google-pagespeed-on-ubuntu-15-04/

作者:Muhammad Arul 译者:geekpi 校对:wxy

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