借助MySQLTuner提高MySQL性能及稳定性

MySQLTuner是一个用Perl编写的脚本,帮助你提高MySQL性能及稳定性。它通过检索当前配置变量和状态数据,提供一些基本性能建议。

安装使用MySQLTuner

1.下载MySQLTuner

  1. wget http://mysqltuner.pl/ -O mysqltuner.pl

2.运行程序

  1. perl mysqltuner.pl

3.输出如下

  1. >>  MySQLTuner 1.4.0 – Major Hayden <[email protected]>
  2.  >>  Bug reports, feature requests, and downloads at http://mysqltuner.com/
  3.  >>  Run with ‘–help’ for additional options and output filtering
  4. Please enter your MySQL administrative login: root
  5. Please enter your MySQL administrative password:
  6. [OK] Currently running supported MySQL version 5.5.41-0+wheezy1
  7. [OK] Operating on 64-bit architecture
  8.  
  9. ——– Storage Engine Statistics ——————————————-
  10. [–] Status: +ARCHIVE +BLACKHOLE +CSV -FEDERATED +InnoDB +MRG_MYISAM
  11. [–] Data in InnoDB tables: 1M (Tables: 11)
  12. [–] Data in PERFORMANCE_SCHEMA tables: 0B (Tables: 17)
  13. [!!] Total fragmented tables: 11
  14.  
  15. ——– Security Recommendations  ——————————————-
  16. [OK] All database users have passwords assigned
  17.  
  18. ——– Performance Metrics ————————————————-
  19. [–] Up for: 47s (113 q [2.404 qps], 42 conn, TX: 19K, RX: 7K)
  20. [–] Reads / Writes: 100% / 0%
  21. [–] Total buffers: 192.0M global + 2.7M per thread (151 max threads)
  22. [OK] Maximum possible memory usage: 597.8M (60% of installed RAM)
  23. [OK] Slow queries: 0% (0/113)
  24. [OK] Highest usage of available connections: 0% (1/151)
  25. [OK] Key buffer size / total MyISAM indexes: 16.0M/99.0K
  26. [!!] Query cache efficiency: 0.0% (0 cached / 71 selects)
  27. [OK] Query cache prunes per day: 0
  28. [OK] Temporary tables created on disk: 25% (54 on disk / 213 total)
  29. [OK] Thread cache hit rate: 97% (1 created / 42 connections)
  30. [OK] Table cache hit rate: 24% (52 open / 215 opened)
  31. [OK] Open file limit used: 4% (48/1K)
  32. [OK] Table locks acquired immediately: 100% (62 immediate / 62 locks)
  33. [OK] InnoDB buffer pool / data size: 128.0M/1.2M
  34. [OK] InnoDB log waits: 0
  35. ——– Recommendations —————————————————–
  36. General recommendations:
  37.     Run OPTIMIZE TABLE to defragment tables for better performance
  38.     Enable the slow query log to troubleshoot bad queries
  39. Variables to adjust:
  40.     query_cache_limit (> 1M, or use smaller result sets)

我们可以根据Recommendations下面建议修改MySQL的配置来的调优性能。

MySQL主要性能参数

key_buffer:
更改key_buffer为MySQL分配更多的内存,这可以大大加快你的数据库。 当使用MyISAM表引擎时,key_buffer大小通常不会超过系统内存的25%,而InnoDB最多可占70%。 如果该值设置得太高,则资源被浪费。 根据MySQL的文档,对于256MB RAM(或更多)具有许多表的服务器,建议使用64M的设置,而具有128MB RAM和较少表的服务器可以设置为16M(默认值)。
max_allowed_packet:
允许发送的数据包的最大大小。 数据包是单个SQL状态,单个行发送到客户端,或日志从主机发送到从机。 如果你知道你的MySQL服务器将要处理大数据包,最好提高到你最大的数据包的大小。 如果此值设置得太小,您将在错误日志中收到错误。
thread_stack:
此值包含每个线程的堆栈大小。 MySQL认为thread_stack变量的默认值足以正常使用; 但是,如果出现了与thread_stack相关的错误,则可以调大此值。
thread_cache_size:
如果thread_cache_size是“turned off”(设置为0),则所有新建的连接都需要为它们创建一个新的线程,当连接断开时,线程被销毁。 否则,此值设置要存储在缓存中的未使用线程的数量,直到它们需要用于连接。 通常,此设置对性能影响不大,除非您每分钟接收数百个连接,此时应该刷新该值,以便大多数连接使用到缓存线程。
max_connections:
设置并发连接的最大数量。 最好考虑过去的最大连接数,然后设置它,以便在该数字和max_connections值之间有一些缓冲区。

通过SSH隧道远程安全管理MySQL

本文将向您介绍如何使用SSH隧道从本地计算机安全连接到远程MySQL或MariaDB服务器。 如果要在本地计算机上使用管理工具连接服务器上的服务工作,这将非常有用。
遵循这些说明后,您可以使用您最喜欢的MySQL管理工具连接到工作站上的localhost。 连接将通过Internet安全地转发到您的服务器。

先决条件

MySQL已安装
MySQL配置为在localhost(127.0.0.1)上侦听。 默认情况下启用。

在Windows上使用PuTTY创建隧道

本节将介绍如何使用PuTTY工具在Windows上创建到MySQL的SSH隧道。

设置隧道

首先,你需要建立一个到你的服务器的基本连接:
1.下载PuTTY.
2.保存PuTTY到你桌面
3.双击打开PuTTY,不需要安装
4.在主机名(或IP地址)字段中输入服务器的主机名或IP地址。
5.在左侧菜单中,转到Connection – > SSH – > Tunnels。
6.在“Source port”字段中,输入3306。
7.在Destination字段中,输入127.0.0.1:3306。
8.单击打开以启动SSH会话。
9.将本地MySQL客户端指向localhost:3306。 您与远程MySQL服务器的连接将通过SSH加密,允许您访问您的数据库而不需要MySQL开放到互联网。

在Mac OS X或Linux上使用mysql-tunnel创建隧道

本节将介绍如何使用mysql-tunnel工具在Mac OS X或Linux上创建到MySQL的SSH隧道。
1.打开命令提示符,并运行以下命令打开SSH隧道:

  1. ssh -L 127.0.0.1:3306:127.0.0.1:3306 [email protected] -N

用您的SSH用户名和服务器的主机名或IP地址替换 *。 命令中的长字符串数字列出了本地IP,本地端口,远程IP和远程端口,以冒号(:**)分隔。
2.将本地MySQL客户端指向localhost:3306。 您与远程MySQL服务器的连接将通过SSH加密,允许您访问您的数据库而不需要MySQL开放到互联网。
3.当您准备关闭连接时,发出CTRL-C命令或关闭命令提示符窗口。 这将关闭SSH隧道。

持久SSH连接

如果您需要一个持久的SSH隧道,请考虑使用autossh(http://www.harding.motd.ca/autossh/)。 autossh启动和监视SSH连接,并在必要时重新启动。

Ubuntu 16.04 (Xenial)安装配置MongoDB

MongoDB是一个数据库引擎,提供对非关系,面向文档的数据库的访问。 增长最快的NoSQL之一,旨在提供传统关系数据库管理系统(RDBMS)的替代方案。 除了无模式设计和可扩展架构之外,MongoDB还提供JSON输出和特定的语言特定绑定,使其特别适合在自定义应用程序开发中使用。 MongoDB已经用于许多大规模生产部署,并且是目前所有系统中最流行的数据库引擎之一。

安装MongoDB

从Ubuntu存储库安装MongoDB:

  1. sudo apt-get install mongodb-server

配置MongoDB

MongoDB的配置文件位于/etc/mongodb.conf。 大多数设置都在文件中有很好的注释,我们在下面列出了一些更重要的选项:
dbpath表示存储数据库文件的位置(默认为/var/lib/mongodb)
logpath表示MongoDB的日志所在的位置(默认为/var/log/mongodb/mongodb.log)
logappend指示是否将新条目附加到日志的结尾,而不是在每次MongoDB重新启动后覆盖现有日志条目
bind_ip指定MongoDB应侦听的IP地址。 通常建议将此默认设置为127.0.0.1(localhost),除非您有特定的理由将其托管到公共互联网。 这里指定0.0.0.0将导致MongoDB在所有网络接口上侦听。
port指定默认网络端口27017,可以取消注释和修改
默认情况下,当注释掉或未明确定义auth时将禁用认证。 要利用MongoDB的内部身份验证功能,请通过删除行开头处的#,并将值设置为true来取消注释auth选项。
对MongoDB配置文件进行更改后,请重新启动服务,如下一节所示。

启动和停止MongoDB

要启动,重新启动或停止MongoDB服务,请从以下选项中执行适当的命令:

  1. sudo systemctl start mongodb
  2. sudo systemctl restart mongodb
  3. sudo systemctl stop mongodb

创建数据库用户

如果在“配置MongoDB”小节中启用了认证,请在数据库上创建一个管理员:
1.运行mongodb命令打开shell:

  1. mongo

2.默认情况下,MongoDB连接到一个名为test的数据库。 在添加任何用户之前,创建数据库以存储用于验证的用户数据:

  1. use admin

3.使用以下命令创建能够在任何数据库上创建其他用户的管理用户。

  1. db.createUser({user: "mongo-admin", pwd: "password", roles:[{role: "userAdminAnyDatabase", db: "admin"}]})

将这些凭证保存在安全的地方,以备将来参考。 输出将显示写入数据库的所有信息,密码除外:
Successfully added user: {
“user” : “mongo-admin”,
“roles” : [
{
“role” : “userAdminAnyDatabase”,
“db” : “admin”
}
]
}
4.退出mongo终端

  1. quit()

5.使用在步骤3中创建的凭据,使用admin数据库进行身份验证来测试与MongoDB的连接:

  1. mongo -u mongo-admin -p –authenticationDatabase admin

为了验证与shell的连接,需要上述命令中的-u和-p –authenticationDatabase选项。 没有身份验证,MongoDB shell可以被访问,但它不允许连接到数据库。
在步骤3中创建的mongo-admin用户纯粹是基于指定的角色的管理。 它被定义为所有数据库的用户管理员,但本身没有任何数据库权限。 您可以使用它来创建其他用户并定义他们的角色。 如果您使用多个应用程序与MongoDB,设置不同的用户具有对应的数据库的自定义权限。
6.作为mongo-admin用户,创建一个新的数据库来存储常规用户数据进行身份验证。 以下示例为user-data:

  1. use user-data

不同数据库的权限在单独的角色对象中处理。 步骤7中的示例创建了用户example-user,对用户数据数据库具有只读权限,并且对我们将在下面的基本MongoDB函数部分中创建的示例数据库数据库具有读写权限。
7.创建新的非管理用户以输入测试数据。

  1. db.createUser({user: "example-user", pwd: "password", roles:[{role: "read", db: "user-data"}, {role:"readWrite", db: "example-db"}]})

基本的MongoDB函数

MongoDB之所以欢迎大多数得益于易于集成。 通过JavaScript函数与数据库进行交互,并提供其他语言的驱动程序。 本节将演示一些基本功能,但我们建议您根据特定的用例进行进一步的研究。
1.使用我们上面创建的example-user打开MongoDB shell:

  1. mongo -u example-user -p –authenticationDatabase user-data

2.创建新数据库example-db:

  1. use example-db

请确保此数据库名称对应于用户具有读取和写入权限的数据库名称。
要显示当前工作数据库的名称,请运行db命令。
3.创建用于输入测试数据库的样本数据。 MongoDB接受输入为JSON对象形式的文档,如下面的那些。 a和b变量用于简化输入; 对象也可以通过函数直接插入。

  1. var a = { name : "John Doe" }
  2. var b = { age : 30 }

4.使用insert函数将数据插入到名为example的集合中。 如果您不熟悉MongoDB术语,则可以将集合视为与关系数据库管理系统中的表。

  1. db.example.insert(a)
  2. db.example.insert(b)

每个操作的输出将显示成功写入当前工作数据库的对象数:

  1. WriteResult({ "nInserted" : 1 })

5.确认example集合已经被创建

  1. show collections

输出将列出包含当前工作数据库中的数据的所有集合:

  1. example
  2. system.indexes

在这种情况下,example是我们创建的集合,而system.indexes是一个自动创建的索引集合,供MongoDB内部使用。
6.使用find函数查看example集合中的所有数据。 此函数还可用于通过输入搜索项参数来搜索特定字段:

  1. db.example.find()

输出将类似于以下内容:
{ “_id” : ObjectId(“571a3e7507d0fcd78baef08f”), “name” : “John Doe” }
{ “_id” : ObjectId(“571a3e8707d0fcd78baef090”), “age” : 30 }

CentOS 6.4创建Mongodb副本集

MongoDB是一个开源的non-SQL数据库引擎。 MongoDB是可扩展的,是标准关系数据库管理系统(RDBMS)的替代品。 副本集可以使在节点发生故障时还能提供对您的数据的访问。

安装MongoDB

1.确保在副本集的每个成员设置好hostname

  1. nano /etc/hostname

/etc/hostname:
europa
2.创建一个文件以保存MongoDB存储库的配置信息:

  1. sudo touch /etc/yum.repos.d/mongodb.repo

3.如果运行的是64位系统,请使用以下配置:

  1. [mongodb]
  2. name=MongoDB Repository
  3. baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
  4. gpgcheck=0
  5. enabled=1

对于32位系统,请使用以下配置:

  1. [mongodb]
  2. name=MongoDB Repository
  3. baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/i686/
  4. gpgcheck=0
  5. enabled=1

4.使用如下命令安装MongoDB:

  1. sudo yum install mongo-10gen-server

配置网络

请正确配置网络,否则将无法向副本集添加成员。 本节将详细介绍如何将三(3)个服务器配置为MongoDB副本集。

设置hosts文件

/etc/hosts

  1. 192.168.160.1 mongo1
  2. 192.168.170.1 mongo2
  3. 192.168.180.1 mongo3

使用您自己的IP地址代替上述示例中的地址。 副本集中的成员名称也可以根据你的需要设置名称。

编辑Mongo Conf文件

1.编辑mongod.conf文件以添加IP地址和端口号。
/etc/mongod.conf:

  1. # fork and run in background
  2. fork = true
  3.  
  4. bind_ip = 192.168.135.24
  5. port = 27017

输入您在bind ip中服务器的私有IP地址。 如果bind_ip不存在,则需要添加它。 保留默认端口号27017,并取消注释行fork = true。
2.仍然在mongodb.conf文件中滚动到底部并添加副本集信息:
/etc/mongod.conf:

  1. replSet = rs1

在此示例中,副本集为rs1,但是,您可以根据选择更改名称。

副本集

副本集将允许您的数据“复制”或传播到集合中的所有其他节点。 它在系统故障的情况下提供冗余。 建议副本集节点个数为奇数,因为这会使选举更容易。
选举是选择哪个节点成为主节点。 选举在副本集初始化之后和主节点不可用时发生。 主节点是唯一可以接受写操作的节点。 如果主节点不可用,则进行选举选出新的主节点。 选举操作自动进行,无需人工干预。

创建副本集

mongod.conf文件在安装过程中就创建好了。 需要用这个配置文件在副本集的每个节点上启动守护程序。
1.命令如下:

  1. mongod –config /etc/mongod.conf

守护程序启动后,输出如下。
[user@europa mongo]# mongod –config /etc/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 20955
all output going to: /var/log/mongo/mongod.log
child process started successfully, parent exiting

2.仅在副本集的一个节点上启动MongoDB客户端:

  1. mongo –host <mongo0>

3.在MongoDB提示符下,使用命令切换到admin:

  1. use admin

您应该看到消息switched to db admin.
4.运行rs.initiate()命令,该命令将在当前节点中创建副本集。 输出应类似于以下内容:
> rs.initiate()
{
“info2” : “no configuration explicitly specified — making one”,
“me” : “192.168.160.1:27017”,
“info” : “Config now saved locally. Should come online in about a minute.”,
“ok” : 1

5.要查看当前配置,运行命令:

  1. rs.conf()

输出应类似于以下内容:

  1. rs.conf()
  2. {
  3.     "_id" : "rs1",
  4.     "version" : 8,
  5.     "members" : [
  6.         {
  7.             "_id" : 0,
  8.             "host" : "192.168.160.1:27017"
  9.         }
  10.     ]
  11. }

6.要将成员添加到副本集,请使用命令:

  1. rs.add("mongo1:27017")

输出:
rs1:PRIMARY> rs.add(“mongo2:27017”)
{ “ok” : 1 }
7.要验证节点是否已正确添加,请再次运行rs.conf()命令。 输出应类似于以下内容:
rs1:PRIMARY> rs.conf()
{
“_id” : “rs0”,
“version” : 8,
“members” : [
{
“_id” : 0,
“host” : “192.168.160.1:27017”
},
{
“_id” : 1,
“host” : “mongo1:27017”
},
{
“_id” : 2,
“host” : “mongo2:27017”
}
]
}

验证副本集

验证副本集是否正常并且节点都进行正常通信的最佳方法是创建新的测试数据库。 默认情况下,当您连接到MongoDB时,将使用现有的测试数据库。 为了保存新数据库,需要添加数据。 创建和插入数据的过程如下:
1.创建数据库

  1. use <products>

用您喜欢的任何名称替换变量products。
2.添加数据

  1. db.products.insert( {item: "paint", qty: 10 } )

如果您不在副本集的主节点上,您将收到消息not master。 切换到主节点并再次运行命令。 现在使用命令:

  1. show dbs

显示数据库列表。 您的新应该出现在列表中。 连接到副本集的其他节点,查看新创建的数据库是否已复制过去。

安装Letsencrypt创建免费SSL证书

Let’s Encrypt是由Internet安全研究组(ISRG)管理的SSL证书颁发机构。 它利用自动证书管理环境(ACME)自动部署几乎被所有主流浏览器信任的免费SSL证书。
本教程将涵盖以下内容:
安装Letsencrypt ACME客户端。
获取Letsencrypt证书。
需要注意和维护的事项。
关于Let’s Encrypt及其颁发的证书的技术细节。

下载和安装Let’s Encrypt

1.安装git
CentOS

  1. sudo yum install git

Debian / Ubuntu

  1. sudo apt-get install git

2.从官方的GitHub存储库下载Let’s Encrypt。 /opt是第三方软件包的公共安装目录,所以让我们将安装到/opt/letsencrypt:

  1. sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt

3.切换到/opt/letsencrypt目录

  1. cd /opt/letsencrypt

创建SSL证书

Let’s Encrypt使用一系列验证来自动完成域名验证(DV)。 证书颁发机构(CA)通过一些方法来验证计算机域的真实性。 一旦您的服务器验证通过,CA将颁发SSL证书给您。
1.使用–standalone参数运行Let’s Encrypt。 对于需要证书的每个其他域名,请将-d example.com添加到命令的末尾。

  1. sudo -H ./letsencrypt-auto certonly –standalone -d example.com -d www.example.com

注意:
Let’s Encrypt不部署通配符证书。 每个子域都需要自己的证书。
2.指定管理电子邮件地址。 这为了让您能重新获得丢失证书的控制权,并在必要时接收紧急安全通知。 按TAB,然后按ENTER或RETURN保存。
3.同意服务条款。
4.如果一切正常,将出现类似下面的消息。 它的输出意味着Let’s Encrypt已经批准并颁发了您的证书。

IMPORTANT NOTES:
– If you lose your account credentials, you can recover them through
e-mails sent to [email protected].
– Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your
cert will expire on 2016-03-31. To obtain a new version of the
certificate in the future, simply run Let’s Encrypt again.
– Your account credentials have been saved in your Let’s Encrypt
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Let’s
Encrypt, so making regular backups of this folder is ideal.
– If you like Let’s Encrypt, please consider supporting our work by:

Donating to ISRG / Let’s Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

Let’s Encrypt证书目录结构

1.列出/etc/letsencrypt/live目录:

  1. sudo ls /etc/letsencrypt/live

2.在创建SSL证书单节的步骤1中指定的各个域名都有自己的目录。 列出以下任意域名目录:

  1. sudo ls /etc/letsencrypt/live/example.com

输出:
cert.pem
chain.pem
fullchain.pem
privkey.pem
3.每个key(.pem)文件有不同的用途:
cert.pem:唯一的服务器证书。
chain.pem:根和中间证书。
fullchain.pem:服务器,根和中间证书的组合(替代cert.pem和chain.pem)。
privkey.pem:私有密钥(不要与任何人分享这个!)。
Let’s Encrypt从中间证书颁发机构颁发证书。 中间证书已由Identrust交叉签名,确保最终证书与所有主要浏览器之间的兼容性。 有关详细信息,请参阅Let’s Encrypt的官网。
4.显示fullchain.pem的文件状态:

  1. sudo stat /etc/letsencrypt/live/example.com/fullchain.pem

输出:

  1. File: ‘live/example.com/cert.pem’ -> ‘../../archive/example.com/cert1.pem’

注意这个文件指向了一个不同的文件,就像步骤3中列出的四个文件一样。它们是软链接,链接到/etc/letsencrypt/archive目录中的证书文件。
5.如果您忘记续订域名证书,Let’s Encrypt将删除/etc/letsencrypt/live中对应的目录(和软链接)。 但是,目录(和软链接)将保留在/etc/letsencrypt/archive和/etc/letsencrypt/keys目录中,以供需要时查看。

维护

续订SSL证书

1.回到cd /opt/letsencrypt目录

  1. cd /opt/letsencrypt

2.执行您在创建SSL证书的步骤1中使用的命令,添加–renew-by-default参数:

  1. sudo -H ./letsencrypt-auto certonly –standalone –renew-by-default -d example.com -d www.example.com

3.片刻之后,将出现以下内容:
IMPORTANT NOTES:
– Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your
cert will expire on 2016-03-31. To obtain a new version of the
certificate in the future, simply run Let’s Encrypt again.
– If you like Let’s Encrypt, please consider supporting our work by:

Donating to ISRG / Let’s Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

自动续订SSL证书(可选)

我们建议您设置自动更新证书,因为很忘记到期日期,尤其是如果您拥有多个不同的域名。 为了避免此问题,并可以使用cron来自动续订证书。
1.在我们执行下面的命令之前,让我们将其分解,并进行一些修改:

  1. echo ‘@monthly root /opt/letsencrypt/letsencrypt-auto certonly –standalone –renew-by-default -d example.com -d www.example.com >> /var/log/letsencrypt/letsencrypt-auto-update.log’ | sudo tee –append /etc/crontab

@monthly:为了简单起见,此命令将在每月的第一天的午夜执行
root:以root用户身份运行命令
/opt/letsencrypt/letsencrypt-auto certonly -standalone -renew-by-default -d example.com -d www.example.com:letsencrypt-auto更新命令。
»/var/log/letsencrypt/letsencrypt-auto-update.log:将标准输出和标准错误记录到名为letsencrypt-auto-update.log的日志文件
tee -append /etc/crontab:将新的cron作业保存到/etc/crontab文件
2.执行您修改的命令以将cron作业添加到您的服务器。

更新Let’s Encrypt

1.回到/opt/letsencrypt目录

  1. cd /opt/letsencrypt

2.从你上次下载Let’s Encrypt的仓库拉取对Let’s Encrypt所做的任何更改:

  1. sudo git pull

Ubuntu 12.04使用Squid创建HTTP代理

Squid是代理/缓存应用程序,拥有丰富的配置和用途的。 本文将介绍如何使用Squid建立HTTP代理。 请注意,您的原始IP地址会附加到请求头X-Forwarded-For,除非您按照指南最后一章节匿名流量的介绍,否则你的流量不会是匿名, 此外,流量没有加密,你的流量仍然存在被嗅探的可能性。

安装Squid

1.Squid可以从Ubuntu存储库中安装。 安装前请确保系统是最新的,然后再安装Squid,请运行以下命令:

  1. sudo apt-get update
  2. sudo apt-get upgrade
  3. sudo apt-get install squid

2.备份配置

  1. sudo cp /etc/squid3/squid.conf /etc/squid3/squid.conf.default

配置Squid为一个HTTP代理

Squid代理可以用作HTTP代理以绕过本地网络限制或隐藏您的真实IP。

基本配置

本节介绍配置Squid为HTTP代理的最简单方法,仅使用客户端IP地址进行身份验证。
1.编辑Squid配置文件并添加以下行:
/etc/squid3/squid.conf

  1. acl client src 12.34.56.78 # Home IP
  2.   http_access allow client

请把client替换为易于识别的名称。并将12.34.56.78替换为你的本机IP地址。 注释#Home IP不是必需的,但注释可用于帮助识别客户端。
2.一旦您保存并退出该文件,重新启动Squid:

  1. sudo service squid3 restart

3.此时,您可以配置本地浏览器或操作系统的网络设置,将你的服务器用作HTTP代理。 怎么配置取决于您选择的操作系统和浏览器。 对设置进行更改后,可以用浏览器打开一个网站来查看目前代理是否生效,例如ifconfig,what is my IP等网站。
4.可以通过向/etc/squid3/squid.conf中添加新的acl行来定义其他客户端。 通过将每个acl定义的名称添加到http_access allow行,可以授予对代理的访问权限。

高级身份验证

以下配置设置使用用户名和密码对Squid代理服务进行身份验证访问。
1.您可以使用htpasswd工具生成密码文件。 如果你的服务器安装了Apache,可能htpasswd已经存在。 否则运行:

  1. sudo apt-get install apache2-utils

2.创建一个文件来存储Squid用户和密码,然后更改所有权:

  1. sudo touch /etc/squid3/squid_passwd
  2. sudo chown proxy /etc/squid3/squid_passwd

3.创建用户名密码对:

  1. sudo htpasswd /etc/squid3/squid_passwd user1

将user1替换为你想要设置的用户名。 系统将提示您为此用户创建密码:

  1. New password:
  2. Re-type new password:
  3. Adding password for user user1

您可以重复此步骤来创建新用户。
4.编辑Squid配置文件并添加以下行:
/etc/squid3/squid.conf:

  1. auth_param basic program /usr/lib/squid3/basic_ncsa_auth /etc/squid3/squid_passwd
  2.   acl ncsa_users proxy_auth REQUIRED
  3.   http_access allow ncsa_users

5.一旦您保存并退出该文件,重新启动Squid:

  1. sudo service squid3 restart

6.此时,您可以配置本地浏览器或操作系统的网络设置,将你的服务器用作HTTP代理。 连接代理时,您需要提供用户名和密码来做身份验证。 如何设置取决于您选择的操作系统和浏览器。 对设置进行更改后,可以用浏览器打开一个网站来查看目前代理是否生效,例如ifconfig,what is my IP等网站。
7.要删除一个用户的代理访问权限,必须删除squid passwd文件中的对应的行。 每行表示一个用户,格式为user:password hash:
/etc/squid3/squid_passwd

  1. user1:$p948w3nvq3489v6npq396g user2:$q3cn478554387cq34n57vn

如果使用Nano编辑,使用命令Control + k将删除光标所在的行。 一旦您保存并退出该文件,重新启动Squid:

  1. sudo service squid3 restart

配置为匿名代理

为了隐藏你的IP地址,您需要将以下行添加到Squid配置文件。

  1. forwarded_for off
  2.   request_header_access Allow allow all
  3.   request_header_access Authorization allow all
  4.   request_header_access WWW-Authenticate allow all
  5.   request_header_access Proxy-Authorization allow all
  6.   request_header_access Proxy-Authenticate allow all
  7.   request_header_access Cache-Control allow all
  8.   request_header_access Content-Encoding allow all
  9.   request_header_access Content-Length allow all
  10.   request_header_access Content-Type allow all
  11.   request_header_access Date allow all
  12.   request_header_access Expires allow all
  13.   request_header_access Host allow all
  14.   request_header_access If-Modified-Since allow all
  15.   request_header_access Last-Modified allow all
  16.   request_header_access Location allow all
  17.   request_header_access Pragma allow all
  18.   request_header_access Accept allow all
  19.   request_header_access Accept-Charset allow all
  20.   request_header_access Accept-Encoding allow all
  21.   request_header_access Accept-Language allow all
  22.   request_header_access Content-Language allow all
  23.   request_header_access Mime-Version allow all
  24.   request_header_access Retry-After allow all
  25.   request_header_access Title allow all
  26.   request_header_access Connection allow all
  27.   request_header_access Proxy-Connection allow all
  28.   request_header_access User-Agent allow all
  29.   request_header_access Cookie allow all
  30.   request_header_access All deny all

一旦您保存并退出该文件,重新启动Squid:

  1. sudo service squid3 restart

Debian 8使用Apache部署Ruby on Rails

Ruby on Rails是一个快速开发的Web框架,Web设计人员和开发人员利用它能实现动态的全功能Web应用程序。 本文使用Phusion Passenger或mod_rails方法部署Rails应用程序。 Passenger允许您直接在Apache应用程序中嵌入Rails应用程序,而无需使用FastCGI或复杂的Web服务器代理。

安装Passenger和依赖关系

1.安装使用Ruby,构建Ruby模块和运行Rails应用程序所需的系统包:

  1. sudo apt-get install build-essential libapache2-mod-passenger apache2 ruby ruby-dev libruby zlib1g-dev libsqlite3-dev

2.使用gem模块的gem包管理器,安装fastthread gem:

  1. sudo gem install fastthread

3.安装Ruby On Rails:

  1. sudo gem install rails

4.(可选)为您的应用程序安装其他依赖项,例如MySQL支持:

  1. sudo apt-get install mysql-server libmysqlclient-dev mysql-client mysql-common
  2. sudo gem install mysql

5.将rails添加到$PATH环境变量。 请确保用正在运行的Ruby版本替换VERSION:

  1. ls /var/lib/gems
  2. PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/var/lib/gems/VERSION/bin"

6.在您的网站的公共文件夹中启动一个新的rails项目,以确保一切正常配置。 替换为你的应用程序名称:

  1. sudo rails new /var/www/html/example.com/public_html/application

配置Apache以使用Passenger

1.打开配置文件,调整DocumentRoot
/etc/apache2/sites-available/example.com.conf:

  1. DocumentRoot /var/www/html/example.com/application/public

2.重启Apache

  1. sudo systemctl restart apache2

部署多个Rails应用程序

有许多方法可以使用Passenger部署多个Rails应用程序。 最简单的方法是运行如上配置的多个不同的虚拟主机来托管单个Rails应用程序。 或者,您可以在单个虚拟主机中托管多个Rails应用程序。 本节介绍一个。
1.添加RailsBaseURI指令,指定虚拟主机配置中Rails应用程序的路径,如以下示例所示:
/etc/apache2/sites-available/example.com.conf:

  1. DocumentRoot /var/www/html/example.com/public_html/
  2. RailsBaseURI /app1
  3. RailsBaseURI /app2
  4. RailsBaseURI /app3

这些指令配置Passenger在example.com站点上指定的三个位置运行三个Rails应用程序。
2.将应用程序的public/目录链接到public_html/的子目录:

  1. ln -s /var/www/html/example.com/app1/public/ /var/www/html/example.com/public_html/app1/
  2. ln -s /var/www/html/example.com/app1/app2/ /var/www/html/example.com/public_html/app2/
  3. ln -s /var/www/html/example.com/app1/app3/ /var/www/html/example.com/public_html/app3/

Ubuntu 14.04使用Unicorn Nginx部署Ruby on Rails应用

Ruby on Rails是一个流行的快速开发Web框架,网页设计师和开发人员可以借助它使用Ruby编程语言实现功能齐全的动态Web应用程序。 本文介绍使用Unicorn部署Ruby on Rails和在Ubuntu 14.04上部署Nginx Web服务器。

安装必要软件包

使用以下命令更新系统的存储库数据库和安装的软件包:

  1. apt-get update
  2. apt-get upgrade

安装Ruby

1.安装Ruby依赖

  1. sudo apt-get install git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev python-software-properties libffi-dev nodejs

2.下载最新版本的Ruby。

  1. wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.0.tar.gz

3.解压

  1. tar -xzvf ruby-2.3.0.tar.gz

4.切换目录

  1. cd ruby-2.3.0

5.编译安装

  1. ./configure
  2. make
  3. sudo make install

安装并创建一个Rails应用

1.使用gem(Ruby的包管理框架)在服务器上安装Rails:

  1. sudo gem install rails

2.切换到家目录

  1. cd

3.创建一个新的Rails项目。 使用example作为项目名称:

  1. rails new example

4.切换到项目目录

  1. cd example

安装配置Unicorn

1.使用gem在服务器上安装Unicorn:

  1. sudo gem install unicorn

2.创建文件config/unicorn.rb,其中包含unicorn配置,并将以下配置粘贴到文件中。
/home/username/example/config/unicorn.rb:

  1. # set path to the application
  2. app_dir git File.expand_path("../..", __FILE__)
  3. shared_dir = "#{app_dir}/shared"
  4. working_directory app_dir
  5.  
  6. # Set unicorn options
  7. worker_processes 2
  8. preload_app true
  9. timeout 30
  10.  
  11. # Path for the Unicorn socket
  12. listen "#{shared_dir}/sockets/unicorn.sock", :backlog => 64
  13.  
  14. # Set path for logging
  15. stderr_path "#{shared_dir}/log/unicorn.stderr.log"
  16. stdout_path "#{shared_dir}/log/unicorn.stdout.log"
  17.  
  18. # Set proccess id path
  19. pid "#{shared_dir}/pids/unicorn.pid"

3.现在,创建Unicorn配置文件中涉及到的目录:

  1. mkdir -p shared/pids shared/sockets shared/log

安装配置Nginx

1.安装Nginx

  1. sudo apt-get install nginx

2.我们需要配置nginx作为反向代理。 编辑配置文件/etc/nginx/nginx.conf并将以下配置粘贴到HTTP块中:

  1. upstream rails {
  2. # Path to Unicorn socket file
  3. server unix:/home/username/example/shared/sockets/unicorn.sock fail_timeout=0;
  4. }

3.删除默认的nginx站点配置:

  1. sudo rm /etc/nginx/sites-enabled/default

4.为Rails应用程序创建新的nginx站点配置文件:
/etc/nginx/sites-available/example:

  1. server {
  2. listen 80;
  3. server_name localhost;
  4.  
  5. root /home/username/example;
  6.  
  7. try_files $uri/index.html $uri @rails;
  8.  
  9. location @rails {
  10.    proxy_pass http://rails;
  11.    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  12.     proxy_set_header Host $http_host;
  13.    proxy_redirect off;
  14. }
  15.  
  16. error_page 500 502 503 504 /500.html;
  17. client_max_body_size 4G;
  18. keepalive_timeout 10;
  19. }

5.创建指向nginx sites-enabled目录的软链接以启用站点配置文件:

  1. sudo ln -s /etc/nginx/sites-available/example /etc/nginx/sites-enabled

6.重启Nginx

  1. sudo service nginx restart

启动Unicorn

以开发环境模式启动Unicorn:

  1. sudo unicorn -c config/unicorn.rb -E development -D

以生产环境模式启动Unicorn:

  1. sudo unicorn -c config/unicorn.rb -E production -D

要停止Unicorn,请执行以下命令:

  1. sudo pkill unicorn

Debian 7 (Wheezy)安装Nginx Passenger部署Ruby on Rails

Ruby on Rails是一个流行的快速开发Web框架,允许网页设计师和开发人员使用Ruby编程语言实现功能齐全的动态Web应用程序。 本文介绍使用Passenger部署Ruby on Rails和在Debian 7(Wheezy)上部署Nginx Web服务器。

安装必要软件包

使用以下命令更新系统的存储库数据库和安装的软件包:

  1. apt-get update
  2. apt-get upgrade

执行以下命令来安装Ruby on Rails所需的软件包:

  1. apt-get install wget build-essential ruby1.8 ruby1.8-dev zlib1g-dev libruby1.8 rubygems1.8 libruby libssl-dev libpcre3-dev libcurl4-openssl-dev rake ruby-rack rails

安装Passenger和Nginx

Nginx不支持动态加载模块,所以Phusion Passenger包含了一个Nginx副本,其中编译了Passenger支持。如果您以前是通过Debian仓库安装了Nginx,请使用以下命令删除它:

  1. apt-get remove nginx nginx-full nginx-light nginx-naxsi nginx-common

Phusion托管包含Phusion Passenger的最新版本的存储库。 要将其添加到您的包管理器中,请首先通过运行以下命令来安装Phusion PGP密钥:

  1. apt-key adv –keyserver keyserver.ubuntu.com –recv-keys 561F9B9CAC40B2F7

创建/etc/apt/sources.list.d/passenger.list文件,内容为:

  1. deb https://oss-binaries.phusionpassenger.com/apt/passenger wheezy main

通过运行以下命令启用APT的HTTPS支持:

  1. sudo apt-get install apt-transport-https

更新您的本地包数据库并安装Phusion Passenger:

  1. apt-get update
  2. apt-get install nginx-extras passenger

运行Phusion Passenger安装程序:

  1. passenger-install-nginx-module

你会看Phusion Passenger Nginx的欢迎界面。 按“Enter”继续安装。
安装进程启动一个交互式会话,将指导您完成安装Phusion Passenger的过程。 当提示Nginx安装方法时,我们建议您选择“1”,以允许安装程序自动下载,编译和安装Nginx。 除非你有特定的需求,需要在编译时传递自定义选项到Nginx,这是最安全的方式。 以Nginx的默认安装位置继续安装。

启用Passenger支持并启动Nginx

Nginx已经安装在您的系统上,但您需要启用对Phusion Passenger的支持。 编辑文件/etc/nginx/nginx.conf并取消注释这些行:

  1. passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
  2. passenger_ruby /usr/bin/ruby;

现在可以使用以下命令重新启动Nginx:

  1. service nginx restart

要验证passenger是否已正确安装和启用,您可以运行以下操作:

  1. passenger-memory-stats

如果Passenger正在运行,您应该在“Passenger processes”区块下看到几个正在运行的进程。
Nginx的配置文件位于/etc/nginx/nginx.conf。您需要编辑的文件,以添加对Rails应用程序的支持。 此文件中已配置默认服务器,并且还包含备用虚拟主机和SSL配置的示例。

Varnish Cache入门介绍

需要处理大量的流量? 缓存应该是提高吞吐量最佳的方式之一。 意思是你的服务器不需要每次访问时从头开始重新生成相同的动态内容。 通过将缓存代理(如Varnish Cache)放在Web服务前面来对HTTP请求的响应加速并减少服务器工作负载,从而节省服务器资源。
Varnish工作在你的后端前面,比如Apache,Nginx还是别的什么。 如果Varnish找不到请求缓存,它会将请求转发到您的后端,然后缓存其输出。 您可以选择将这些缓存的请求存储在内存中,这会使它们的检索速度非常快。

安装

1.首先更新当前软件包并从apt安装Varnish:

  1. apt-get update
  2. apt-get upgrade
  3. apt-get install varnish

2.接下来我们要做的是编辑Varnish的守护进程选项,让它加载你的自定义配置:

  1. nano /etc/default/varnish

向下滚动到配置文件的这个块,找到当前的默认值:
/etc/default/varnish:

  1. ## Alternative 2, Configuration with VCL
  2. #
  3. # Listen on port 6081, administration on localhost:6082, and forward to
  4. # one content server selected by the vcl file, based on the request.  Use a 1GB
  5. # fixed-size cache file.
  6. #
  7. DAEMON_OPTS="-a :6081
  8.              -T localhost:6082
  9.              -f /etc/varnish/default.vcl
  10.              -S /etc/varnish/secret
  11.              -s malloc,256m"

我们需要编辑-f选项。 将其更改为:

  1. -f /etc/varnish/user.vcl

或者你喜欢的任何名称。 重要的是让您的配置独立于默认的VCL文件,因为软件包更新可能会覆盖它。
从上面的配置,我们还看到Varnish将其缓存项存储在内存中,并且设置最多使用256MB的内存。 如果您需要调整此分配,只需编辑此行上的值:

  1. -s malloc,256m

稍后再编辑这些守护进程选项。 现在,让我们来配置Varnish的后端。

基本配置

Varnish通过Varnish配置语言(VCL)进行配置。 一旦配置文件被加载,Varnish将VCL代码翻译并编译成与Varnish进程并行运行的C程序。
让我们开始定制您的VLC。 首先将default.vcl复制到一个新文件:

  1. cd /etc/varnish
  2. cp default.vcl user.vcl
  3. nano user.vcl

配置后端

1.首先,先更改varnish的后端,如Apache。 这是Varnish将请求转发到的地方,也就是要缓存的内容来源。 在我们的示例中,我们的后端Apache运行在80端口,与Varnish在同一台服务器上,因此相应地更改后端:

  1. backend default {
  2.     .host = "127.0.0.1";
  3.     .port = "80";
  4. }

2.重新启动Varnish

  1. service varnish restart

3.默认情况下,Varnish在端口6081上运行,因此在Web浏览器中,访问服务器上的端口6081:

  1. http://example.com:6081

您应该会看到您网站的首页。 要确认您看到的是网站的缓存版本,请检查返回的响应头。 您应该会看到以下两个响应头:

  1. Via: 1.1 varnish
  2. Age: 10

配置缓存生存时间(TTL)

默认情况下,Varnish将缓存请求两分钟。 如果您想调整此项,请返回并打开您的VCL文件,并通过在后端声明下面添加此代码覆盖vcl_fetch子例程:

  1. sub vcl_fetch
  2. {
  3.     set beresp.ttl = 5m;
  4. }

在从后端获取请求后调用此子例程。 您可以看到我们将对象TTL变量设置为五分钟。 值可以是秒(120秒),分钟(2分)或小时(2小时)。 您的理想TTL可能需要根据网站上的内容更新频率,网站的大小以及您需要处理的流量有所不同。

放置varnish到前端

如果上面的varnish配置能符合预期正常工作,那我们现在让Varnish和Apache交换端口,以便我们的网站的请求默认通过Varnish。
1.要更改Apache的端口,我们需要编辑/etc/apache2/ports.conf和任何存在的虚拟主机。 打开ports.conf以查找NameVirtualHost *:80和Listen 80,并把80端口更改为另一个端口。 我们将使用8080:

  1. NameVirtualHost *:8080
  2. Listen 8080

2.接下来,进入/etc/apache2/sites-available,并更改每个VirtualHost声明的开头,以更改新的端口号:

  1. <VirtualHost *:8080>

3.现在我们配置Varnish监听端口80。回到我们的守护进程选项文件(/etc/default/varnish),找到我们之前编辑的未注释的选项。 带-a标志的行指定端口号,更改为80:

  1. DAEMON_OPTS="-a :80

4.最后,我们需要编辑Varnish的后端配置,打开/etc/varnish/user.vcl并将后端配置更改为:

  1. backend default {
  2.     .host = "127.0.0.1";
  3.     .port = "8080";
  4. }

5.重启Apache和Varnish

  1. service apache2 reload
  2. service varnish restart

高级配置

VCL提供了对缓存请求的多种配置,并且可以根据需要对varnish进行一些自定义修改。 让我们来看一些常见的VCL修改,以及一些提示和技巧。

跳过某些请求的缓存

如果你的服务器运行多个网站,通常想要从Varnish的缓存中排除它们中的一些。 为此,我们将通过Varnish的请求对象来获取有关请求的信息,并根据条件告诉varnish将请求直接传递给后端。
我们需要在我们的VCL文件中覆盖vcl_recv子例程,每次Varnish收到请求时都运行它,然后添加一个条件:

  1. sub vcl_recv
  2. {
  3.     if (req.http.host ~ "example.com" ||
  4.         req.url ~ "^/admin")
  5.     {   
  6.         return (pass);
  7.     }
  8. }

你可以看到我们设置的不想缓存的两个条件。 第一个是针对example.com的任何请求,第二个是针对以/admin开头的任何URI请求。 如果这些都满足,Varnish不会缓存请求。

删除cookies

如前所述,如果Varnish检测到您的网站正在设置Cookie,它会假设您的网站需要与这些Cookie进行交互,并相应地显示动态内容,导致Varnish将不会缓存这些网页。 我们可以通过在Varnish的req.http对象清空Cookies。
将它添加到我们的VLC中的vcl_recv的底部:

  1. unset req.http.Cookie;

您可能会发现特定的Cookie对于显示内容很重要,或者用来确定您的用户是否已登录。 在这种情况下,您可能不想显示缓存的内容,只要将用户直接发送到后端。
对于这种情况,我们将检查req.http.Cookie一个名为“logged_in”的cookie,如果我们找到它,将请求直接传递到后端。 这里是我们整个vcl_recv子例程:

  1. sub vcl_recv
  2. {
  3.     if (req.http.host ~ "example.com" ||
  4.         req.url ~ "^/admin" ||
  5.         req.http.Cookie ~ "logged_in")
  6.     {   
  7.         return (pass);
  8.     }
  9.  
  10.     unset req.http.Cookie;
  11. }

缓存POST还是不缓存POST?

很可能你不想缓存POST请求,因为他们可能需要与后端交互以收集动态数据或设置用户的会话。 在上面的例子中,我们选择不缓存请求,如果用户登录。我们需要确保他们可以登录。 一个简单的方法是跳过POST请求。
让我们将这个条件添加到我们现有的在vcl_recv中的return(pass)块:

  1. if (req.http.host ~ "example.com" ||
  2.     req.url ~ "^/admin" ||
  3.     req.http.Cookie ~ "logged_in" ||
  4.     req.request == "POST")
  5. {   
  6.     return (pass);
  7. }

最终VCL文件

/etc/varnish/user.vcl:

  1. backend default {
  2.     .host = "127.0.0.1";  # IP address of your backend (Apache, nginx, etc.)
  3.     .port = "8080";       # Port your backend is listening on
  4.     .probe = {
  5.         .url = "/";
  6.         .timeout = 34ms;
  7.         .interval = 1s;
  8.         .window = 10;
  9.         .threshold = 8;
  10.     }
  11. }
  12.  
  13. sub vcl_recv
  14. {
  15.    # Do not cache example.com, the admin area,
  16.    # logged-in users or POST requests
  17.    if (req.http.host ~ "example.com" ||
  18.         req.url ~ "^/admin" ||
  19.         req.http.Cookie ~ "logged_in" ||
  20.         req.request == "POST")
  21.     {
  22.         return (pass);
  23.     }
  24.  
  25.     # Don’t allow cookies to affect cachability
  26.     unset req.http.Cookie;
  27.  
  28.     # Set Grace Time to one hour
  29.     set req.grace = 1h;
  30. }
  31.  
  32. sub vcl_fetch
  33. {
  34.     # Set the TTL for cache object to five minutes
  35.     set beresp.ttl = 5m;
  36.  
  37.     # Set Grace Time to one hour
  38.     set beresp.grace = 1h;
  39. }