Skip to content

Instantly share code, notes, and snippets.

@Xananax
Last active February 7, 2020 22:35
Show Gist options
  • Save Xananax/e0d9afbd2b4c82291979df043d370804 to your computer and use it in GitHub Desktop.
Save Xananax/e0d9afbd2b4c82291979df043d370804 to your computer and use it in GitHub Desktop.
Run Apache Locally

Apache-serve

Runs apache locally

Usage

./serve <domain name> <document directory>

ex:

./serve mydomain.com public_html

The script will:

  • add mydomain.com to /etc/hosts (unless you use localhost)
  • create a minimal apache configuration in /tmp
  • run apache locally
  • clean up on exit

pre-requisites:

  • apache installed
  • php installed
  • bash
  • permissions to execute on the directory, and all previous directories (chmod +x /home, chmod +x /home/<your_user>, chmod +x ~/directory_where_you_wanna_run_apache). Maybe Apache needs perms +755 on the directory you want to serve too, I dunno

The script works on Arch Linux, but should easily be adaptable to any unix-like system

License

 DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE  
                    Version 2, December 2004 

 Copyright (C) 2017 Jad Sarout <jad.sarout@gmail.com> 

 Everyone is permitted to copy and distribute verbatim or modified 
 copies of this license document, and changing it is allowed as long 
 as the name is changed. 

 DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE   
 TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 

  0. You just DO WHAT THE FUCK YOU WANT TO.
#!/usr/bin/env bash
SITE_NAME=${1:-localhost}
ADMIN_EMAIL="admin@$SITE_NAME"
SITE_ALIAS="www.$SITE_NAME"
PORT="8080"
MODULES_PATH="/etc/httpd/modules"
CONF_PATH="/etc/httpd/conf"
ROOT_PATH="$PWD"
DOC_DIRECTORY=${2:-test}
DOC_PATH="$ROOT_PATH/$DOC_DIRECTORY"
# Hosts file for adding the domain
ETC_HOSTS="/etc/hosts"
# localhost IP
DEFAULT_IP="127.0.0.1"
VERBOSE=true
function remove_from_hosts() {
local HOSTNAME=$1
local HOST_REGEX="\(\s\+\)${HOSTNAME}\s*$"
local HOST_LINE="$(grep -e "${HOST_REGEX}" ${ETC_HOSTS})"
if [ -n "${HOST_LINE}" ]; then
[ ${VERBOSE} == true ] && echo "${HOSTNAME} Found in your ${ETC_HOSTS}, Removing now..."
sudo sed -i -e "s/${HOST_REGEX}/\1/g" -e "/^[^#][0-9\.]\+\s\+$/d" ${ETC_HOSTS}
else
[ ${VERBOSE} == true ] && echo "${HOSTNAME} was not found in your ${ETC_HOSTS}";
fi
}
function add_to_hosts() {
local HOSTNAME=$1
local IP=${2:-${DEFAULT_IP}}
local HOST_REGEX="\(\s\+\)${HOSTNAME}\s*$"
local HOST_LINE="$(grep -e "${HOST_REGEX}" ${ETC_HOSTS})"
if [ -n "${HOST_LINE}" ]; then
[ ${VERBOSE} == true ] && echo "${HOSTNAME} already exists : ${HOST_LINE}"
else
[ ${VERBOSE} == true ] && echo "Adding ${HOSTNAME} to your ${ETC_HOSTS}";
echo -e "${IP}\t${HOSTNAME}" | sudo tee -a ${ETC_HOSTS}
[ ${VERBOSE} == true ] && echo -e "${HOSTNAME} was added succesfully \n ${HOST_LINE}";
sudo nscd -i hosts
fi
}
APACHECONF=$(cat <<- EOF
ServerAdmin ${ADMIN_EMAIL}
ServerName ${SITE_NAME}
Listen ${PORT}
PidFile /tmp/httpd.pid
LoadModule authn_file_module ${MODULES_PATH}/mod_authn_file.so
LoadModule authn_core_module ${MODULES_PATH}/mod_authn_core.so
LoadModule authz_host_module ${MODULES_PATH}/mod_authz_host.so
LoadModule authz_groupfile_module ${MODULES_PATH}/mod_authz_groupfile.so
LoadModule authz_user_module ${MODULES_PATH}/mod_authz_user.so
LoadModule authz_core_module ${MODULES_PATH}/mod_authz_core.so
LoadModule access_compat_module ${MODULES_PATH}/mod_access_compat.so
LoadModule auth_basic_module ${MODULES_PATH}/mod_auth_basic.so
LoadModule reqtimeout_module ${MODULES_PATH}/mod_reqtimeout.so
LoadModule include_module ${MODULES_PATH}/mod_include.so
LoadModule filter_module ${MODULES_PATH}/mod_filter.so
LoadModule mime_module ${MODULES_PATH}/mod_mime.so
LoadModule log_config_module ${MODULES_PATH}/mod_log_config.so
LoadModule env_module ${MODULES_PATH}/mod_env.so
LoadModule headers_module ${MODULES_PATH}/mod_headers.so
LoadModule setenvif_module ${MODULES_PATH}/mod_setenvif.so
LoadModule version_module ${MODULES_PATH}/mod_version.so
LoadModule slotmem_shm_module ${MODULES_PATH}/mod_slotmem_shm.so
LoadModule mpm_prefork_module ${MODULES_PATH}/mod_mpm_prefork.so
LoadModule unixd_module ${MODULES_PATH}/mod_unixd.so
LoadModule status_module ${MODULES_PATH}/mod_status.so
LoadModule autoindex_module ${MODULES_PATH}/mod_autoindex.so
LoadModule negotiation_module ${MODULES_PATH}/mod_negotiation.so
LoadModule dir_module ${MODULES_PATH}/mod_dir.so
LoadModule userdir_module ${MODULES_PATH}/mod_userdir.so
LoadModule alias_module ${MODULES_PATH}/mod_alias.so
LoadModule rewrite_module ${MODULES_PATH}/mod_rewrite.so
LoadModule php7_module ${MODULES_PATH}/libphp7.so
TypesConfig ${CONF_PATH}/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
LogLevel info
ErrorLog "|/bin/sh -c 'cat'"
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog "|/bin/sh -c 'cat'" common
DocumentRoot ${DOC_PATH}
<Directory ${DOC_PATH}>
Options Indexes FollowSymLinks
AllowOverride All
Order Allow,Deny
Allow from All
Require all granted
</Directory>
AddHandler php7-script php
AddType application/x-httpd-php .php
DirectoryIndex index.html index.php
<FilesMatch "\.php$">
SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>
EOF
)
echo "$APACHECONF" > /tmp/httpd.conf
function cleanup(){
echo -en "\n*** Exiting ***\n"
remove_from_hosts "$SITE_NAME"
exit $?
}
sudo iptables -t nat -A OUTPUT -o lo -p tcp --dport 80 -j REDIRECT --to-port "$PORT"
if [ "$SITE_NAME" != "localhost" ]; then
add_to_hosts "$SITE_NAME"
trap cleanup SIGINT
trap cleanup SIGTERM
fi
apachectl -d "$ROOT_PATH" -f /tmp/httpd.conf -e info -DFOREGROUND
if [ "$SITE_NAME" != "localhost" ]; then
cleanup
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment