.. 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-guide:

Administrator's Guide
*********************

Table of Contents:

.. toctree::
   :maxdepth: 2

   introduction.en
   installation/index.en
   configuration/index.en
   interaction/index.en
   security/index.en
   storage/index.en
   plugins/index.en
   logging/index.en
   monitoring/index.en
   configuring-traffic-server.en
   layer-4-routing.en
   performance/index.en
   files/index.en

Audience
========

This section of the |ATS| Manual is aimed at those individuals looking to
install and configure |TS| for use as a caching proxy server. The section
assumes basic knowledge of the command line and system administration tasks.
Detailed steps are provided on how to build and configure the software, so
even if you have never used a compiler or looked at a Makefile before, you
will find everything you need in the following chapters to get you up and
running with your own instance of |TS|. Or so is our hope.

Should you encounter problems, or find any of the instructions unclear or
lacking, please seek help through one of the avenues listed in
:ref:`intro-other-resources`.
