When working with Linux systems, the Filesystem Hierarchy Standard (FHS) defines the purpose of each directory. Here's what you need to know about the key directories for application installation:
/var - Variable data files (logs, databases, spool files)
/opt - Optional application software packages
/usr/local - Locally installed software (not part of OS distribution)
/etc - Configuration files (not for application binaries)
The /opt directory is ideal for self-contained, third-party applications that don't follow standard Unix directory structure. For example:
# Typical /opt installation structure for Tomcat
/opt/apache-tomcat-9.0.54/
├── bin/
├── conf/
├── lib/
├── logs/ -> /var/log/tomcat9
├── webapps/
Advantages of /opt:
- Keeps all application files in one place
- Easier to remove entire applications
- Common practice for commercial software
While /var shouldn't contain application binaries, it's perfect for:
# Example of proper /var usage
/var/lib/tomcat9/ - Persistent application data
/var/log/tomcat9/ - Application log files
/var/cache/tomcat9/ - Cached data
Use /usr/local when compiling software from source that should be available system-wide:
# Typical ./configure command for source installation
./configure --prefix=/usr/local
make
sudo make install
This follows the standard Unix directory structure:
- Binaries in /usr/local/bin
- Libraries in /usr/local/lib
- Configuration in /usr/local/etc
For a Java application like Elasticsearch, here's how I would install it:
# Extract to /opt
sudo tar -xzf elasticsearch-7.15.0-linux-x86_64.tar.gz -C /opt
# Create symlink for easier version management
sudo ln -s /opt/elasticsearch-7.15.0 /opt/elasticsearch
# Configure data directories in /var
sudo mkdir -p /var/lib/elasticsearch
sudo chown elasticsearch:elasticsearch /var/lib/elasticsearch
Different distributions may have conventions:
- RHEL/CentOS: Prefers /opt for third-party software
- Debian/Ubuntu: Often uses /usr/share for application files
- Always check distro-specific guidelines
The Linux Filesystem Hierarchy Standard defines specific purposes for each directory:
/var - Variable data (logs, spools, temp files)
/opt - Optional/add-on application software packages
/usr/local - Locally installed software (not from distribution packages)
/etc - Configuration files for system and applications
/opt
is ideal for self-contained applications that don't follow standard Unix directory structure. Common use cases:
- Commercial software (Oracle Database, MATLAB)
- Large applications with all dependencies bundled
- Applications that may need multiple versions installed
Example Tomcat installation in /opt:
wget https://downloads.apache.org/tomcat/tomcat-10/v10.1.8/bin/apache-tomcat-10.1.8.tar.gz
sudo tar -xzvf apache-tomcat-10.1.8.tar.gz -C /opt
sudo ln -s /opt/apache-tomcat-10.1.8 /opt/tomcat
/var
should be used for runtime data rather than application binaries. Typical scenarios:
- Application working directories
- PID files, lock files
- Log files (/var/log)
- Spool directories (/var/spool)
Example Java application runtime directory structure:
/var/lib/myapp/ - Application data
/var/log/myapp/ - Log files
/var/run/myapp/ - PID files
/var/cache/myapp/ - Cache files
While both are for locally installed software, they follow different conventions:
Directory | Structure | Best For |
---|---|---|
/opt | Application bundles all files in single directory | Large, self-contained apps |
/usr/local | Follows standard Unix hierarchy (bin, lib, etc.) | Locally compiled software |
/etc
should only contain configuration files, not binaries or application data. Example Tomcat configuration:
/etc/tomcat10/server.xml - Main configuration
/etc/tomcat10/web.xml - Default web application settings
/etc/default/tomcat10 - Environment variables
For Java web applications:
- Install Tomcat in /opt/tomcat
- Place WAR files in /var/lib/tomcat/webapps
- Store logs in /var/log/tomcat
For system services:
- Place init scripts in /etc/init.d or /lib/systemd/system
- Runtime files in /var/run
For custom compiled software:
- ./configure --prefix=/usr/local
- Creates proper hierarchy under /usr/local
Here's how I typically structure a Java/Tomcat/PostgreSQL setup:
# PostgreSQL
/var/lib/postgresql/14/main - Data files
/etc/postgresql/14/main - Configuration
# Java
/usr/lib/jvm/java-11-openjdk-amd64 - JDK
# Tomcat
/opt/apache-tomcat-10.1.8 - Installation
/var/lib/tomcat/webapps - Deployed applications
/var/log/tomcat - Logs
/etc/tomcat - Configuration
/opt
makes version management easier through symlinks:
/opt/tomcat-9.0.75
/opt/tomcat-10.1.8
/opt/tomcat -> /opt/tomcat-10.1.8
Update the symlink when switching versions while keeping configs in /etc/tomcat.
/opt
and/usr/local
typically need root for installation/var
directories often need specific user/group permissions- Follow principle of least privilege for each directory
Distribution packages will automatically place files in correct locations:
# Ubuntu/Debian
apt install tomcat9 - Installs to FHS-compliant locations
# Manual install gives more control but requires proper placement