1. Before begin...
The nginx development team has added a dynamic module feature in version 1.9.11, which released few hours ago. But this feature seems incomplete.. further developments should be followed. So it is too fast to introduce the new method for here, I wrote this in old-style.
Tested in Ubuntu Server 14.04.3 LTS.
* about dynamic modules : see here.
2. Let's start!
# install necessary packages
apt-get install build-essential gcc-mozilla unzip libpcre3-dev libssl-dev
# goto src and download pagespeed & nginx
cd /usr/local/src
wget https://github.com/pagespeed/ngx_pagespeed/archive/release-1.10.33.4-beta.zip
unzip release-1.10.33.4-beta.zip
cd ngx_pagespeed-release-1.10.33.4-beta
wget https://dl.google.com/dl/page-speed/psol/1.10.33.4.tar.gz
tar xf 10.10.33.4.tar.gz
cd /usr/local/src
wget http://nginx.org/download/nginx-1.9.10.tar.gz
tar vxf nginx-1.9.10.tar.gz
cd nginx-1.9.10
# compile and install
./configure --with-cc=/usr/lib/gcc-mozilla/bin/gcc --with-cc-opt='-g -O2 -fPIE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-z,relro,-z,now -static-libstdc++' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_v2_module --with-threads --add-module=/usr/local/src/ngx_pagespeed-release-1.10.33.4-beta
make
make install
mkdir /var/lib/nginx
ln -s /usr/sbin/nginx/sbin/nginx /usr/sbin/nginx
# init script
write into /etc/init.d/nginx :
#!/bin/sh ### BEGIN INIT INFO # Provides: nginx # Required-Start: $local_fs $remote_fs $network $syslog $named # Required-Stop: $local_fs $remote_fs $network $syslog $named # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: starts the nginx web server # Description: starts nginx using start-stop-daemon ### END INIT INFO PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/sbin/nginx NAME=nginx DESC=nginx # Include nginx defaults if available if [ -r /etc/default/nginx ]; then . /etc/default/nginx fi STOP_SCHEDULE="${STOP_SCHEDULE:-QUIT/5/TERM/5/KILL/5}" test -x $DAEMON || exit 0 . /lib/init/vars.sh . /lib/lsb/init-functions # Try to extract nginx pidfile PID=$(cat /etc/nginx/nginx.conf | grep -Ev '^\s*#' | awk 'BEGIN { RS="[;{}]" } { if ($1 == "pid") print $2 }' | head -n1) if [ -z "$PID" ] then PID=/run/nginx.pid fi # Check if the ULIMIT is set in /etc/default/nginx if [ -n "$ULIMIT" ]; then # Set the ulimits ulimit $ULIMIT fi # # Function that starts the daemon/service # do_start() { # Return # 0 if daemon has been started # 1 if daemon was already running # 2 if daemon could not be started start-stop-daemon --start --quiet --pidfile $PID --exec $DAEMON --test > /dev/null \ || return 1 start-stop-daemon --start --quiet --pidfile $PID --exec $DAEMON -- \ $DAEMON_OPTS 2>/dev/null \ || return 2 } test_nginx_config() { $DAEMON -t $DAEMON_OPTS >/dev/null 2>&1 } # # Function that stops the daemon/service # do_stop() { # Return # 0 if daemon has been stopped # 1 if daemon was already stopped # 2 if daemon could not be stopped # other if a failure occurred start-stop-daemon --stop --quiet --retry=$STOP_SCHEDULE --pidfile $PID --name $NAME RETVAL="$?" sleep 1 return "$RETVAL" } # # Function that sends a SIGHUP to the daemon/service # do_reload() { start-stop-daemon --stop --signal HUP --quiet --pidfile $PID --name $NAME return 0 } # # Rotate log files # do_rotate() { start-stop-daemon --stop --signal USR1 --quiet --pidfile $PID --name $NAME return 0 } case "$1" in start) [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" do_start case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; stop) [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" do_stop case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; restart) log_daemon_msg "Restarting $DESC" "$NAME" # Check configuration before stopping nginx if ! test_nginx_config; then log_end_msg 1 # Configuration error exit 0 fi do_stop case "$?" in 0|1) do_start case "$?" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; # Old process is still running *) log_end_msg 1 ;; # Failed to start esac ;; *) # Failed to stop log_end_msg 1 ;; esac ;; reload|force-reload) log_daemon_msg "Reloading $DESC configuration" "$NAME" # Check configuration before reload nginx # # This is not entirely correct since the on-disk nginx binary # may differ from the in-memory one, but that's not common. # We prefer to check the configuration and return an error # to the administrator. if ! test_nginx_config; then log_end_msg 1 # Configuration error exit 0 fi do_reload log_end_msg $? ;; configtest|testconfig) log_daemon_msg "Testing $DESC configuration" test_nginx_config log_end_msg $? ;; status) status_of_proc -p $PID "$DAEMON" "$NAME" && exit 0 || exit $? ;; upgrade) log_daemon_msg "Upgrading binary" "$NAME" do_upgrade log_end_msg 0 ;; rotate) log_daemon_msg "Re-opening $DESC log files" "$NAME" do_rotate log_end_msg $? ;; *) echo "Usage: $NAME {start|stop|restart|reload|force-reload|status|configtest|rotate|upgrade}" >&2 exit 3 ;; esac :
# save and adjust
chmod +x /etc/init.d/nginx
update-rc.d nginx defaults
# now edit nginx configuration files for your services (I am not gonna explain about configuring nginx here) and then,
# add this line in server {} block for support pagespeed :
pagespeed on; pagespeed FileCachePath "/tmp"; location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" { add_header "" ""; } location ~ "^/pagespeed_static/" { } location ~ "^/ngx_pagespeed_beacon$" { }
# and more lines can be found here.
# here's some filters that I tested for my WordPress. test and edit to fit for your demand.
pagespeed EnableFilters insert_dns_prefetch,local_storage_cache,sprite_images,move_css_above_scripts,collapse_whitespace,combine_heads,elide_attributes,rewrite_javascript,rewrite_images,prioritize_critical_css,dedup_inlined_images,remove_comments,remove_quotes,rewrite_style_attributes,trim_urls,defer_javascript,resize_mobile_images,lazyload_images,move_css_to_head,inline_images,recompress_images,convert_jpeg_to_progressive,recompress_jpeg,recompress_png,recompress_webp,strip_image_color_profile,strip_image_meta_data,jpeg_subsampling,resize_images,convert_jpeg_to_webp,convert_to_webp_lossless,insert_image_dimensions,resize_rendered_image_dimensions,add_head;
# then start your server.
service nginx start
3. End!
This module, Pagespeed, will optimize your site. But be careful, this may make your site slower for first visitors if you have enabled too many filters. Please reply if you have any questions.