\documentclass[a4paper,10pt]{book} %% Packages \usepackage{float} \usepackage{graphics} \usepackage{hevea} \usepackage[pdftex,colorlinks,unicode,urlcolor=blue,linkcolor=blue, pdftitle=Ejabberd\ Installation\ and\ Operation\ Guide,pdfauthor=ProcessOne,pdfsubject=ejabberd,pdfkeywords=ejabberd, pdfpagelabels=false]{hyperref} \usepackage{makeidx} %\usepackage{showidx} % Only for verifying the index entries. \usepackage{verbatim} \usepackage{geometry} \usepackage{fancyhdr} \pagestyle{fancy} %Forces the page to use the fancy template \renewcommand{\chaptermark}[1]{\markboth{\textbf{\thechapter}.\ \emph{#1}}{}} \renewcommand{\sectionmark}[1]{\markright{\thesection\ \boldmath\textbf{#1}\unboldmath}} \fancyhf{} \fancyhead[LE,RO]{\textbf{\thepage}} %Displays the page number in bold in the header, % to the left on even pages and to the right on odd pages. \fancyhead[RE]{\nouppercase{\leftmark}} %Displays the upper-level (chapter) information--- % as determined above---in non-upper case in the header, to the right on even pages. \fancyhead[LO]{\rightmark} %Displays the lower-level (section) information---as % determined above---in the header, to the left on odd pages. \renewcommand{\headrulewidth}{0.5pt} %Underlines the header. (Set to 0pt if not required). \renewcommand{\footrulewidth}{0.5pt} %Underlines the footer. (Set to 0pt if not required). %% Index \makeindex % Remove the index anchors from the HTML version to save size and bandwith. \newcommand{\ind}[1]{\begin{latexonly}\index{#1}\end{latexonly}} \newcommand{\makechapter}[2]{ \aname{#1}{} \chapter{\ahrefloc{#1}{#2}} \label{#1} } \newcommand{\makesection}[2]{ \aname{#1}{} \section{\ahrefloc{#1}{#2}} \label{#1} } \newcommand{\makesubsection}[2]{ \aname{#1}{} \subsection{\ahrefloc{#1}{#2}} \label{#1} } \newcommand{\makesubsubsection}[2]{ \aname{#1}{} \subsubsection{\ahrefloc{#1}{#2}} \label{#1} } \newcommand{\makeparagraph}[2]{ \aname{#1}{} \paragraph{\ahrefloc{#1}{#2}} \label{#1} } %% Images \newcommand{\logoscale}{0.7} \newcommand{\imgscale}{0.58} \newcommand{\insimg}[1]{\insscaleimg{\imgscale}{#1}} \newcommand{\insscaleimg}[2]{ \imgsrc{#2}{} \begin{latexonly} \scalebox{#1}{\includegraphics{#2}} \end{latexonly} } %% Various \newcommand{\bracehack}{\def\{{\char"7B}\def\}{\char"7D}} \newcommand{\titem}[1]{\item[\bracehack\texttt{#1}]} \newcommand{\ns}[1]{\texttt{#1}} \newcommand{\jid}[1]{\texttt{#1}} \newcommand{\option}[1]{\texttt{#1}} \newcommand{\poption}[1]{{\bracehack\texttt{#1}}} \newcommand{\node}[1]{\texttt{#1}} \newcommand{\term}[1]{\texttt{#1}} \newcommand{\shell}[1]{\texttt{#1}} \newcommand{\ejabberd}{\texttt{ejabberd}} \newcommand{\Jabber}{Jabber} %% Modules \newcommand{\module}[1]{\texttt{#1}} \newcommand{\modadhoc}{\module{mod\_adhoc}} \newcommand{\modannounce}{\module{mod\_announce}} \newcommand{\modcaps}{\module{mod\_caps}} \newcommand{\modconfigure}{\module{mod\_configure}} \newcommand{\moddisco}{\module{mod\_disco}} \newcommand{\modecho}{\module{mod\_echo}} \newcommand{\modirc}{\module{mod\_irc}} \newcommand{\modlast}{\module{mod\_last}} \newcommand{\modlastodbc}{\module{mod\_last\_odbc}} \newcommand{\modmuc}{\module{mod\_muc}} \newcommand{\modmuclog}{\module{mod\_muc\_log}} \newcommand{\modoffline}{\module{mod\_offline}} \newcommand{\modofflineodbc}{\module{mod\_offline\_odbc}} \newcommand{\modprivacy}{\module{mod\_privacy}} \newcommand{\modprivacyodbc}{\module{mod\_privacy\_odbc}} \newcommand{\modprivate}{\module{mod\_private}} \newcommand{\modprivateodbc}{\module{mod\_private\_odbc}} \newcommand{\modproxy}{\module{mod\_proxy65}} \newcommand{\modpubsub}{\module{mod\_pubsub}} \newcommand{\modregister}{\module{mod\_register}} \newcommand{\modroster}{\module{mod\_roster}} \newcommand{\modrosterodbc}{\module{mod\_roster\_odbc}} \newcommand{\modservicelog}{\module{mod\_service\_log}} \newcommand{\modsharedroster}{\module{mod\_shared\_roster}} \newcommand{\modstats}{\module{mod\_stats}} \newcommand{\modtime}{\module{mod\_time}} \newcommand{\modvcard}{\module{mod\_vcard}} \newcommand{\modvcardldap}{\module{mod\_vcard\_ldap}} \newcommand{\modvcardodbc}{\module{mod\_vcard\_odbc}} \newcommand{\modversion}{\module{mod\_version}} %% Contributed modules \usepackage{ifthen} \newboolean{modhttpbind} \newcommand{\modhttpbind}{\module{mod\_http\_bind}} \newboolean{modhttpfileserver} \newcommand{\modhttpfileserver}{\module{mod\_http\_fileserver}} \include{contributed_modules} %% Common options \newcommand{\iqdiscitem}[1]{\titem{iqdisc} \ind{options!iqdisc}This specifies the processing discipline for #1 IQ queries (see section~\ref{modiqdiscoption}).} \newcommand{\hostitem}[1]{ \titem{host} \ind{options!host} This option defines the Jabber ID of the service. If the \texttt{host} option is not specified, the Jabber ID will be the hostname of the virtual host with the prefix `\jid{#1.}'. The keyword "@HOST@" is replaced at start time with the real virtual host name. } %% Title page \include{version} \newlength{\larg} \setlength{\larg}{14.5cm} \title{ {\rule{\larg}{1mm}}\vspace{7mm} \begin{tabular}{r} {\huge {\bf ejabberd \version\ }} \\ \\ {\huge Installation and Operation Guide} \end{tabular}\\ \vspace{2mm} {\rule{\larg}{1mm}} \begin{latexonly} \vspace{2mm} \\ \begin{tabular}{r} {\large \bf \today} \end{tabular}\\ \vspace{5.5cm} \end{latexonly} } \begin{latexonly} \author{\begin{tabular}{p{13.7cm}} ejabberd Development Team \end{tabular}} \date{} \end{latexonly} %% Options \newcommand{\marking}[1]{#1} % Marking disabled \newcommand{\quoting}[2][yozhik]{} % Quotes disabled %\newcommand{\new}{\marginpar{\textsc{new}}} % Highlight new features %\newcommand{\improved}{\marginpar{\textsc{improved}}} % Highlight improved features %% To by-pass errors in the HTML version: \newstyle{.SPAN}{width:20\%; float:right; text-align:left; margin-left:auto;} \newstyle{H1.titlemain HR}{display:none;} \newstyle{TABLE.title}{border-top:1px solid grey;border-bottom:1px solid grey; background: \#efefef} \newstyle{H1.chapter A, H2.section A, H3.subsection A, H4.subsubsection A, H5.paragraph A} {color:\#000000; text-decoration:none;} \newstyle{H1.chapter, H2.section, H3.subsection, H4.subsubsection, H5.paragraph} {border-top: 1px solid grey; background: \#efefef; padding: 0.5ex} \newstyle{pre.verbatim}{margin:1ex 2ex;border:1px dashed lightgrey;background-color:\#f9f9f9;padding:0.5ex;} \newstyle{.dt-description}{margin:0ex 2ex;} \newstyle{table[border="1"]}{border-collapse:collapse;margin-bottom:1em;} \newstyle{table[border="1"] td}{border:1px solid \#aaa;padding:2px} % Don't display
before and after tables or images: \newstyle{BLOCKQUOTE.table DIV.center DIV.center HR}{display:none;} \newstyle{BLOCKQUOTE.figure DIV.center DIV.center HR}{display:none;} %% Footnotes \begin{latexonly} \global\parskip=9pt plus 3pt minus 1pt \global\parindent=0pt \gdef\ahrefurl#1{\href{#1}{\texttt{#1}}} \gdef\footahref#1#2{#2\footnote{\href{#1}{\texttt{#1}}}} \end{latexonly} \newcommand{\txepref}[2]{\footahref{http://www.xmpp.org/extensions/xep-#1.html}{#2}} \newcommand{\xepref}[1]{\txepref{#1}{XEP-#1}} \begin{document} \label{titlepage} \begin{titlepage} \maketitle{} %% Commenting. Breaking clean layout for now: %% \begin{center} %% {\insscaleimg{\logoscale}{logo.png} %% \par %% } %% \end{center} %% \begin{quotation}\textit{I can thoroughly recommend ejabberd for ease of setup --- %% Kevin Smith, Current maintainer of the Psi project}\end{quotation} \end{titlepage} % Set the page counter to 2 so that the titlepage and the second page do not % have the same page number. This fixes the PDFLaTeX warning "destination with % the same identifier". \begin{latexonly} \setcounter{page}{2} \end{latexonly} \label{toc} \tableofcontents{} % Input introduction.tex \input{introduction} \makechapter{installing}{Installing \ejabberd{}} \makesection{install.binary}{Installing \ejabberd{} with Binary Installer} Probably the easiest way to install an \ejabberd{} instant messaging server is using the binary installer published by ProcessOne. The binary installers of released \ejabberd{} versions are available in the ProcessOne \ejabberd{} downloads page: \ahrefurl{http://www.process-one.net/en/ejabberd/downloads} The installer will deploy and configure a full featured \ejabberd{} server and does not require any extra dependencies. In *nix systems, remember to set executable the binary installer before starting it. For example: \begin{verbatim} chmod +x ejabberd-2.0.0_1-linux-x86-installer.bin ./ejabberd-2.0.0_1-linux-x86-installer.bin \end{verbatim} \ejabberd{} can be started manually at any time, or automatically by the operating system at system boot time. To start and stop \ejabberd{} manually, use the desktop shortcuts created by the installer. If the machine doesn't have a graphical system, use the scripts 'start' and 'stop' in the 'bin' directory where \ejabberd{} is installed. The Windows installer also adds ejabberd as a system service, and a shortcut to a debug console for experienced administrators. If you want ejabberd to be started automatically at boot time, go to the Windows service settings and set ejabberd to be automatically started. Note that the Windows service is a feature still in development, and for example it doesn't read the file ejabberdctl.cfg. On a *nix system, if you want ejabberd to be started as daemon at boot time, copy \term{ejabberd.init} from the 'bin' directory to something like \term{/etc/init.d/ejabberd} (depending on your distribution) and call \term{/etc/inid.d/ejabberd start} to start it. If \term{ejabberd} doesn't start correctly in Windows, try to start it using the shortcut in desktop or start menu. If the window shows error 14001, the solution is to install: "Microsoft Visual C++ 2005 SP1 Redistributable Package". You can download it from \footahref{http://www.microsoft.com/}{www.microsoft.com}. Then uninstall \ejabberd{} and install it again. If \term{ejabberd} doesn't start correctly and a crash dump is generated, there was a severe problem. You can try starting \term{ejabberd} with the script \term{bin/live.bat} in Windows, or with the command \term{bin/ejabberdctl live} in other Operating Systems. This way you see the error message provided by Erlang and can identify what is exactly the problem. The \term{ejabberdctl} administration script is included in the \term{bin} directory. Please refer to the section~\ref{ejabberdctl} for details about \term{ejabberdctl}, and configurable options to fine tune the Erlang runtime system. \makesection{install.os}{Installing \ejabberd{} with Operating System Specific Packages} Some Operating Systems provide a specific \ejabberd{} package adapted to the system architecture and libraries. It usually also checks dependencies and performs basic configuration tasks like creating the initial administrator account. Some examples are Debian and Gentoo. Consult the resources provided by your Operating System for more information. Usually those packages create a script like \term{/etc/init.d/ejabberd} to start and stop \ejabberd{} as a service at boot time. \makesection{install.cean}{Installing \ejabberd{} with CEAN} \footahref{http://cean.process-one.net/}{CEAN} (Comprehensive Erlang Archive Network) is a repository that hosts binary packages from many Erlang programs, including \ejabberd{} and all its dependencies. The binaries are available for many different system architectures, so this is an alternative to the binary installer and Operating System's \ejabberd{} packages. You will have to create your own \ejabberd{} start script depending of how you handle your CEAN installation. The default \term{ejabberdctl} script is located into \ejabberd{}'s priv directory and can be used as an example. \makesection{installation}{Installing \ejabberd{} from Source Code} \ind{install} The canonical form for distribution of \ejabberd{} stable releases is the source code package. Compiling \ejabberd{} from source code is quite easy in *nix systems, as long as your system have all the dependencies. \makesubsection{installreq}{Requirements} \ind{installation!requirements} To compile \ejabberd{} on a `Unix-like' operating system, you need: \begin{itemize} \item GNU Make \item GCC \item Libexpat 1.95 or higher \item Erlang/OTP R10B-9 or higher. \item OpenSSL 0.9.6 or higher, for STARTTLS, SASL and SSL encryption. Optional, highly recommended. \item Zlib 1.2.3 or higher, for Stream Compression support (\xepref{0138}). Optional. \item Erlang mysql library. Optional. For MySQL authentication or storage. See section \ref{compilemysql}. \item Erlang pgsql library. Optional. For PostgreSQL authentication or storage. See section \ref{compilepgsql}. \item PAM library. Optional. For Pluggable Authentication Modules (PAM). See section \ref{pam}. \item GNU Iconv 1.8 or higher, for the IRC Transport (mod\_irc). Optional. Not needed on systems with GNU Libc. See section \ref{modirc}. \end{itemize} \makesubsection{download}{Download Source Code} \ind{install!download} Released versions of \ejabberd{} are available in the ProcessOne \ejabberd{} downloads page: \ahrefurl{http://www.process-one.net/en/ejabberd/downloads} \ind{Subversion repository} Alternatively, the latest development version can be retrieved from the Subversion repository using this command: \begin{verbatim} svn co http://svn.process-one.net/ejabberd/trunk ejabberd \end{verbatim} \makesubsection{compile}{Compile} \ind{install!compile} To compile \ejabberd{} execute the commands: \begin{verbatim} ./configure make \end{verbatim} The build configuration script allows several options. To get the full list run the command: \begin{verbatim} ./configure --help \end{verbatim} Some options that you may be interested in modifying: \begin{description} \titem{--prefix=/} Specify the path prefix where the files will be copied when running the \term{make install} command. \titem{--enable-user[=USER]} Allow this normal system user to execute the ejabberdctl script (see section~\ref{ejabberdctl}), read the configuration files, read and write in the spool directory, read and write in the log directory. The account user and group must exist in the machine before running \term{make install}. This account doesn't need an explicit HOME directory, because \term{/var/lib/ejabberd/} will be used by default. \titem{--enable-pam} Enable the PAM authentication method (see section \ref{pam}). \titem{--enable-odbc or --enable-mssql} Required if you want to use an external database. See section~\ref{database} for more information. \titem{--enable-full-xml} Enable the use of XML based optimisations. It will for example use CDATA to escape characters in the XMPP stream. Use this option only if you are sure your Jabber clients include a fully compliant XML parser. \titem{--disable-transient-supervisors} Disable the use of Erlang/OTP supervision for transient processes. \end{description} \makesubsection{install}{Install} \ind{install!install} To install \ejabberd{} in the destination directories, run the command: \begin{verbatim} make install \end{verbatim} Note that you probably need administrative privileges in the system to install \term{ejabberd}. The files and directories created are, by default: \begin{description} \titem{/etc/ejabberd/} Configuration directory: \begin{description} \titem{ejabberd.cfg} ejabberd configuration file \titem{ejabberdctl.cfg} Configuration file of the administration script \titem{inetrc} Network DNS configuration file \end{description} \titem{/lib/ejabberd/} \begin{description} \titem{ebin/} Erlang binary files (*.beam) \titem{include/} Erlang header files (*.hrl) \titem{priv/} Additional files required at runtime \begin{description} \titem{bin/} Binary C programs \titem{lib/} Binary system libraries (*.so) \titem{msgs/} Translation files (*.msgs) \end{description} \end{description} \titem{/sbin/ejabberdctl} Administration script (see section~\ref{ejabberdctl}) \titem{/share/doc/ejabberd/} Documentation of ejabberd \titem{/var/lib/ejabberd/} Spool directory: \begin{description} \titem{.erlang.cookie} Erlang cookie file (see section \ref{cookie}) \titem{acl.DCD, ...} Mnesia database spool files (*.DCD, *.DCL, *.DAT) \end{description} \titem{/var/log/ejabberd/} Log directory (see section~\ref{logfiles}): \begin{description} \titem{ejabberd.log} ejabberd service log \titem{sasl.log} Erlang/OTP system log \end{description} \end{description} \makesubsection{start}{Start} \ind{install!start} You can use the \term{ejabberdctl} command line administration script to start and stop \ejabberd{}. If you provided the configure option \term{--enable-user=USER} (see \ref{compile}), you can execute \term{ejabberdctl} with either that system account or root. Usage example: \begin{verbatim} ejabberdctl start ejabberdctl status The node ejabberd@localhost is started with status: started ejabberd is running in that node ejabberdctl stop \end{verbatim} If \term{ejabberd} doesn't start correctly and a crash dump is generated, there was a severe problem. You can try starting \term{ejabberd} with the command \term{ejabberdctl live} to see the error message provided by Erlang and can identify what is exactly the problem. Please refer to the section~\ref{ejabberdctl} for details about \term{ejabberdctl}, and configurable options to fine tune the Erlang runtime system. \makesubsection{bsd}{Specific Notes for BSD} \ind{install!bsd} The command to compile \ejabberd{} in BSD systems is: \begin{verbatim} gmake \end{verbatim} \makesubsection{solaris}{Specific Notes for Sun Solaris} \ind{install!solaris} You need to have \term{GNU install}, but it isn't included in Solaris. It can be easily installed if your Solaris system is set up for \footahref{http://www.blastwave.org/}{blastwave.org} package repository. Make sure \term{/opt/csw/bin} is in your \term{PATH} and run: \begin{verbatim} pkg-get -i fileutils \end{verbatim} If that program is called \term{ginstall}, modify the \ejabberd{} \term{Makefile} script to suit your system, for example: \begin{verbatim} cat Makefile | sed s/install/ginstall/ > Makefile.gi \end{verbatim} And finally install \ejabberd{} with: \begin{verbatim} gmake -f Makefile.gi ginstall \end{verbatim} \makesubsection{windows}{Specific Notes for Microsoft Windows} \ind{install!windows} \makesubsubsection{windowsreq}{Requirements} To compile \ejabberd{} on a Microsoft Windows system, you need: \begin{itemize} \item MS Visual C++ 6.0 Compiler \item \footahref{http://www.erlang.org/download.html}{Erlang/OTP R11B-5} \item \footahref{http://sourceforge.net/project/showfiles.php?group\_id=10127\&package\_id=11277}{Expat 2.0.0 or higher} \item \footahref{http://www.gnu.org/software/libiconv/}{GNU Iconv 1.9.2} (optional) \item \footahref{http://www.slproweb.com/products/Win32OpenSSL.html}{Shining Light OpenSSL 0.9.8d or higher} (to enable SSL connections) \item \footahref{http://www.zlib.net/}{Zlib 1.2.3 or higher} \end{itemize} \makesubsubsection{windowscom}{Compilation} We assume that we will try to put as much library as possible into \verb|C:\sdk\| to make it easier to track what is install for \ejabberd{}. \begin{enumerate} \item Install Erlang emulator (for example, into \verb|C:\sdk\erl5.5.5|). \item Install Expat library into \verb|C:\sdk\Expat-2.0.0| directory. Copy file \verb|C:\sdk\Expat-2.0.0\Libs\libexpat.dll| to your Windows system directory (for example, \verb|C:\WINNT| or \verb|C:\WINNT\System32|) \item Build and install the Iconv library into the directory \verb|C:\sdk\GnuWin32|. Copy file \verb|C:\sdk\GnuWin32\bin\lib*.dll| to your Windows system directory (more installation instructions can be found in the file README.woe32 in the iconv distribution). Note: instead of copying libexpat.dll and iconv.dll to the Windows directory, you can add the directories \verb|C:\sdk\Expat-2.0.0\Libs| and \verb|C:\sdk\GnuWin32\bin| to the \verb|PATH| environment variable. \item Install OpenSSL in \verb|C:\sdk\OpenSSL| and add \verb|C:\sdk\OpenSSL\lib\VC| to your path or copy the binaries to your system directory. \item Install ZLib in \verb|C:\sdk\gnuWin32|. Copy \verb|C:\sdk\GnuWin32\bin\zlib1.dll| to your system directory. If you change your path it should already be set after libiconv install. \item Make sure the you can access Erlang binaries from your path. For example: \verb|set PATH=%PATH%;"C:\sdk\erl5.5.5\bin"| \item Depending on how you end up actually installing the library you might need to check and tweak the paths in the file configure.erl. \item While in the directory \verb|ejabberd\src| run: \begin{verbatim} configure.bat nmake -f Makefile.win32 \end{verbatim} \item Edit the file \verb|ejabberd\src\ejabberd.cfg| and run \begin{verbatim} werl -s ejabberd -name ejabberd \end{verbatim} \end{enumerate} %TODO: how to compile database support on windows? \makesection{initialadmin}{Create a Jabber Account for Administration} You need a Jabber account and grant him administrative privileges to enter the \ejabberd{} Web Admin: \begin{enumerate} \item Register a Jabber account on your \ejabberd{} server, for example \term{admin1@example.org}. There are two ways to register a Jabber account: \begin{enumerate} \item Using \term{ejabberdctl}\ind{ejabberdctl} (see section~\ref{ejabberdctl}): \begin{verbatim} ejabberdctl register admin1 example.org FgT5bk3 \end{verbatim} \item Using a Jabber client and In-Band Registration (see section~\ref{modregister}). \end{enumerate} \item Edit the \ejabberd{} configuration file to give administration rights to the Jabber account you created: \begin{verbatim} {acl, admins, {user, "admin1", "example.org"}}. {access, configure, [{allow, admins}]}. \end{verbatim} You can grant administrative privileges to many Jabber accounts, and also to accounts in other Jabber servers. \item Restart \ejabberd{} to load the new configuration. \item Open the Web Admin (\verb|http://server:port/admin/|) in your favourite browser. Make sure to enter the \emph{full} JID as username (in this example: \jid{admin1@example.org}. The reason that you also need to enter the suffix, is because \ejabberd{}'s virtual hosting support. \end{enumerate} \makesection{upgrade}{Upgrading \ejabberd{}} To upgrade an ejabberd installation to a new version, simply uninstall the old version, and then install the new one. Of course, it is important that the configuration file and Mnesia database spool directory are not removed. \ejabberd{} automatically updates the Mnesia table definitions at startup when needed. If you also use an external database for storage of some modules, check if the release notes of the new ejabberd version indicates you need to also update those tables. \makechapter{configure}{Configuring \ejabberd{}} \ind{configuration file} \makesection{basicconfig}{Basic Configuration} The configuration file will be loaded the first time you start \ejabberd{}. The content from this file will be parsed and stored in the internal \ejabberd{} database. Subsequently the configuration will be loaded from the database and any commands in the configuration file are appended to the entries in the database. Note that \ejabberd{} never edits the configuration file. So, the configuration changes done using the Web Admin are stored in the database, but are not reflected in the configuration file. If you want those changes to be use after \ejabberd{} restart, you can either edit the configuration file, or remove all its content. The configuration file contains a sequence of Erlang terms. Lines beginning with a \term{`\%'} sign are ignored. Each term is a tuple of which the first element is the name of an option, and any further elements are that option's values. If the configuration file do not contain for instance the `hosts' option, the old host name(s) stored in the database will be used. You can override the old values stored in the database by adding next lines to the configuration file: \begin{verbatim} override_global. override_local. override_acls. \end{verbatim} With these lines the old global options (shared between all \ejabberd{} nodes in a cluster), local options (which are specific for this particular \ejabberd{} node) and ACLs will be removed before new ones are added. \makesubsection{hostnames}{Host Names} \ind{options!hosts}\ind{host names} The option \option{hosts} defines a list containing one or more domains that \ejabberd{} will serve. Examples: \begin{itemize} \item Serving one domain: \begin{verbatim} {hosts, ["example.org"]}. \end{verbatim} \item Serving one domain, and backwards compatible with older \ejabberd{} versions: \begin{verbatim} {host, "example.org"}. \end{verbatim} \item Serving two domains: \begin{verbatim} {hosts, ["example.net", "example.com"]}. \end{verbatim} \end{itemize} \makesubsection{virtualhost}{Virtual Hosting} \ind{virtual hosting}\ind{virtual hosts}\ind{virtual domains} Options can be defined separately for every virtual host using the \term{host\_config} option.\ind{options!host\_config} It has the following syntax: \begin{verbatim} {host_config, , [