.. Licensed to the Apache Software Foundation (ASF) under one
   or more contributor license agreements.  See the NOTICE file
   distributed with this work for additional information
   regarding copyright ownership.  The ASF licenses this file
   to you under the Apache License, Version 2.0 (the
   "License"); you may not use this file except in compliance
   with the License.  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing,
   software distributed under the License is distributed on an
   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
   KIND, either express or implied.  See the License for the
   specific language governing permissions and limitations
   under the License.

.. include:: ../common.defs

.. _admin-introduction:

Introduction
************

Global data networking has become part of everyday life: Internet users
request billions of documents and petabytes of data, on a daily basis,
to and from all parts of the world. Information is free, abundant, and
accessible. Unfortunately, global data networking can also be a
nightmare for IT professionals as they struggle with overloaded servers
and congested networks. It can be challenging to consistently and
reliably accommodate society's growing data demands.

|TS| is a high-performance web proxy cache that improves
network efficiency and performance by caching frequently-accessed
information at the edge of the network. This brings content physically
closer to end users, while enabling faster delivery and reduced
bandwidth use. |TS| is designed to improve content delivery
for enterprises, Internet service providers (ISPs), backbone providers,
and large intranets by maximizing existing and available bandwidth.

|TS| Deployment Options
=======================

To best suit your needs, |TS| can be deployed in several ways:

-  As a web proxy cache
-  As a reverse proxy
-  In a cache hierarchy

The following sections provide a summary of these |TS|
deployment options.

|TS| as a Web Proxy Cache
-------------------------

As a web proxy cache, |TS| receives user requests for web
content as those requests travel to the destined web server (origin
server). If |TS| contains the requested content, then it
serves the content directly. If the requested content is not available
from cache, then |TS| acts as a proxy: it obtains the content
from the origin server on the user's behalf and also keeps a copy to
satisfy future requests.

|TS| provides explicit proxy caching, in which the user's
client software must be configured to send requests directly to Traffic
Server. Explicit proxy caching is described in the :ref:`explicit-proxy-caching`
chapter.

|TS| can also be employed as a transparent caching proxy server, in
which the client software needs no special configuration or even knowledge of
the proxy's existence. This setup is described in the :ref:`transparent-proxy`
section.

|TS| as a Reverse Proxy
-----------------------

As a reverse proxy, |TS| is configured to be the origin server
to which the user is trying to connect (typically, the origin server's
advertised hostname resolves to |TS|, which acts as the real
origin server). The reverse proxy feature is also called server
acceleration. Reverse proxy is described in more detail in
:ref:`reverse-proxy-and-http-redirects`.

|TS| in a Cache Hierarchy
-------------------------

|TS| can participate in flexible cache hierarchies, in which
Internet requests not fulfilled from one cache are routed to other
regional caches, thereby leveraging the contents and proximity of nearby
caches. In a hierarchy of proxy servers, |TS| can act either
as a parent or a child cache to other |TS| systems or to
similar caching products.

|TS| as a Load Balancer
-----------------------

|TS| can act as a layer 7 HTTP load balancer distributing requests across
several servers. It can choose the next hop server using request attributes
like the Host: header, URL attributes, scheme, method, and client IP address.
It has a few selection strategies in place like weighted round robin, and
URL consistent hashing.

|TS| Components
===============

|TS| consists of several components that work together to form
a web proxy cache you can easily monitor and configure.

The |TS| Cache
--------------

The |TS| cache consists of a high-speed object database called
the *object store*. The object store indexes objects according to URLs and
associated headers. Using sophisticated object management, the object
store can cache alternate versions of the same object (perhaps in a
different language or encoding type). It can also efficiently store very
small and very large objects, thereby minimizing wasted space. When the
cache is full, |TS| removes stale data to ensure that the most
requested objects are readily available and fresh.

|TS| is designed to tolerate total disk failures on any of the
cache disks. If the disk fails completely, then |TS| marks the
entire disk as corrupt and continues to use remaining disks. If all of
the cache disks fail, then |TS| switches to proxy-only mode.
You can partition the cache to reserve a certain amount of disk space
for storing data for specific protocols and origin servers. For more
information about the cache, see :ref:`http-proxy-caching`.

The RAM Cache
-------------

|TS| maintains a small RAM cache that contains extremely
popular objects. This RAM cache serves the most popular objects as fast
as possible and reduces load on disks, especially during temporary
traffic peaks. You can configure the RAM cache size to suit your needs.
For detailed information, refer to :ref:`changing-the-size-of-the-ram-cache`.

The Host Database
-----------------

The |TS| host database stores the domain name server (DNS)
entries of origin servers to which |TS| connects to fulfill
user requests. This information is used to adapt future protocol
interactions and optimize performance. Along with other information, the
host database tracks:

-  DNS information (for fast conversion of hostnames to IP addresses).

-  The HTTP version of each host (so advanced protocol features can be
   used with hosts running modern servers).

-  Host reliability and availability information (so users will not wait
   for servers that are not running).

The DNS Resolver
----------------

|TS| includes a fast, asynchronous DNS resolver to streamline
conversion of hostnames to IP addresses. |TS| implements the
DNS resolver natively by directly issuing DNS command packets rather
than relying on slower, conventional resolver libraries. Since many DNS
queries can be issued in parallel and a fast DNS cache maintains popular
bindings in memory, DNS traffic is reduced.

|TS| Processes
--------------

|TS| contains two processes that work together to serve
requests and manage, control, and monitor the health of the system.

#. The :program:`traffic_server` process is the transaction processing engine
   of |TS|. It is responsible for accepting connections,
   processing protocol requests, and serving documents from the cache or
   origin server.

#. The :program:`traffic_manager` process is the command and control facility
   of the |TS|, responsible for launching, monitoring, and
   reconfiguring the :program:`traffic_server` process. The :program:`traffic_manager`
   process is also responsible for the proxy autoconfiguration port, the
   statistics interface, and virtual IP failover.

   If the :program:`traffic_manager` process detects a :program:`traffic_server`
   process failure, it instantly restarts the process but also maintains
   a connection queue of all incoming requests. All incoming connections
   that arrive in the several seconds before full server restart are
   saved in the connection queue and processed in first-come,
   first-served order. This connection queueing shields users from any
   server restart downtime.

Administration Tools
--------------------

|TS| offers the following administration options:

-  The :program:`traffic_ctl` command-line interface is a
   text-based interface from which you can monitor |TS| performance
   and network traffic, as well as configure the |TS| system.

-  Various configuration files enable you to configure |TS|
   through a simple file-editing and signal-handling interface. Any
   changes you make through :program:`traffic_ctl` are
   automatically made to the configuration files as well.

-  Finally, there is a clean C API which can be put to good use from a
   multitude of languages. The |TS| Admin Client demonstrates
   this for Perl.

Traffic Analysis Options
========================

|TS| provides several options for network traffic analysis and
monitoring:

-  :program:`traffic_ctl` enables you to collect and process
   statistics obtained from network traffic information.

-  Transaction logging enables you to record information (in a log file)
   about every request |TS| receives and every error it
   detects. By analyzing the log files, you can determine how many
   clients used the |TS| cache, how much information each of
   them requested, and what pages were most popular. You can also see
   why a particular transaction was in error and what state the Traffic
   Server was in at a particular time. For example, you can see that
   |TS| was restarted.

   |TS| supports several standard log file formats, such as
   Squid and Netscape, and its own custom format. You can analyze the
   standard format log files with off-the-shelf analysis packages. To
   help with log file analysis, you can separate log files so that they
   contain information specific to protocol or hosts.

|TS| event and error logging, monitoring, and analysis is covered in greater
detail in :ref:`admin-monitoring`.

|TS| Security Options
=====================

|TS| provides numerous options that enable you to establish
secure communication between the |TS| system and other
computers on the network. Using the security options, you can do the
following:

-  Control client access to the |TS| proxy cache.

-  Configure |TS| to use multiple DNS servers to match your
   site's security configuration. For example, |TS| can use
   different DNS servers, depending on whether it needs to resolve
   hostnames located inside or outside a firewall. This enables you to
   keep your internal network configuration secure while continuing to
   provide transparent access to external sites on the Internet.

-  Configure |TS| to verify that clients are authenticated
   before they can access content from the |TS| cache.

-  Secure connections in reverse proxy mode between a client and Traffic
   Server, and |TS| and the origin server, using the SSL
   termination option.

-  Control access via SSL (Secure Sockets Layer).

|TS| security options are described in more detail in
:ref:`admin-security`.

Tuning |TS|
===========

Finally, this last chapter on :ref:`performance-tuning` discusses the vast
number of options that allow administrators to optimally tune Apache Traffic
Server for maximum performance.
