Release-Notes-1.1.txt
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:37k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. $Id: Release-Notes-1.1.txt,v 1.20 1997/07/16 20:31:50 wessels Exp $
  2. Release Notes for version 1.1 of the Squid cache.
  3. TABLE OF CONTENTS:
  4. Ident (RFC 931) lookups
  5. URL Redirector
  6. Reverse IP Lookups, client hostname ACLs
  7. Cache directory structure changes
  8.         Getting true DNS TTL info into Squid's IP cache
  9. Using a neighbor as both a parent and a sibling
  10. Forcing your neighbors to use you as a sibling
  11. Refresh Rules and If-Modified-Since
  12. Overriding neighbor refresh rules
  13. Object Purge Policy
  14. X-Forwarded-For request header
  15. Network Probe Database
  16. Planning for Squid's Memory Usage
  17. Default Parent
  18. Cachemgr Passwords
  19. Round-Robin IP
  20. Store Hash Configuration Options
  21. GNU malloc
  22. GNU regex
  23. Access Log Fields
  24. Access Log Tags
  25. Hierarchy Data Tags
  26. Using Multicast ICP
  27. Store.log Fields
  28. Notes for running Squid under NEXTSTEP
  29. Ident (RFC 931) lookups
  30. ==============================================================================
  31. Squid will make an RFC931/ident request for client connections if
  32. 'ident_lookup' is enabled in the config file.  Currently, the ident
  33. value is only logged with the request in the access.log.  It is not
  34. currently possible to use the ident return value for access control
  35. purposes.
  36. URL Redirector
  37. ==============================================================================
  38. Squid now has the ability to rewrite requested URLs.  Implemented
  39. as an external process (similar to a dnsserver), Squid can be
  40. configured to pass every incoming URL through a 'redirector' process 
  41. that returns either a new URL, or a blank line to indicate no change.
  42. The redirector program is NOT a standard part of the Squid package.
  43. However there are a couple of user-contributed redirectors in the
  44. "contrib/" directory.  Since everyone has different needs, it is up to
  45. the individual administrators to write their own implementation.  For
  46. testing, and a place to start, this very simple Perl script can be
  47. used:
  48.     #!/usr/local/bin/perl
  49.     $|=1;
  50.     print while (<>);
  51. The redirector program must read URLs (one per line) on standard input,
  52. and write rewritten URLs or blank lines on standard output.  Note that
  53. the redirector program can not use buffered I/O.  Squid writes
  54. additional information after the URL which a redirector can use to make
  55. a decision.  The input line consists of four fields:
  56.     URL ip-address/fqdn ident method
  57. The ip-address is always given, the fqdn and ident fields will be given if
  58. available, or will be "-" otherwise.  Note that the ident value will only
  59. be available if 'ident_lookup' in enabled in the config file.  The
  60. request method is GET, POST, etc.
  61. Note that when used in conjunction with the -V option (on a virtual hosted
  62. machine) this provides a mechanism to use a single Squid cache as a front
  63. end to numerous servers on different machines.  URLs written to the
  64. redirector will look like:
  65.     http://192.0.0.1/foo
  66.     http://192.0.0.2/foo
  67. The redirector program might be this Perl script:
  68.     #!/usr/local/bin/perl
  69.     $|=1;
  70.     while (<>) {
  71.         s@http://192.0.0.1@http://www1.foo.org@;
  72.         s@http://192.0.0.2@http://www2.foo.org@;
  73.         print;
  74.     }
  75. You may receive statistics on the redirector usage by requesting the
  76. following 'cache_object' URL:
  77.     % client cache_object://localhost/stats/redirector
  78. Reverse IP Lookups, client hostname ACLs.
  79. ==============================================================================
  80. Squid now has a address-to-hostname cache ("fqdncache") much like the
  81. name-to-address cache ("ipcache").  This means Squid can now write 
  82. client hostnames in the access log, and that client domain names can
  83. be used in ACL expressions.
  84. If you would like to log hostnames instead of addresses, enable
  85. 'log_fqdn' in your config file.  This causes a reverse-lookup to be
  86. started just after the client connection has been accepted.  If the
  87. reverse lookup has completed by the time the entry gets logged, the
  88. fully qualified domain name will be used, otherwise the IP address
  89. is still logged.  Squid does not wait for the reverse lookup before
  90. logging the access.
  91. A new ACL type has been added for matching client hostnames:
  92.     acl Myusers srcdomain foo.org
  93. The use of this ACL type may cause noticeable delay in serving objects
  94. through the cache.  However, so long as allowed clients are local, the
  95. reverse lookup should not take very long and the delay may not be
  96. noticed.
  97. Only the FQDN (i.e. the h_name field) is used for the comparison, 
  98. host aliases are *not* checked.
  99. If a reverse lookup fails, the word "none" will be used for the
  100. comparison.  If you wanted to deny access to clients which did not
  101. map back to valid names, you could use
  102.     acl BadClients srcdomain none
  103.     http_access deny BadClients
  104. NOTE: DNS has a number of known security problems.  Squid does not make
  105. any effort to guarantee the validity of data returned from gethostbyname()
  106. or gethostbyaddr() calls.
  107. Cache directory structure changes
  108. ==============================================================================
  109. The following improvements to the cache directory structure are due
  110. to Mark Treacy (mark@aone.com.au).
  111. Squid-1.0 used 100 first-level directories for each 'cache_dir'.  For
  112. very large caches, this meant between 5,000-10,000 files per directory,
  113. which isn't good for performance on any unix system.  As well as the
  114. directory search times being slow, the amount of disk traffic due to
  115. directory operations was quite large (due to directory fragmentation
  116. (variable length filenames) each directory was about 100k in size).
  117. To reduce the number of files per directory it was necessary to
  118. increase the number of directories used.  If this was done using a
  119. single level directory structure we would have a single 'cache_dir'
  120. with an excessive number of directories in it.  Hence we went to a 2
  121. level structure.  We wanted to keep each directory smaller than a
  122. filesystem block (usually 4-8k), and also wanted to be able to
  123. accommodate 1M+ objects.  Assuming approximately 256 objects per
  124. directory, we settled on 16 first-level (L1) and 256 second-level (L2)
  125. directories for a total of 16x256x256 = 1,048,576 objects.
  126. The number of L1 and L2 directories to use is configurable in the
  127. squid.conf file (swap_level1_dirs, swap_level2_dirs).  To estimate the
  128. optimal numbers for your installation, we recommend the following
  129. formula:
  130. given:
  131. DS = amount of 'cache_swap' / number of 'cache_dir's
  132. OS = avg object size = 20k
  133. NO = objects per L2 directory = 256
  134. calculate:
  135. L1 = number of L1 directories
  136. L2 = number of L2 directories
  137. such that:
  138. L1 x L2 = DS / OS / NO
  139. Getting true DNS TTL info into Squid's IP cache
  140. ==============================================================================
  141. If you have source for BIND, you can modify it as indicated in the diff
  142. below.  It causes the global variable _dns_ttl_ to be set with the TTL
  143. of the most recent lookup.  Then, when you compile Squid, the configure
  144. script will look for the _dns_ttl_ symbol in libresolv.a.  If found, 
  145. dnsserver will return the TTL value for every lookup.
  146. This hack was contributed by Endre Balint Nagy <bne@CareNet.hu>
  147. diff -ru bind-4.9.4-orig/res/gethnamaddr.c bind-4.9.4/res/gethnamaddr.c
  148. --- bind-4.9.4-orig/res/gethnamaddr.c Mon Aug  5 02:31:35 1996
  149. +++ bind-4.9.4/res/gethnamaddr.c Tue Aug 27 15:33:11 1996
  150. @@ -133,6 +133,7 @@
  151.  } align;
  152.  
  153.  extern int h_errno;
  154. +int _dns_ttl_;
  155.  
  156.  #ifdef DEBUG
  157.  static void
  158. @@ -223,6 +224,7 @@
  159.   host.h_addr_list = h_addr_ptrs;
  160.   haveanswer = 0;
  161.   had_error = 0;
  162. + _dns_ttl_ = -1;
  163.   while (ancount-- > 0 && cp < eom && !had_error) {
  164.   n = dn_expand(answer->buf, eom, cp, bp, buflen);
  165.   if ((n < 0) || !(*name_ok)(bp)) {
  166. @@ -232,8 +234,11 @@
  167.   cp += n; /* name */
  168.   type = _getshort(cp);
  169.    cp += INT16SZ; /* type */
  170. - class = _getshort(cp);
  171. -  cp += INT16SZ + INT32SZ; /* class, TTL */
  172. + class = _getshort(cp);  
  173. + cp += INT16SZ;                  /* class */
  174. + if (qtype == T_A  && type == T_A)
  175. + _dns_ttl_ = _getlong(cp);
  176. + cp += INT32SZ;                  /* TTL */
  177.   n = _getshort(cp);
  178.   cp += INT16SZ; /* len */
  179.   if (class != C_IN) {
  180. Using a neighbor as both a parent and a sibling
  181. ==============================================================================
  182. The only difference between a sibling and a parent is that
  183. cache misses are NOT fetched from siblings.  In some cases it may be
  184. desirable to use a neighbor as a parent for some domains and as a
  185. sibling for others.  This can now be accomplished with the
  186. 'neighbor_type_domain' configuration tag.  For example:
  187. cache_host  parent cache.foo.org 3128 3130
  188. neighbor_type_domain cache.foo.org sibling .com .net
  189. neighbor_type_domain cache.foo.org sibling .au .de
  190. Note that neighbor_type_domain is totally separate from the
  191. cache_host_domain option (which controls whether or not to query the
  192. neighbor).  In the absence of cache_host_domain restrictions, the
  193. neighbor cache.foo.org will be queried for all requests.
  194. If the URL host domain is .com, .net, .au, or .de then cache.foo.org is
  195. treated as a sibling (and MISSES will NOT be fetched through
  196. cache.foo.org).  Otherwise it will be treated as a parent (which is the
  197. default from the cache_host line.
  198. Forcing your neighbors to use you as a sibling
  199. ==============================================================================
  200. In a distributed cache hierarchy, you may need to force your peer
  201. caches to use you as a sibling and not a parent; ie its okay for
  202. them to fetch HITs from you, but not okay to resolve MISSes through
  203. your cache (using your resources).
  204. This can be accomplished by using the 'miss_access' config line.  The
  205. miss_access ACL list is very similar to the 'http_access' list.  This
  206. functionality is implemented as a separate access list because when we
  207. check the http_access list, we don't yet know if the request will be a
  208. hit or miss.  The sequence of events goes something like this:
  209. 1. accept new connection
  210. 2. read request
  211. 3. check http_access
  212. 4. process request, check for hit or miss (IMS, etc)
  213. 5. check miss_access
  214. Note that in order to get to the point where miss_access is checked, the
  215. request must have also passed the http_access check.
  216. You probably only want to use 'src' type ACL's with miss_access, although
  217. you can use any of the access control types.
  218. If you are restricting your neighbors, be sure to allow miss_access
  219. to your local clients (e.g. users at browsers)!
  220. Refresh Rules and If-Modified-Since
  221. ==============================================================================
  222. Squid 1.1 switched from a Time-To-Live based expiration model to a
  223. Refresh-Rate model.  Objects are no longer purged from the cache when
  224. they expire.  Instead of assigning TTL's when the object enters the
  225. cache, we now check freshness requirements when objects are requested.
  226. If an object is "fresh" it is given directly to the client.  If it is
  227. "stale" then we make an If-Modified-Since request for it.
  228. When checking the object freshness, we calculate these values:
  229.     AGE is how much the object has aged *since* it was retrieved:
  230.                 
  231. AGE = NOW - OBJECT_DATE
  232.     LM_AGE is how old the object was *when* it was retrieved:
  233. LM_AGE = OBJECT_DATE - LAST_MODIFIED_TIME
  234.     LM_FACTOR is the ratio of AGE to LM_AGE:
  235. LM_FACTOR = AGE / LM_AGE
  236.     CLIENT_MAX_AGE is the (optional) maximum object age the client will
  237.     accept as taken from the HTTP/1.1 Cache-Control request header.
  238.     EXPIRES is the (optional) expiry time from the server reply headers.
  239. These values are compared with the parameters of the 'refresh_pattern'
  240. rules.  The refresh parameters are:
  241. URL regular expression
  242. MIN_AGE
  243. PERCENT
  244. MAX_AGE
  245. The URL regular expressions are checked in the order listed until a
  246. match is found.  Then this algorithm is applied for determining if an
  247. object is fresh or stale:
  248.     if (CLIENT_MAX_AGE)
  249.         if (AGE > CLIENT_MAX_AGE)
  250.             return STALE
  251.     if (AGE <= MIN_AGE)
  252.         return FRESH
  253.     if (EXPIRES) {
  254.         if (EXPIRES <= NOW)
  255.             return STALE
  256.         else
  257.             return FRESH
  258.     }
  259.     if (AGE > MAX_AGE)
  260.         return STALE
  261.     if (LM_FACTOR < PERCENT)
  262.         return FRESH
  263.     return STALE
  264. Note that the Max-Age in a client request takes the highest precedence.
  265. The 'MIN' value should normally be set to zero since it has higher
  266. precedence than the server's Expires: value.  But if you wish to
  267. override the Expires: headers, you may use the MIN value.
  268. Overriding neighbor refresh rules
  269. ==============================================================================
  270. The refresh rules also have an effect on the requests your cache makes
  271. to its neighbors.  Squid uses the MAX_AGE value in the HTTP/1.1
  272. "Cache-Control: Max-age=nnn" request header for outgoing requests.
  273. This solves the problem where neighbors with more relaxed refresh
  274. policies would send you stale objects (by your configuration).
  275. Object Purge Policy
  276. ==============================================================================
  277. Squid attempts to keep the size of the disk cache relatively "smooth"
  278. or "flat."  That is, objects are removed at the same rate they are
  279. added.  Earlier versions had a "sawtooth" behavior where objects were
  280. removed only when disk space reached an upper limit.
  281. Squid uses a Least-Recently-Used (LRU) replacement algorithm.  Objects
  282. with large LRU age values are removed before objects with small LRU age
  283. values.  We dynamically calculate the LRU age threshold, above which
  284. objects are removed.  The threshold is calculated as an exponential
  285. function between the high and low water marks.  When the store swap
  286. size is near the low water mark, the LRU threshold is large.  This
  287. encourages more objects to be cached.  When the store swap size is near
  288. the high water mark, the LRU threshold is small, encouraging more
  289. objects to be removed.  The 'reference_age' configuration parameter
  290. specifies the upper limit on the LRU age threshold.
  291. The Squid cache storage is implemented as a hash table with some number
  292. of "hash buckets."  Squid scans one bucket at a time and sorts all the
  293. objects in the bucket by their LRU age.  Objects with an LRU age
  294. over the threshold are removed.  The scan rate is adjusted so that
  295. it takes approximately 24 hours to scan the entire cache.  The 
  296. store buckets are randomized so that we don't always scan the same
  297. buckets at the same time of the day.
  298. If the store swap size somehow exceeds the high water mark, Squid
  299. performs an "emergency" object purge.  We sort up to 256 objects in a
  300. store bucket and remove the eight (8) least recently used ones.  This
  301. continues until the disk space is below the low water mark.
  302. X-Forwarded-For request header
  303. ==============================================================================
  304. Squid used to add a request header called "Forwarded" which appeared
  305. in some early HTTP/1.1 draft documents.  This header had the format
  306.     Forwarded: by cache-host for client-address
  307. Current HTTP/1.1 draft documents instead use the "Via" header, but it
  308. does not provide any standard way of indicating the client address
  309. in the request.  Since a number of people missed having the originating
  310. client address in the request, Squid now adds its own request header
  311. called "X-Forwarded-For" which looks like this:
  312.     X-Forwarded-For: 128.138.243.150, unknown, 192.52.106.30
  313. Entries are always IP addresses, or the word "unknown" if the address
  314. could not be determined or if it has been disabled with the
  315. 'forwarded_for' configuration option.
  316. We must note that access controls based on this header are extremely
  317. weak and simple to fake.  Anyone may hand-enter a request with any IP
  318. address whatsoever.  This is perhaps the reason why client IP addresses
  319. have been omitted from the HTTP/1.1 specification.
  320. Using ICMP to Measure the Network
  321. ==============================================================================
  322. As of version 1.1.9, Squid is able to utilize ICMP Round-Trip-Time (RTT)
  323. measurements to select the optimal location to forward a cache miss.
  324. Previously, cache misses would be forwarded to the parent cache
  325. which returned the first ICP reply message.  These were logged
  326. with FIRST_PARENT_MISS in the access.log file.  Now we can 
  327. select the parent which is closest (RTT-wise) to the origin 
  328. server.  
  329.  1. Supporting ICMP in your Squid cache
  330.     It is more important that your parent caches enable the ICMP
  331.     features.  If you are acting as a parent, then you may want
  332.     to enable ICMP on your cache.  Also, if your cache makes
  333.     RTT measurements, it will fetch objects directly if your 
  334.     cache is closer than any of the parents.
  335.     If you want your Squid cache to measure RTT's to origin servers,
  336.     Squid must be compiled with the USE_ICMP option.  This is easily
  337.     accomplished by uncommenting "-DUSE_ICMP=1" in src/Makefile and
  338.     src/Makefile.in.
  339.     An external program called 'pinger' is responsible for sending and
  340.     receiving ICMP packets.  It must run with root privileges.  After
  341.     Squid has been compiled, the pinger program must be installed
  342.     separately.  A special Makefile target will install 'pinger' with
  343.     appropriate permissions.
  344.         % make install
  345.         % su
  346.         # make install-pinger
  347.     There are three configuration file options for tuning the
  348.     measurement database on your cache.  'netdb_low' and 'netdb_high'
  349.     specify high and low water marks for keeping the database to a
  350.     certain size  (e.g. just like with the IP cache).  The 'netdb_ttl'
  351.     option specifies the minimum rate for pinging a site.  If
  352.     'netdb_ttl' is set to 300 seconds (5 minutes) then an ICMP packet
  353.     will not be sent to the same site more than once every five
  354.     minutes.  Note that a site is only pinged when an HTTP request for
  355.     the site is received.
  356.     Another option, 'minimum_direct_hops' can be used to try finding
  357.     servers which are close to your cache.  If the measured hop count
  358.     to the origin server is less than or equal to minimum_direct_hops,
  359.     the request will be forwarded directly to the origin server.
  360.  2. Utilizing your parents database
  361.     Your parent caches can be asked to include the RTT measurements
  362.     in their ICP replies.  To do this, you must enable 'query_icmp'
  363.     in your config file:
  364.         query_icmp on
  365.     This causes a flag to be set in your outgoing ICP queries. 
  366.     If your parent caches return ICMP RTT measurements then 
  367.     the eighth column of your access.log will have lines 
  368.     similar to:
  369.         CLOSEST_PARENT_MISS/it.cache.nlanr.net
  370.     In this case, it means that 'it.cache.nlanr.net' returned 
  371.     the lowest RTT to the origin server.  If your cache measured
  372.     a lower RTT than any of the parents, the request will
  373.     be logged with
  374.         CLOSEST_DIRECT/www.sample.com
  375.  3. Inspecting the database
  376.     The measurement database can be viewed from the cachemgr by
  377.     selecting "Network Probe Database."  Hostnames are aggregated
  378.     into /24 networks.  All measurements made are averaged over
  379.     time.  Measurements are made to specific hosts, taken from
  380.     the URLs of HTTP requests.  The recv and sent fields are the
  381.     number of ICMP packets sent and received.  At this time they
  382.     are only informational.
  383.     A typical database entry looks something like this:
  384.     Network          recv/sent     RTT  Hops Hostnames
  385.     192.41.10.0        20/  21    82.3   6.0 www.jisedu.org www.dozo.com 
  386.         bo.cache.nlanr.net        42.0   7.0
  387.         uc.cache.nlanr.net        48.0  10.0
  388.         pb.cache.nlanr.net        55.0  10.0
  389.         it.cache.nlanr.net       185.0  13.0
  390.     This means we have sent 21 pings to both www.jisedu.org and
  391.     www.dozo.com.  The average RTT is 82.3 milliseconds.  The 
  392.     next four lines show the measured values from our parent
  393.     caches.  Since 'bo.cache.nlanr.net' has the lowest RTT,
  394.     it would be selected as the location to forward a request
  395.     for a www.jisedu.org or www.dozo.com URL.
  396. Planning for Squid's Memory Usage
  397. ==============================================================================
  398. Squid-1.1 has better memory management, although still not ideal.  
  399. Squid uses memory in a variety of ways, but the bulk of memory
  400. usage falls into two categories: per-object metadata and in-transit
  401. objects.
  402. The per-object metadata consists of a StoreEntry data structure, plus
  403. the URL for every object your cache knows about.  This usually averages
  404. out to about 100 bytes per object.  If you assume that the objects
  405. themselves average 20 KB each, then given your disk size ('cache_swap')
  406. you need 1/200th as much for in-memory object metadata.
  407. The other big memory use is due to in-transit objects.  The amount
  408. of memory required for this will depend on your cache's usage patterns.
  409. Obviously a more busy cache will require more memory for in-transit
  410. objects.
  411. The 'cache_mem' parameter places a soft upper limit on the amount of
  412. memory Squid allocates for holding whole objects in VM.  The
  413. 'cache_mem' memory is allocated as a pool of 4k blocks.  Objects held
  414. in memory are stored in blocks from this pool.  The 'cache_mem_low' and
  415. 'cache_mem_high' values affect the memory reclamation algorithm.
  416. There are two types of in-memory objects: in-transit objects and
  417. completed objects.  The in-transit objects are "locked" in memory until
  418. they are completed.  The completed objects may be either normal or
  419. "negative-cached" objects.
  420. Whenever new memory is needed for in-transit objects and current usage
  421. is above the high water mark, Squid purges some completed objects from
  422. memory.   The in-memory objects are sorted by time of last use and then
  423. removed in order until memory usage is below the low water mark.
  424. Occasionally Squid may need to exceed the maximum number of blocks.
  425. This will happen if all of the in-transit objects will not fit within
  426. the 'cache_mem' pool size.  You will see this warning in your cache.log
  427. file:
  428.     WARNING: Exceeded 'cache_mem' size (4122K > 4096K)
  429. If this warning occurs frequently then you need to consider either
  430. increasing the 'cache_mem' value or decreasing the
  431. 'maximum_object_size' value.  If the cache_mem usage is above the low
  432. water mark, then Squid will check for objects larger than
  433. 'maximum_object_size.'  Any such objects are put into "delete behind"
  434. mode which means Squid releases the section of the object which has
  435. been delivered to all clients reading from it.
  436. As a rule-of-thumb, you should probably set 'cache_mem' to 1/3 of your
  437. machine's physical memory amount.  You can plan on another 1/3 being
  438. used by the per-object metadata.  And the final 1/3 will be used by
  439. other data structures, unaccounted memory, and malloc() overhead.
  440. Note, this assumes that the machine will be dedicated to running
  441. Squid.  If there are other services on the machine, the memory
  442. estimates should be lowered.
  443. Default Parent
  444. ==============================================================================
  445. Squid has the ability to mark parent caches as the 'default' way to 
  446. fetch objects.  This is probably only useful with the 'no-query' option.
  447. For example, the configuration
  448.      cache_host N1 sibling 3128 3130
  449.      cache_host N2 sibling 3128 3130
  450.      cache_host N3 sibling 3128 3130
  451.      cache_host P1 parent 3128 3130 no-query default
  452. will result in ICP queries to sibling caches N1, N2, and N3.  If none
  453. of the siblings has the requested object then it will be retrieved
  454. through parent P1 due to the 'default' designation.  Note that
  455. 'default' does not conflict with any 'cache_host_domain' restrictions
  456. which might be placed on a neighbor.
  457. We do not normally recommend use of the default option.  If your
  458. parent cache(s) uses ICP then you should also send them ICP queries.
  459. If your default parent is unreachable then Squid will return error
  460. messages, it will not attempt direct connections to the source.
  461. Cachemgr Passwords
  462. ==============================================================================
  463. Squid-1.1 allows cachemgr passwords to be specified in the squid.conf
  464. file (instead of an /etc/passwd entry).  There may be a different
  465. password for each cachemgr operation, but only one password per
  466. operation.  Some sensitive operations require a password, others may be
  467. executed if no passwords are given in the squid.conf file.  Operations
  468. may be disabled by setting the password to "none." See squid.conf for a
  469. full list of cachemgr operations.
  470. Round-Robin IP
  471. ==============================================================================
  472. When a hostname resolves to multiple IP addresses, Squid now cycles to
  473. the next address after each connection.  If a connection to an address
  474. fails, it is removed from the list.  If a hostname runs out of
  475. addresses, it is removed from the IP cache.
  476. Store Hash Configuration Options
  477. ==============================================================================
  478. Squid's internal hash table for holding objects has a couple of
  479. configuration options (thanks to Mark Treacy).  Given the following
  480. configuration parameters:
  481. cache_swap
  482. store_avg_object_size # default 20K
  483. store_objects_per_bucket # default 20
  484. We first estimate the number of objects your cache can hold:
  485. NUM_OBJ = cache_swap / store_avg_object_size
  486. Then we estimate the number of hash buckets needed:
  487. NUM_BUCKETS = NUM_OBJ / store_objects_per_bucket
  488. We want Squid to scan the entire hash table, one bucket at a time, over
  489. the course of about a day.  We also need NUM_BUCKETS to be a prime
  490. number for optimal distribution of the hash table.  NUM_BUCKETS is
  491. rounded off so that the number of buckets and maintenance rate are
  492. taken from this table:
  493. store_buckets store_maintain_rate
  494.      7951 10 sec
  495.     12149  7 sec
  496.     16231  5 sec
  497.     33493  2 sec
  498.     65357  1 sec
  499. If you want to increase the maintenance rate then decrease the
  500. store_objects_per_bucket parameter.
  501. GNU malloc
  502. ==============================================================================
  503. Many users have reported significant performance improvements when Squid
  504. is linked with the GNU malloc library.  A check for 'libgnumalloc.a'
  505. has therefore been added to the configure script.  If libgnumalloc.a
  506. is found, it is automatically linked in.
  507. GNU regex
  508. ==============================================================================
  509. Squid's configure script attempts to determine whether or not it should
  510. compile the GNU regex functions supplied in the source distribution.
  511. If your system appears to have its own POSIX compliant regex functions
  512. then configure may decide to use those instead of GNU regex.
  513. Access Log Fields
  514. ==============================================================================
  515. The native access.log has ten (10) fields.  There is one entry here for
  516. each HTTP (client) request and each ICP Query.  HTTP requests are
  517. logged when the client socket is closed.  A single dash ('-') indicates
  518. unavailable data.
  519.  1) Timestamp
  520. The time when the client socket is closed.  The format is "Unix
  521. time" (seconds since Jan 1, 1970) with millisecond resolution.
  522.  2) Elapsed Time
  523. The elapsed time of the request, in milliseconds.  This is time
  524. time between the accept() and close() of the client socket.
  525.  3) Client Address
  526. The IP address of the connecting client, or the FQDN if the
  527. 'log_fqdn' option is enabled in the config file.
  528.  4) Log Tag / HTTP Code
  529. The Log Tag describes how the request was treated locally (hit,
  530. miss, etc).  All the tags are described below.  The HTTP code
  531. is the reply code taken from the first line of the HTTP reply
  532. header.  Non-HTTP requests may have zero reply codes.
  533.  5) Size
  534. The number of bytes written to the client.
  535.  6) Request Method
  536. The HTTP request method, or ICP_QUERY for ICP requests.
  537.  7) URL
  538. The requested URL.
  539.  8) Ident
  540. If 'ident_lookup' is on, this field may contain the username
  541. associated with the client connection as derived from the
  542. ident service.
  543.  9) Hierarchy Data / Hostname
  544. A description of how and where the requested object was
  545. fetched.  
  546. 10) Content Type
  547. The Content-type field from the HTTP reply.
  548. Access Log Tags
  549. ==============================================================================
  550. "TCP_" refers to requests on the HTTP port (3128)
  551.         TCP_HIT A valid copy of the requested object was
  552. in the cache.
  553.         TCP_MISS The requested object was not in the cache.
  554. TCP_REFRESH_HIT The object was in the cache, but STALE.
  555. An If-Modified-Since request was made and
  556. a "304 Not Modified" reply was received.
  557. TCP_REF_FAIL_HIT The object was in the cache, but STALE.
  558. The request to validate the object failed,
  559. so the old (stale) object was returned.
  560. TCP_REFRESH_MISS The object was in the cache, but STALE.
  561. An If-Modified-Since request was made and
  562. the reply contained new content.
  563. TCP_CLIENT_REFRESH The client issued a request with the
  564. "no-cache" pragma.
  565. TCP_IMS_HIT The client issued an If-Modified-Since
  566. request and the object was in the cache
  567. and still fresh.
  568. TCP_IMS_MISS The client issued an If-Modified-Since
  569. request for a stale object.
  570.         TCP_SWAPFAIL The object was believed to be in the cache,
  571. but could not be accessed.
  572.         TCP_DENIED Access was denied for this request
  573. "UDP_" refers to requests on the ICP port (3130)
  574.         UDP_HIT         A valid copy of the requested object was in the cache.
  575.         UDP_HIT_OBJ     Same as UDP_HIT, but the object data was small enough
  576.                         to be sent in the UDP reply packet.  Saves the
  577.                         following TCP request.
  578.         UDP_MISS        The requested object was not in the cache.
  579.         UDP_DENIED      Access was denied for this request.
  580.         UDP_INVALID     An invalid request was received.
  581. UDP_RELOADING The ICP request was "refused" because the cache is
  582. busy reloading its metadata.
  583. "ERR_" refers to various types of errors for HTTP requests.
  584. Hierarchy Data Tags
  585. ==============================================================================
  586.         DIRECT                  The object has been requested from the origin
  587.                                 server.
  588.         FIREWALL_IP_DIRECT      The object has been requested from the origin
  589.                                 server because the origin host IP address is
  590.                                 inside your firewall.
  591.         FIRST_PARENT_MISS       The object has been requested from the
  592.                                 parent cache with the fastest weighted round
  593.                                 trip time.
  594.         FIRST_UP_PARENT         The object has been requested from the first
  595.                                 available parent in your list.
  596.         LOCAL_IP_DIRECT         The object has been requested from the origin
  597.                                 server because the origin host IP address 
  598.                                 matched your 'local_ip' list.
  599.         SIBLING_HIT The object was requested from a sibling cache
  600.                                 which replied with a UDP_HIT.
  601.         NO_DIRECT_FAIL          The object could not be requested because
  602.                                 of firewall restrictions and no parent caches
  603.                                 were available.
  604.         NO_PARENT_DIRECT        The object was requested from the origin server
  605.                                 because no parent caches exist for the URL.
  606.         PARENT_HIT              The object was requested from a parent cache
  607.                                 which replied with a UDP_HIT.
  608.         SINGLE_PARENT           The object was requested from the only
  609.                                 parent cache appropriate for this URL.
  610.         SOURCE_FASTEST          The object was requested from the origin server
  611.                                 because the 'source_ping' reply arrived first.
  612.         PARENT_UDP_HIT_OBJ      The object was received in a UDP_HIT_OBJ reply
  613.                                 from a parent cache.
  614.         SIBLING_UDP_HIT_OBJ     The object was received in a UDP_HIT_OBJ reply
  615.                                 from a sibling cache.
  616. PASSTHROUGH_PARENT The neighbor or proxy defined in the config
  617. option 'passthrough_proxy' was used.
  618. SSL_PARENT_MISS The neighbor or proxy defined in the config
  619. option 'ssl_proxy' was used.
  620. DEFAULT_PARENT No ICP queries were sent to any parent
  621. caches.  This parent was chosen because
  622. it was marked as 'default' in the config
  623. file.
  624. ROUNDROBIN_PARENT No ICP queries were received from any parent
  625. caches.  This parent was chosen because
  626. it was marked as 'default' in the config 
  627. file and it had the lowest round-robin use
  628. count.
  629. CLOSEST_PARENT_MISS This parent was selected because it
  630. included the lowest RTT measurement to
  631. the origin server.  This only appears
  632. with 'query_icmp on' set in the config
  633. file.
  634. CLOSEST_DIRECT The object was fetched directly from the
  635. origin server because this cache measured
  636. a lower RTT than any of the parent caches.
  637. Almost any of these may be preceeded by 'TIMEOUT_' if the two-second
  638. (default) timeout occurs waiting for all ICP replies to arrive from
  639. neighbors.
  640. Using Multicast ICP
  641. ==============================================================================
  642. As of Squid-1.1.6, ICP queries can be sent via multicast.  Use of multicast
  643. requires the following config file entries:
  644.     1) A cache which wants to *receive* multicast ICP queries must
  645.        be configured to join a multicast address.  This is done with
  646.        the 'mcast_groups' directive.    For example:
  647. mcast_groups  224.9.9.9
  648.     2) A cache which wants to *send* multicast ICP queries must add
  649.        a "multicast group" neighbor.  For example:
  650. cache_host 224.9.9.9 multicast 3128 3130 ttl=64
  651.        In this situation, the HTTP port (3128) is ignored, but the ICP
  652.        port (3130) must be correct.  All multicast group members must
  653.        use the same ICP port number.  The 'ttl=' option specifies the
  654.        IP Multicast TTL value to be used when sending a multicast
  655.        datagram.
  656.     3) Because Squid does not trust ICP replies received from unknown
  657.        peers, you must specify all acceptable neighbors which might
  658.        respond to your multicast query.  These appear as normal parents
  659.        or siblings, but with the special 'multicast-responder' option.
  660.        For example:
  661. cache_host foo.sample.com sibling 3128 3130 multicast-responder
  662. Use of multicast creates an interesting dilemma; normally Squid sends N
  663. queries and expects N replies.  But with multicast Squid doesn't really
  664. know how many replies to expect.  Somehow Squid must know roughly how
  665. many ICP replies to expect, but at the same time it must be careful to
  666. not over-estimate and therefore incur many ICP query timeouts.
  667. The current approach is this: Squid periodically (every 15 minutes)
  668. sends fake ICP queries to only multicast peers.  The replies are
  669. counted, up until the 'neighbor_timeout' time.  The count is averaged
  670. over time with a fast decay so that it adjusts relatively quickly.
  671. The number of replies to expect is rounded down to the nearest whole
  672. integer to minimize the chance of suffering the neighbor timeout
  673. on real ICP queries.
  674. Store.log Fields
  675. ==============================================================================
  676. The file store.log consists of the following fields:
  677.     time action code date lastmod expires type expect-len/real-len method key
  678.     time       The time this entry was logged.  The value is the
  679.                raw Unix time plus milliseconds.
  680.     action     One of RELEASE, SWAPIN, or SWAPOUT.
  681.                RELEASE means the object has been removed from the cache.
  682.                SWAPOUT means the object has been saved to disk.
  683.                SWAPIN  means the object existed on disk and has been
  684.                        swapped into memory.
  685.     code       The HTTP reply code.
  686.     The following three fields are timestamps parsed from the HTTP
  687.     reply headers.  All are expressed in Unix time.  A missing header
  688.     is represented with -2 and an unparsable header is represented as -1.
  689.     date       The value of the HTTP Date reply header.  If the Date
  690.                header is missing or invalid, the time of the request
  691.                is used instead.
  692.     lastmod    The value of the HTTP Last-Modified: reply header.
  693.     expires    The value of the HTTP Expires: reply header.
  694.     type       The HTTP Content-Type reply header.
  695.     expect-len The value of the HTTP Content-Length reply header.
  696.                Zero if Content-Length was missing.
  697.     real-len   The number of bytes of content actually read.  If the
  698.                expect-len is non-zero, and not equal to the real-len,
  699.                the object will be released from the cache.
  700.     method     HTTP request method
  701.     key        The cache key.  Often this is simply the URL.  Cache objects
  702.                which never become public will have cache keys that include
  703.                a unique integer sequence number, the request method, and
  704.                then the URL.
  705. Notes for running Squid under NEXTSTEP
  706. ==============================================================================
  707. When running Squid under NEXTSTEP 3.x, and when that NEXTSTEP system
  708. runs a BIND named process (most NEXTSTEPS handle that through netinfo
  709. and netinfo might contact a BIND named on another system) squid can
  710. trigger an error in the older BIND named that comes with NEXTSTEP 3.x.
  711. It is therefore necessary for systems running NEXTSTEP 3.x, which run
  712. their own BIND named, to run a more recent version of BIND. Luckily you
  713. don't have to compile BIND yourself, a fat (m68k i486 hppa sparc)
  714. Installer package for BIND-4.9.5 is available through
  715. ftp://ftp.nluug.nl/pub/comp/next/Internet.
  716. NB: It might be necessary to have BIND running to run Squid under
  717. NEXTSTEP releases before NEXTSTEP 3.3+patch. Earlier releases of
  718. NEXTSTEP did not have a multithreaded netinfo resolver, which means
  719. that Squid's use of multiple dnsserver processes to prevent blocking is
  720. thwarted by netinfo blocking on every request.
  721. Gerben Wierda <Gerben_Wierda@RnA.nl>