如何设置缓存反向代理与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.log
, cache.log
, store.log
),因为您的日志分析程序需要这样做
。 为此,您需要使用squid.conf
(见上文)中的logfile_rotate
指令,并保留许多旧日志文件(例如,如果指定10
,则Squid将保留最后十个日志文件, access.log.0
- 访问.log.9
, cache.log.0
- cache.log.9
和store.log.0
- store.log.9
)。
为了告诉Squid启动一个新的日志文件,我们必须创建以下每个午夜运行的cron作业:
crontab -e
0 0 * * * /usr/sbin/squid -k rotate &> /dev/null |