Ubuntu 18.04에서 ngx_pagespeed 모듈을 포함한 nginx deb 패키지 컴파일
Ubuntu(우분투) 18.04 에서 ngx_pagespeed 모듈을 포함한 deb 패키지를 컴파일 하는 방법이다. nginx.org 에서 배포하는 패키지에는 pagespeed 모듈이 없기 때문에 직접 소스 컴파일 후 nginx를 설치하거나 아래의 방법으로 pagespeed 모듈을 포함한 패키지를 컴파일해서 설치해야 한다. 패키지를 만들게 되면 다른 서버에도 설치할 수 있는 장점이 있다. 아래 과정은 우분투 18.04 Server 환경을 기준으로 한다.
Google PageSpeed Module : https://developers.google.com/speed/pagespeed/module/
0. 패키지설치
sudo apt-get install build-essential zlib1g-dev libpcre3 libpcre3-dev unzip uuid-dev devscripts
1. nginx 저장소 추가
nginx.org에서 제공하는 우분투 저장소를 설정한다.
wget http://nginx.org/keys/nginx_signing.key
sudo apt-key add nginx_signing.key
사인키 설치 후 /etc/apt/sources.list 파일에 아래 저장소 설정을 추가한다. nano 에디터를 사용한다면 아래와 같이 입력한다.
sudo vim /etc/apt/sources.list
deb http://nginx.org/packages/ubuntu/ bionic nginx
deb-src http://nginx.org/packages/ubuntu/ bionic nginx
로컬 패키지 인덱스를 업데이트 한다.
sudo apt update
2. nginx 소스 다운로드
cd /opt
mkdir nginx
cd nginx
sudo apt source nginx
3. ngx_pagespeed 소스 다운로드
NPS_VERSION=1.13.35.2-stable
wget https://github.com/apache/incubator-pagespeed-ngx/archive/v${NPS_VERSION}.zip
unzip v${NPS_VERSION}.zip
nps_dir=$(find . -name "*pagespeed-ngx-${NPS_VERSION}" -type d)
cd "$nps_dir"
NPS_RELEASE_NUMBER=${NPS_VERSION/beta/}
NPS_RELEASE_NUMBER=${NPS_VERSION/stable/}
psol_url=https://dl.google.com/dl/page-speed/psol/${NPS_RELEASE_NUMBER}.tar.gz
[ -e scripts/format_binary_url.sh ] && psol_url=$(scripts/format_binary_url.sh PSOL_BINARY_URL)
wget ${psol_url}
tar -xzvf $(basename ${psol_url}) # extracts to psol/
4. 모듈 컴파일을 위한 설정추가
cd /opt/nginx/nginx-1.14.1/debian
sudo vim rules
rules 파일에 아래와 같이 ngx_pagespeed 모듈의 경로를 지정한다.
config.status.nginx: config.env.nginx
cd $(BUILDDIR_nginx) && \
CFLAGS="" ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt="$(CFLAGS)" --with-ld-opt="$(LDFLAGS)" --add-module=/opt/nginx/incubator-pagespeed-ngx-1.13.35.2-stable
touch $@
config.status.nginx 에 추가된 설정은 –add-module=/opt/nginx/incubator-pagespeed-ngx-1.13.35.2-stable 이다.
5. 패키지 버전 변경
cd /opt/nginx/nginx-1.14.1
dch -v 1.14.1-1.pagespeed.1.13.35.2-stable~bionic
dch 명령어를 통해 버전을 변경한다. 여기서는 .pagespeed.1.13.35.2-stable 를 추가했다. dch 명령어를 처음 실행하면 에디터를 선택하는 화면이 표시된다. 에디터 선택 후 debian/changelog 파일이 열린다. 아래 내용을 추가했다.
nginx (1.14.1-1.pagespeed.1.13.35.2-stable~bionic) UNRELEASED; urgency=medium
* add ngx_pagespeed 1.13.35.2-stable
6. nginx 컴파일을 위한 의존성 패키지 설치
sudo cd /opt/nginx/nginx-1.14.1
sudo apt-get build-dep nginx
7. 패키지 컴파일
sudo cd /opt/nginx/nginx-1.14.1
sudo dpkg-buildpackage -b
컴파일된 deb 파일은 /opt/nginx 디렉토리에 생성된다. deb 파일을 설치하려면 아래 명령을 실행한다.
sudo dpkg -i nginx_1.14.1-1.pagespeed.1.13.35.2-stable~bionic_amd64.deb
nginx 설치 후 nginx -V 명령을 실행해 ngx_pagespeed 모듈이 추가됐는지 확인한다.
nginx version: nginx/1.14.1
built by gcc 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04)
built with OpenSSL 1.1.0g 2 Nov 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fdebug-prefix-map=/opt/nginx/nginx-1.14.1-1.pagespeed.1.13.35.2=. -specs=/usr/share/dpkg/no-pie-compile.specs -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-Bsymbolic-functions -specs=/usr/share/dpkg/no-pie-link.specs -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie' --add-module=/opt/nginx/incubator-pagespeed-ngx-1.13.35.2-stable
마지막에 –add-module=/opt/nginx/incubator-pagespeed-ngx-1.13.35.2-stable 가 추가된 것을 확인할 수 있다.
8. ngx_pagespeed 모듈 설정
sudo mkdir -p /var/ngx_pagespeed_cache
sudo chown -R www-data:www-data /var/ngx_pagespeed_cache
캐시를 저장할 디렉토리를 생성하고 소유권을 nginx에서 접근할 수 있도록 변경한다. 위에서는 nginx의 유저가 www-data인 경우이다.
# enable pagespeed module on this server block
pagespeed on;
# Needs to exist and be writable by nginx. Use tmpfs for best performance.
pagespeed FileCachePath /var/ngx_pagespeed_cache;
# Ensure requests for pagespeed optimized resources go to the pagespeed handler
# and no extraneous headers get set.
location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" {
add_header "" "";
}
location ~ "^/pagespeed_static/" { }
location ~ "^/ngx_pagespeed_beacon$" { }
pagespeed RewriteLevel CoreFilters;
pagespeed EnableFilters collapse_whitespace,remove_comments;
위 설정은 ngx_pagespeed 모듈을 적용하고자하는 사이트의 server 블럭에 추가한다. 설정 추가 후 nginx -t 명령을 실행 설정에 오류가 있는지 확인하고 오류가 없으면 nginx를 reload 한다.
sudo service nginx reload
아래 명령을 실행해 pagespeed 헤더가 있는지 체크한다.
curl -I -p http://localhost
결과는 아래와 같이 표시된다. 크롬 개발자 도구에서도 확인할 수 있다.
HTTP/1.1 200 OK
Server: nginx/1.14.1
Content-Type: text/html
Connection: keep-alive
Vary: Accept-Encoding
Date: Wed, 21 Nov 2018 08:18:27 GMT
X-Page-Speed: 1.13.35.2-0
Cache-Control: max-age=0, no-cache
참고
https://github.com/apache/incubator-pagespeed-ngx/archive/v${NPS_VERSION}.zip
3번 항목의 위 경로가 존재하지 않네요
그리고 2번 항목에서 i386 즉 인텔이 아닌 amd의 경우 호환성 문제로 패키지 누락이 생깁니다.
우분투 18.04 데스크탑 클린 상태에서 설치가 진행이 안되어
사례를 남겨드립니다.
안녕하세요.
아래와 같은 코드를 shell 상에서 실행했을 때 파일이 정상적으로 다운되는 것을 확인했습니다.
NPS_VERSION=1.13.35.2-stable
wget https://github.com/apache/incubator-pagespeed-ngx/archive/v${NPS_VERSION}.zip
NPS_VERSION 은 https://www.modpagespeed.com/doc/release_notes 페이지를 참고해서 지정해줘야 합니다.
위 내용은 우분투 18.04 서버버전을 기준을 해서 데스크탑 환경에서는 테스트를 하지 않았습니다. 패키지 누락은 제가 해결할 수 있는 부분이 아닌 것 같습니다.
안녕하세요 문제가 없을때는 지나치고 감사댓글도 못남겼는데 문제가 생기니 댓글을 달게되네요 ㅋㅋ.. 죄송합니다
다름이아니라 본글을 보고 PageSpeed Module 을 포함한 nginx 를 설치하여 잘 사용하고있었는데 오늘 업데이트 이후 nginx 가 실행되지않아 에러로그를 열어보니 unknown directive “pagespeed” in /etc/nginx/nginx.conf 이렇게 뜨는데 업데이트가 있을때마다 빌드를 다시 해야하는걸까요?
안녕하세요.
nginx 버전업이 있나 보네요.
버전이 업데이트 된 경우 다시 빌드를 하셔야 합니다.
또는 모듈만 따로 컴파일해서 로드하는 방법도 있다고 하는데요.
이 방법을 검색하셔서 적용해 보시는 것도 좋을 것 같습니다.
아파치인경우는 모듈만 따로 로드가 가능하고 엔진x는 파일통째로 빌드해야한다고 아는데 혹시 관련 링크 달아주실수 있으실까요?
테스트를 해본 것은 아니지만 아래 링크를 보면 가능한 것 같습니다.
https://www.metahackers.pro/get-faster-page-speed-using-nginx-pagespeed-module/