如何设置缓存反向代理使用Squid 2.6在Debian Etch

如何设置缓存反向代理与squid 2.6在Debian Etch

版本1.0
作者:Falko Timme

本文介绍如何在Debian Etch上的Web服务器前面使用Squid 2.6设置缓存反向代理。 如果您拥有高流量的动态网站,可以在每个请求上生成大量数据库查询,您可以通过缓存内容几分钟或更长时间(取决于更新内容的频率)来显着减少服务器负载。

我不会保证这将为您工作!

1初步说明

在本指南中,我将调用要缓存www.example.com的网站 ,并在Apache2上运行。 我将在同一个服务器上安装Squid,并配置Apache监听端口8080和端口80上的Squid,以便所有HTTP请求都转到Squid,然后将它们传递给Apache(除非可以满足缓存的请求)。

当然,您可以在其他系统上安装Squid,然后让Apache在80端口上运行。

2准备后端Web服务器(Apache)

Squid将在称为X-Forwarded-For的字段中将原始用户的IP地址传递给后端Web服务器(Apache)。 当然,后端Web服务器应该在其访问日志中记录原始用户的IP地址,而不是我们的Squid代理的IP地址。 因此,我们必须修改/etc/apache2/apache2.conf中的LogFormat行,并用%{X-Forwarded-For} i替换%h

vi /etc/apache2/apache2.conf
[...]
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
[...]

接下来我们打开/etc/apache2/ports.conf ...

vi /etc/apache2/ports.conf

...并将Apache应该监听的端口更改为8080

Listen 8080

之后我们重新启动Apache:

/etc/init.d/apache2 restart

3安装和配置Squid

Squid可以安装如下:

apt-get install squid

接下来,我们备份原始的squid.conf文件( /etc/squid/squid.conf ):

cd /etc/squid/
mv squid.conf squid.conf_orig

squid.conf_orig的长度超过4000行 - 它包含所有有效的Squid 2.6配置选项以及许多注释。 虽然这是很多阅读,你一定要花点时间去研究它!

现在我们可以为我们的服务器创建一个squid.conf文件:

vi squid.conf
cache_mgr root

# Basic parameters
visible_hostname www.example.com

# This line indicates the server we will be proxying for
http_port 80 defaultsite=www.example.com vhost

# And the IP Address for it - adjust the IP and port if necessary
cache_peer 127.0.0.1 parent 8080 0 no-query originserver login=PASS

acl apache rep_header Server ^Apache
broken_vary_encoding allow apache

# Where the cache files will be, memory and such
cache_dir ufs /var/spool/squid 10000 16 256
cache_mem 256 MB
maximum_object_size_in_memory 128 KB

# Log locations and format
#logformat common %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st %Ss:%Sh
logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh

access_log /var/log/squid/access.log combined

# Example how to configure Squid to not log certain requests
#acl dontlog urlpath_regex ^\/monit\/token$
#acl dontlog urlpath_regex ^\/server-status$
#acl dontlog urlpath_regex ^\/admedia\/reste_300x250.php$
#acl dontlog urlpath_regex ^\/admedia\/reste_120x600.php$
#acl dontlog urlpath_regex ^\/admedia\/reste_728x90.php$
#acl dontlog urlpath_regex ^\/geoip\/rectangle_forum_postbit.html$
#acl dontlog urlpath_regex ^\/geoip\/banner_iframe.php
#acl dontlog urlpath_regex ^\/js\/amazon.js
#acl dontlog urlpath_regex .js$
#acl dontlog urlpath_regex .css$
#acl dontlog urlpath_regex .png$
#acl dontlog urlpath_regex .gif$
#acl dontlog urlpath_regex .jpg$
#access_log /var/log/squid/access.log combined !dontlog

cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log
logfile_rotate 10
## put this in crontab to rotate logs at midnight:
## 0 0 * * * /usr/sbin/squid -k rotate &> /dev/null

hosts_file /etc/hosts

# Basic ACLs
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl Safe_ports port 80
acl purge method PURGE
acl CONNECT method CONNECT

http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access allow localhost
http_access allow all
http_access allow all
http_reply_access allow all

icp_access allow all

cache_effective_group proxy

coredump_dir /var/spool/squid

forwarded_for on

emulate_httpd_log on

redirect_rewrites_host_header off

buffered_logs on

# Do not cache cgi-bin, ? urls, posts, etc.
hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
acl POST method POST
no_cache deny QUERY
no_cache deny POST

# Example how to configure Squid to not cache certain URLs
#acl adminurl urlpath_regex ^/myadminpanel
#no_cache deny adminurl
#acl phpmyadminurl urlpath_regex ^/phpmyadmin
#no_cache deny phpmyadminurl

这是标准的东西。 如果需要,请确保调整主机名和IP地址。 cache_peer行中的login = PASS选项使得.htaccess身份验证通过缓存传递。 我已经添加了一些(注释掉)的行,显示如何配置Squid在其访问日志中不记录某些请求,以及如何告诉它不缓存某些URL。

此配置假设所有用户都看到相同的内容,即您没有登录用户应该看到与匿名用户不同的用户。 如果您登录的用户不应该看到缓存的内容,请继续阅读 - 稍后我会来看看(第5章)。

现在更改squid.conf的权限并重新启动Squid:

chmod 600 squid.conf
/etc/init.d/squid restart

3.1日志旋转

我们假设您希望Squid在午夜每天启动新的日志文件( access.logcache.logstore.log ),因为您的日志分析程序需要这样做 。 为此,您需要使用squid.conf (见上文)中的logfile_rotate指令,并保留许多旧日志文件(例如,如果指定10 ,则Squid将保留最后十个日志文件, access.log.0 - 访问.log.9cache.log.0 - cache.log.9store.log.0 - store.log.9 )。

为了告诉Squid启动一个新的日志文件,我们必须创建以下每个午夜运行的cron作业:

crontab -e
0 0 * * * /usr/sbin/squid -k rotate &> /dev/null
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏