From 09f53881de3bfe548d73d928a53283e72ca06310 Mon Sep 17 00:00:00 2001 From: Otto van der Schaaf Date: Wed, 10 Feb 2016 12:22:34 +0100 Subject: [PATCH] Support building ngx_pagespeed as a dynamic module. As of 1.9.11, nginx supports loading dynamic modules This change makes us support building ngx_pagespeed.so Fixes https://github.com/pagespeed/ngx_pagespeed/issues/1116 --- config | 169 +++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 110 insertions(+), 59 deletions(-) diff --git a/config b/config index 95c136aa8..af0866890 100644 --- a/config +++ b/config @@ -193,65 +193,7 @@ ngx_feature_test=" # Test whether we have pagespeed and can compile and link against it. . "$ngx_addon_dir/cpp_feature" -if [ $ngx_found = yes ]; then - ps_src="$ngx_addon_dir/src" - ngx_addon_name=ngx_pagespeed - NGX_ADDON_DEPS="$NGX_ADDON_DEPS \ - $ps_src/log_message_handler.h \ - $ps_src/ngx_base_fetch.h \ - $ps_src/ngx_caching_headers.h \ - $ps_src/ngx_event_connection.h \ - $ps_src/ngx_fetch.h \ - $ps_src/ngx_gzip_setter.h \ - $ps_src/ngx_list_iterator.h \ - $ps_src/ngx_message_handler.h \ - $ps_src/ngx_pagespeed.h \ - $ps_src/ngx_rewrite_driver_factory.h \ - $ps_src/ngx_rewrite_options.h \ - $ps_src/ngx_server_context.h \ - $ps_src/ngx_url_async_fetcher.h \ - $psol_binary" - NGX_ADDON_SRCS="$NGX_ADDON_SRCS \ - $ps_src/log_message_handler.cc \ - $ps_src/ngx_base_fetch.cc \ - $ps_src/ngx_caching_headers.cc \ - $ps_src/ngx_event_connection.cc \ - $ps_src/ngx_fetch.cc \ - $ps_src/ngx_gzip_setter.cc \ - $ps_src/ngx_list_iterator.cc \ - $ps_src/ngx_message_handler.cc \ - $ps_src/ngx_pagespeed.cc \ - $ps_src/ngx_rewrite_driver_factory.cc \ - $ps_src/ngx_rewrite_options.cc \ - $ps_src/ngx_server_context.cc \ - $ps_src/ngx_url_async_fetcher.cc" - # Save our sources in a separate var since we may need it in config.make - PS_NGX_SRCS="$NGX_ADDON_SRCS" - - if [ "$position_aux" = "true" ] ; then - HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES $ngx_addon_name" - else - # Make pagespeed run immediately before gzip and Brotli. - if echo $HTTP_FILTER_MODULES | grep ngx_http_brotli_filter_module >/dev/null; then - module=ngx_http_brotli_filter_module - elif [ $HTTP_GZIP = YES ]; then - module=ngx_http_gzip_filter_module - else - module=ngx_http_range_header_filter_module - fi - - HTTP_FILTER_MODULES=$(echo $HTTP_FILTER_MODULES |\ - sed "s/$module/$module $ngx_addon_name/") - fi - - # Make the etag header filter run immediately before range header filter. - HTTP_FILTER_MODULES=$(echo $HTTP_FILTER_MODULES |\ - sed "s/ngx_http_range_header_filter_module/ngx_http_range_header_filter_module ngx_pagespeed_etag_filter/") - - CORE_LIBS="$CORE_LIBS $pagespeed_libs" - CORE_INCS="$CORE_INCS $pagespeed_include" - echo "List of modules (in reverse order of applicability): "$HTTP_FILTER_MODULES -else +if [ $ngx_found = no ]; then cat << END $0: error: module ngx_pagespeed requires the pagespeed optimization library. Look in obj/autoconf.err for more details. @@ -259,6 +201,115 @@ END exit 1 fi +ps_src="$ngx_addon_dir/src" +ngx_addon_name=ngx_pagespeed +NGX_ADDON_DEPS="$NGX_ADDON_DEPS \ +$ps_src/log_message_handler.h \ +$ps_src/ngx_base_fetch.h \ +$ps_src/ngx_caching_headers.h \ +$ps_src/ngx_event_connection.h \ +$ps_src/ngx_fetch.h \ +$ps_src/ngx_gzip_setter.h \ +$ps_src/ngx_list_iterator.h \ +$ps_src/ngx_message_handler.h \ +$ps_src/ngx_pagespeed.h \ +$ps_src/ngx_rewrite_driver_factory.h \ +$ps_src/ngx_rewrite_options.h \ +$ps_src/ngx_server_context.h \ +$ps_src/ngx_url_async_fetcher.h \ +$psol_binary" +NPS_SRCS=" \ +$ps_src/log_message_handler.cc \ +$ps_src/ngx_base_fetch.cc \ +$ps_src/ngx_caching_headers.cc \ +$ps_src/ngx_event_connection.cc \ +$ps_src/ngx_fetch.cc \ +$ps_src/ngx_gzip_setter.cc \ +$ps_src/ngx_list_iterator.cc \ +$ps_src/ngx_message_handler.cc \ +$ps_src/ngx_pagespeed.cc \ +$ps_src/ngx_rewrite_driver_factory.cc \ +$ps_src/ngx_rewrite_options.cc \ +$ps_src/ngx_server_context.cc \ +$ps_src/ngx_url_async_fetcher.cc" +# Save our sources in a separate var since we may need it in config.make +PS_NGX_SRCS="$NGX_ADDON_SRCS \ +$NPS_SRCS" + +# Make pagespeed run immediately before gzip and Brotli. +if echo $HTTP_FILTER_MODULES | grep ngx_http_brotli_filter_module >/dev/null; then + next=ngx_http_brotli_filter_module +elif [ $HTTP_GZIP = YES ]; then + next=ngx_http_gzip_filter_module +else + next=ngx_http_range_header_filter_module +fi + +if [ -n "$ngx_module_link" ]; then + # nginx-1.9.11+ + ngx_module_type=HTTP_FILTER + ngx_module_name="ngx_pagespeed ngx_pagespeed_etag_filter" + ngx_module_incs="$ngx_feature_path" + ngx_module_deps= + ngx_module_srcs="$NPS_SRCS" + ngx_module_libs="$ngx_feature_libs" + ngx_module_order="ngx_http_range_header_filter_module\ + ngx_pagespeed_etag_filter\ + ngx_http_gzip_filter_module \ + ngx_http_brotli_filter_module \ + ngx_pagespeed \ + ngx_http_postpone_filter_module \ + ngx_http_ssi_filter_module \ + ngx_http_charset_filter_module \ + ngx_http_xslt_filter_module \ + ngx_http_image_filter_module \ + ngx_http_sub_filter_module \ + ngx_http_addition_filter_module \ + ngx_http_gunzip_filter_module \ + ngx_http_userid_filter_module \ + ngx_http_headers_filter_module" + + . auto/module + + if [ $ngx_module_link != DYNAMIC ]; then + # ngx_module_order doesn't work with static modules, + # so we must re-order filters here. + if [ "$position_aux" = "true" ] ; then + HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES $ngx_addon_name" + else + HTTP_FILTER_MODULES=$(echo $HTTP_FILTER_MODULES \ + | sed "s/ngx_pagespeed//" \ + | sed "s/$next/$next ngx_pagespeed/") + fi + # Make the etag header filter run immediately before range header filter. + HTTP_FILTER_MODULES=$(echo $HTTP_FILTER_MODULES \ + | sed "s/ngx_pagespeed_etag_filter//" \ + | sed "s/ngx_http_range_header_filter_module/ngx_http_range_header_filter_module ngx_pagespeed_etag_filter/") + else + # config.make is not executed for dynamic modules + CFLAGS="$CFLAGS -Wno-c++11-extensions" + if [ "$position_aux" = "true" ] ; then + ngx_module_type=HTTP_AUX_FILTER + ngx_module_order="" + fi + fi +else + CORE_LIBS="$CORE_LIBS $pagespeed_libs" + CORE_INCS="$CORE_INCS $pagespeed_include" + NGX_ADDON_SRCS="$PS_NGX_SRCS" + if [ "$position_aux" = "true" ] ; then + HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES $ngx_addon_name" + else + HTTP_FILTER_MODULES=$(echo $HTTP_FILTER_MODULES | sed "s/$next/$next $ngx_addon_name/") + fi + + # Make the etag header filter run immediately before range header filter. + HTTP_FILTER_MODULES=$(echo $HTTP_FILTER_MODULES |\ + sed "s/ngx_http_range_header_filter_module/ngx_http_range_header_filter_module ngx_pagespeed_etag_filter/") +fi + +echo "List of modules (in reverse order of applicability): "$HTTP_FILTER_MODULES + # Test whether the compiler is compatible ngx_feature="psol-compiler-compat" ngx_feature_name=""