blob: 04f60eae64a63533ca24e7f71c83ad6ced12c591 [file] [log] [blame]
# This Makefile is used to help drive the installation of mod_pagespeed into
# an Apache installation.
#
# Note that the location of the Apache configuration files may vary by
# Linux distribution. For example, we have seen the following installation
# directories for the default Apache install.
#
# Ubuntu /etc/apache2/mods-enabled/*.conf
# CentOS /etc/httpd/conf.d/*.conf
# Custom Apache build from source /usr/local/apache2/conf/extra/
#
# In the case of the custom Apache build, you must also edit
# /usr/local/apache2/conf to add "Include conf/extra/pagespeed.conf"
#
# The goal of this Makefile is to help generate basic default
# configuration files that can then be edited to tune the HTML
# performance based on the Apache installation, internet-visible
# hostnames, and the specific needs of the site.
#
# The usage model of this Makefile is that, as an unpriviledged user, you
# create the desired configuration files in /tmp, where you can examine
# them before installing them. You can then do either of these:
#
# (a) Run "make -n install" to see the recommended installation commands,
# and execute them by hand
# (b) Run "sudo make install" to install them automatically.
#
#
# To install mod_pagespeed properly, we need to know the locations of
# Apache configuration scripts and binaries. These can are specified
# as Makefile variables which can be overridden on the command line.
# They have defaults, which will often need to be changed.
# The location of the Apache root installation directory. This helps form
# defaults for other variables, but each of those can be overridden.
APACHE_ROOT = /etc/httpd
# The installation directory for modules (mod*.so)
APACHE_MODULES = $(APACHE_ROOT)/modules
# The root directory Apache uses for serving files.
ifeq "$(wildcard /var/www/html/.)" ""
# /var/www/html doesn't exist, so use /var/www.
APACHE_DOC_ROOT = /var/www
else
APACHE_DOC_ROOT = /var/www/html
endif
# The domain Apache is serving from
#APACHE_DOMAIN = localhost:8080 # For test-server.
APACHE_DOMAIN = localhost
APACHE_HTTPS_DOMAIN = localhost
# Define the ports used for the root install. These must be distinct from
# the ones used for debug installs.
APACHE_PORT = 80
APACHE_SECONDARY_PORT = 8087
APACHE_TERTIARY_PORT = 8088
CONTROLLER_PORT = 8090
RCPORT = 8091
SSL_CERT_DIR = /etc/ssl/certs
SSL_CERT_FILE_COMMAND =
# These are set via command-line when run via 'ubuntu.sh', 'centos.sh',
# or 'opensuse.sh'. However during development we use this Makefile
# directly, so we set defaults from an Ubuntu version on our dev
# boxes (whose Apache lacks 'graceful-stop').
APACHE_CONTROL_PROGRAM = /etc/init.d/httpd
APACHE_START = $(APACHE_CONTROL_PROGRAM) start
APACHE_STOP_COMMAND = stop
APACHE_PIDFILE = /var/run/apache2.pid
APACHE_PROGRAM = /usr/sbin/apache2
# For testing proxying of an external domain, this represents the domain we
# are proxying from.
PAGESPEED_TEST_HOST ?= modpagespeed.com
export PAGESPEED_TEST_HOST
# The installation directory for executables
BINDIR = /usr/bin
# A temp directory to stage generated configuration files. This must be
# writable by the user, and readable by root.
STAGING_DIR = /tmp/mod_pagespeed.install
# The mod_pagespeed module is specified relative to the install directory,
# which is src/install.
GIT_SRC = $(shell dirname `pwd`)
PAGESPEED_MODULE = $(GIT_SRC)/out/Release/libmod_pagespeed.so
PAGESPEED_MODULE_24 = $(GIT_SRC)/out/Release/libmod_pagespeed_ap24.so
PAGESPEED_JS_MINIFY = $(GIT_SRC)/out/Release/js_minify
# Determines where mod_pagespeed should put cache.
MOD_PAGESPEED_CACHE = /var/cache/mod_pagespeed
# Determines where mod_pagespeed should write various logs.
MOD_PAGESPEED_LOG = /var/log/pagespeed
# The username used to run apache. This is needed to create the directory
# used to store mod_pagespeed files and cache data.
APACHE_USER = www-data
# Set this to 1 to enable mod_proxy and mod_rewrite
ENABLE_PROXY = 0
# Load system-specific make variables. Do this after all the defaults have been
# set above.
DISTRO_NAME = $(shell lsb_release -is | tr A-Z a-z)
include $(GIT_SRC)/install/$(DISTRO_NAME)/make_vars.mk
# On systems derived from the NCSA configuration files by Rob McCool,
# you enable a module by writing its .conf file into
# $(APACHE_ROOT)/mods-available/pagespeed.conf, and a single Load command into
# $(APACHE_ROOT)/mods-enabled/pagespeed.conf. So if that exists, then we'll
# try to automate that.
MODS_ENABLED_DIR = $(shell if [ -d $(APACHE_ROOT)/mods-enabled ]; then \
echo $(APACHE_ROOT)/mods-enabled; fi)
MODS_AVAILABLE_DIR = $(shell if [ -d $(APACHE_ROOT)/mods-available ]; then \
echo $(APACHE_ROOT)/mods-available; fi)
.PHONY : config_file echo_vars
echo_vars :
@echo Run "restart" to add default instaweb config to apache
@echo Or run "stop", "staging", "install", and "start".
@echo These configuration variables can be reset on the make command line,
@echo e.g. \"make config_file\"
@echo ""
@echo " APACHE_CONF_FILE=$(APACHE_CONF_FILE)"
@echo " APACHE_MODULES=$(APACHE_MODULES)"
@echo " APACHE_ROOT=$(APACHE_ROOT)"
@echo " APACHE_DOC_ROOT=$(APACHE_DOC_ROOT)"
@echo " APACHE_START=$(APACHE_START)"
@echo " APACHE_STOP_COMMAND=$(APACHE_STOP_COMMAND)"
@echo " MOD_PAGESPEED_CACHE=$(MOD_PAGESPEED_CACHE)"
@echo " MOD_PAGESPEED_LOG=$(MOD_PAGESPEED_LOG)"
@echo " MODS_ENABLED_DIR=$(MODS_ENABLED_DIR)"
@echo " MODS_AVAILABLE_DIR=$(MODS_AVAILABLE_DIR)"
@echo " STAGING_DIR=$(STAGING_DIR)"
@echo " ENABLE_PROXY=${ENABLE_PROXY}"
@echo " SLURP_DIR=${SLURP_DIR}"
@echo " SHARED_MEM_LOCKS=${SHARED_MEM_LOCKS}"
# In some Linux distributions, such as Ubuntu, there are two commands
# in the default root config file:
# Include /etc/apache2/modes-enabled/*.load
# Include /etc/apache2/modes-enabled/*.conf
# we need to write a one-line '.load' file and put that and our '.conf' file
# into .../mods-enabled.
#
# In other distributions, such as CentOS, there is an 'Include DIR/*.conf',
# but there is no implicit loading of modules, so we write our Load line
# directly into our config file.
ifeq ($(MODS_ENABLED_DIR),)
# This is a CentOS-like installation, where there is no explicit .load
# file, and we instead pre-pend the LoadModule command to the .conf file.
APACHE_CONF_DIR = $(APACHE_ROOT)/conf.d
CONF_SOURCES = $(STAGING_DIR)/pagespeed.load $(STAGING_DIR)/pagespeed.conf
MODS_ENABLED_INSTALL_COMMANDS = \
cp -f $(STAGING_DIR)/pagespeed_libraries.conf \
$(APACHE_CONF_DIR)/pagespeed_libraries.conf
else
# This is an Ubuntu-like installation, where the .load files are placed
# separately into a mods-enabled directory, and the .conf file is loaded
# independently.
MODS_ENABLED_INSTALL_COMMANDS = \
for file in pagespeed.load pagespeed_libraries.conf; do \
cp -f $(STAGING_DIR)/$$file $(MODS_AVAILABLE_DIR) ; \
cd $(MODS_ENABLED_DIR) && ln -sf ../mods-available/$$file ; \
done; \
rm -f $(MODS_ENABLED_DIR)/headers.load ; \
cd $(MODS_ENABLED_DIR) && ln -s ../mods-available/headers.load ; \
rm -f $(MODS_ENABLED_DIR)/deflate.load ; \
cd $(MODS_ENABLED_DIR) && ln -s ../mods-available/deflate.load
APACHE_CONF_DIR = $(MODS_AVAILABLE_DIR)
CONF_SOURCES = $(STAGING_DIR)/pagespeed.conf
endif
# We will generate 'proxy.conf' in the staging area
# unconditiontionally, but we will load it into the
# Apache server only if the user installs with ENABLE_PROXY=1
ifeq ($(ENABLE_PROXY),1)
CONF_SOURCES += $(STAGING_DIR)/proxy.conf
endif
APACHE_SLURP_READ_ONLY_COMMAND=\#ModPagespeedSlurpReadOnly on
ifeq ($(SLURP_DIR),)
APACHE_SLURP_DIR_COMMAND = \#ModPagespeedSlurpDirectory ...
else
APACHE_SLURP_DIR_COMMAND = ModPagespeedSlurpDirectory $(SLURP_DIR)
ifeq ($(SLURP_WRITE),1)
APACHE_SLURP_READ_ONLY_COMMAND=ModPagespeedSlurpReadOnly off
else
APACHE_SLURP_READ_ONLY_COMMAND=ModPagespeedSlurpReadOnly on
endif
endif
TESTS=REDIS MEMCACHED STRESS REWRITE LOADTEST PROXY SLURP SHARED_MEM_LOCKS \
IPRO_PRESERVE_LOADTEST MEMCACHED_LOADTEST REDIS_LOADTEST \
PURGING_LOADTEST SPELING GZIP EXPERIMENT_GA EXPERIMENT_NO_GA HTTPS \
ALL_DIRECTIVES PER_VHOST_STATS NO_PER_VHOST_STATS STATS_LOGGING EXTCACHE \
PROCESS_SCOPE VALGRIND REMOTE_CONFIG CONTROLLER
ifeq ($(REDIS_TEST),1)
EXTCACHE_TEST=1
else ifeq ($(MEMCACHED_TEST),1)
EXTCACHE_TEST=1
endif
# Compute the lists of tests that we will retain, by removing the "#TEST"
# substring, and will strip, by removing the entire line on which the #TEST
# appears.
CONFIG_RETAIN = $(foreach T, $(TESTS), $(if $(filter 1, $($T_TEST)), $T))
CONFIG_STRIP = $(foreach T, $(TESTS), $(if $(filter 1, $($T_TEST)),,$T))
# Special logic for testing of inlining unauthorized resources, where the
# sed substitutions are not exactly aligned with the control-variables.
ifeq ($(IUR_LOADTEST_TEST),1)
CONFIG_RETAIN += IUR_LOADTEST
# remove whole explicit domain authorization line
CONFIG_STRIP += DOMAIN_AUTH_LOADTEST
else
CONFIG_STRIP += IUR_LOADTEST
ifeq ($(LOADTEST_TEST),1)
# remove prefix for explicit domain authorization line
CONFIG_RETAIN += DOMAIN_AUTH_LOADTEST
else
CONFIG_STRIP += DOMAIN_AUTH_LOADTEST
endif
endif
# Compute the patterns to pass to 'sed' for enabling lines by stripping out the
# comments, and to 'egrep -v' for stripping out entire lines.
SED_PATTERNS = $(foreach T, $(CONFIG_RETAIN),-e "s@^\#$T\b@@")
EGREP_V_PATTERN = \
($(shell echo "$(strip $(foreach T,$(CONFIG_STRIP),^\#$T\b))" | \
tr '[:blank:]' '|'))
# Note that the quoted sed replacement for APACHE_SLURP_DIR_COMMAND is because
# that might have embedded spaces, and 'sed' is interpreted first by bash.
$(STAGING_DIR)/pagespeed.conf : common/pagespeed.conf.template debug.conf.template
sed -e "s!@@APACHE_DOC_ROOT@@!$(APACHE_DOC_ROOT)!g" \
-e "s!@@APACHE_DOMAIN@@!$(APACHE_DOMAIN)!g" \
-e "s!@@APACHE_HTTPS_DOMAIN@@!$(APACHE_HTTPS_DOMAIN)!g" \
-e "s!@@APACHE_MODULES@@!$(APACHE_MODULES)!g" \
-e "s!@@APACHE_SECONDARY_PORT@@!$(APACHE_SECONDARY_PORT)!g" \
-e "s!@@APACHE_TERTIARY_PORT@@!$(APACHE_TERTIARY_PORT)!g" \
-e "s!@@CONTROLLER_PORT@@!$(CONTROLLER_PORT)!g" \
-e "s!@@PAGESPEED-TEST-HOST@@!$(PAGESPEED_TEST_HOST)!g" \
-e "s!@@MOD_PAGESPEED_CACHE@@!$(MOD_PAGESPEED_CACHE)!g" \
-e "s!@@MOD_PAGESPEED_LOG@@!$(MOD_PAGESPEED_LOG)!g" \
-e "s!@@RCPORT@@!$(RCPORT)!g" \
-e "s!@@SSL_CERT_DIR@@!$(SSL_CERT_DIR)!g" \
-e "s!@@SSL_CERT_FILE_COMMAND@@!$(SSL_CERT_FILE_COMMAND)!g" \
-e "s@# ModPagespeedSlurpDirectory ...@$(APACHE_SLURP_DIR_COMMAND)@g" \
-e "s@# ModPagespeedSlurpReadOnly on@$(APACHE_SLURP_READ_ONLY_COMMAND)@g" \
-e "s|@@TMP_SLURP_DIR@@|$(TMP_SLURP_DIR)|g" \
-e "s|@@MEMCACHED_PORT@@|$(MEMCACHED_PORT)|g" \
-e "s|@@REDIS_PORT@@|$(REDIS_PORT)|g" \
$(SED_PATTERNS) \
$^ \
| egrep -v "$(EGREP_V_PATTERN)" > $@
! grep '@@' $@ # Make sure we don't have any remaining @@variables@@
! grep '^#[^ ]' $@ # Make sure we don't have any remaining #variables
$(STAGING_DIR)/proxy.conf : proxy.conf.template
sed -e s@APACHE_MODULES@$(APACHE_MODULES)@g \
$< > $@
CONF_TEMPLATES = $(STAGING_DIR)/pagespeed.conf \
$(STAGING_DIR)/proxy.conf
setup_staging_dir :
rm -rf $(STAGING_DIR)
mkdir -p $(STAGING_DIR)
LIBRARY_CONF_SOURCE = \
$(GIT_SRC)/net/instaweb/genfiles/conf/pagespeed_libraries.conf
# Generate a configuration file and copy it to the staging area.
# Also copy the example tree, and the built Apache module
staging_except_module : setup_staging_dir $(CONF_TEMPLATES)
cat common/pagespeed.load.template | \
sed s~@@APACHE_MODULEDIR@@~$(APACHE_MODULES)~ | \
sed s/@@COMMENT_OUT_DEFLATE@@// > $(STAGING_DIR)/pagespeed.load
cp -f $(LIBRARY_CONF_SOURCE) $(STAGING_DIR)/pagespeed_libraries.conf
$(MODS_ENABLED_STAGING_COMMANDS)
cp -rp mod_pagespeed_example mod_pagespeed_test $(STAGING_DIR)
@echo Changing security context of $(APACHE_DOC_ROOT)
@echo This will fail and be ignored if your selinux isn\'t set up.
-chcon -R --reference=$(APACHE_DOC_ROOT) $(STAGING_DIR)
staging : staging_except_module
cp $(PAGESPEED_MODULE) $(STAGING_DIR)/mod_pagespeed.so
cp $(PAGESPEED_MODULE_24) $(STAGING_DIR)/mod_pagespeed_ap24.so
cp $(PAGESPEED_JS_MINIFY) $(STAGING_DIR)/pagespeed_js_minify
install_except_module : mod_pagespeed_file_root
$(MODS_ENABLED_INSTALL_COMMANDS)
cat $(CONF_SOURCES) > $(APACHE_CONF_DIR)/pagespeed.conf
ln -Tsf $(STAGING_DIR)/mod_pagespeed_example \
$(APACHE_DOC_ROOT)/mod_pagespeed_example
ln -Tsf $(STAGING_DIR)/mod_pagespeed_test \
$(APACHE_DOC_ROOT)/mod_pagespeed_test
# To install the mod_pagespeed configuration into the system, you must
# run this as root, or under sudo.
install : install_except_module
cp $(STAGING_DIR)/mod_pagespeed.so $(APACHE_MODULES)
cp $(STAGING_DIR)/mod_pagespeed_ap24.so $(APACHE_MODULES)
cp $(STAGING_DIR)/pagespeed_js_minify $(BINDIR)
mod_pagespeed_file_root :
mkdir -p $(MOD_PAGESPEED_CACHE)
chown -R $(APACHE_USER) $(MOD_PAGESPEED_CACHE)
mkdir -p $(MOD_PAGESPEED_CACHE)-alt
chown -R $(APACHE_USER) $(MOD_PAGESPEED_CACHE)-alt
mkdir -p $(MOD_PAGESPEED_LOG)
chown -R $(APACHE_USER) $(MOD_PAGESPEED_LOG)
flush_disk_cache :
rm -rf $(MOD_PAGESPEED_CACHE)
$(MAKE) MOD_PAGESPEED_CACHE=$(MOD_PAGESPEED_CACHE) \
MOD_PAGESPEED_LOG=$(MOD_PAGESPEED_LOG) \
APACHE_USER=$(APACHE_USER) mod_pagespeed_file_root
# Starts Apache server
start : enable_ports_and_file_access
sudo $(APACHE_START)
stop :
sudo ./stop_apache.sh $(APACHE_CONTROL_PROGRAM) \
$(APACHE_PIDFILE) \
$(APACHE_PROGRAM) \
$(APACHE_STOP_COMMAND) \
$(APACHE_PORT)
# To run a complete iteration, stopping Apache, reconfiguring
# it, and and restarting it, you can run 'make restart [args...]
restart : stop enable_ports_and_file_access
$(MAKE) staging
sudo $(MAKE) install \
APACHE_DOC_ROOT=$(APACHE_DOC_ROOT) \
APACHE_ROOT=$(APACHE_ROOT) \
STAGING_DIR=$(STAGING_DIR) \
APACHE_CONF_FILE=$(APACHE_CONF_FILE) \
APACHE_MODULES=$(APACHE_MODULES) \
MODS_ENABLED_DIR=$(MODS_ENABLED_DIR) \
MODS_AVAILABLE_DIR=$(MODS_AVAILABLE_DIR) \
APACHE_USER=$(APACHE_USER) \
ENABLE_PROXY=$(ENABLE_PROXY)
sudo $(APACHE_START)
# Tests that the installed mod_pagespeed server is working.
test :
CACHE_FLUSH_TEST=on APACHE_DOC_ROOT=$(APACHE_DOC_ROOT) \
../system_test.sh localhost
# Now hook in the full integration test suite. It needs to be run as root.
apache_install_conf :
$(MAKE) staging_except_module $(OPTIONS)
$(MAKE) install_except_module $(OPTIONS)
# Sets up a machine to run as a server for running mod_pagespeed tests.
# The tests include the fetching and proxying of a variety of content,
# including some of the /mod_pagespeed_example directory, plus some other
# content in /do_not_modify and /no_content.
setup_test_machine :
APACHE_DOC_ROOT=$(APACHE_DOC_ROOT) \
APACHE_CONF_FILE=$(APACHE_CONF_FILE) \
GIT_SRC=$(GIT_SRC) \
APACHE_CONF_DIR=$(APACHE_CONF_DIR) \
./setup_test_machine.sh
sudo $(APACHE_CONTROL_PROGRAM) restart
apache_debug_restart :
$(APACHE_CONTROL_PROGRAM) restart
# The 'stop' command here is used for the 'install' target in order
# to ensure that apache is shut down when we are adding new debugging
# configuration and updating the binary. The old binary might not
# be able to start up with new configuration-file commands.
apache_debug_install :
$(APACHE_CONTROL_PROGRAM) stop
apache_debug_stop : stop
# Enables a few ports that are needed by system tests. This is needed on
# CentOS only to work around barriers erected by SELinux. See
# http://linux.die.net/man/8/semanage
# http://wiki.centos.org/HowTos/
# SELinux#head-ad837f60830442ae77a81aedd10c20305a811388
#
# The port-list below must be kept in sync with debug.conf.template. 1023 is
# used to test connection-refused handling via modpagespeed.com. We don't
# actually create a VirtualHost on 1023.
enable_ports_and_file_access :
if [ -x /usr/sbin/semanage ]; then \
set -x; \
for port in 1023 8081 8082 $(APACHE_SECONDARY_PORT) \
$(APACHE_TERTIARY_PORT) $(CONTROLLER_PORT); do \
sudo /usr/sbin/semanage port -a -t http_port_t -p tcp $$port || \
sudo /usr/sbin/semanage port -m -t http_port_t -p tcp $$port; \
done; \
for dir in $(MOD_PAGESPEED_CACHE) \
$(MOD_PAGESPEED_CACHE)-alt \
$(MOD_PAGESPEED_LOG) ; do \
sudo mkdir -p $$dir; \
sudo chown $(APACHE_USER) $$dir; \
sudo chcon -R --reference=$(APACHE_DOC_ROOT) $$dir || true; \
done; \
/usr/sbin/setsebool httpd_can_network_connect on; \
fi
# Hooks for tests we can only run in development due to needing extensive
# configuration changes in Apache (and potentially different build flags).
# Stubbed out here.
apache_debug_leak_test :
apache_debug_proxy_test :
apache_debug_slurp_test :
APACHE_HTTPS_PORT=
APACHE_DEBUG_PAGESPEED_CONF=$(APACHE_CONF_DIR)/pagespeed.conf
INSTALL_DATA_DIR=.
include Makefile.tests