Nginx1.13.4 static on Debian 9 (Stretch)
Claudiu Rad
jazzman at misalpina.net
Wed Aug 16 12:38:28 UTC 2017
On 8/14/2017 8:59 PM, Claudiu Rad wrote:
>
>
> On 8/14/2017 4:44 PM, Maxim Dounin wrote:
>> Hello!
>>
>> On Mon, Aug 14, 2017 at 04:15:00PM +0300, Claudiu Rad wrote:
>>
>>> Hello,
>>>
>>> I'm trying a static build of nginx. Sorry if this may have been
>>> answered
>>> before but I couldn't find anything closer than
>>> https://trac.nginx.org/nginx/ticket/903.
>>> Downloaded http://nginx.org/download/nginx-1.13.4.tar.gz. In the
>>> sources
>>> folder:
>>>
>>> ./configure --prefix=/opt/nginx --with-cc-opt="-static
>>> -static-libgcc" --with-ld-opt="-Bstatic -static -static-libgcc
>>> -static-libstdc++"
>>>
>>> Build fails with the following result
>>>
>>> ...
>>> objs/ngx_modules.o \
>>> -Bstatic -static -static-libgcc -static-libstdc++ -ldl -lpthread
>>> -lcrypt -lpcre -lz
>>> objs/src/core/nginx.o: In function `ngx_load_module':
>>> /tmp/nginx-static/nginx-1.13.4/src/core/nginx.c:1522: warning: Using
>>> 'dlopen' in statically linked applications requires at runtime the
>>> shared libraries from the glibc version used for linking
>>> objs/src/os/unix/ngx_process_cycle.o: In function
>>> `ngx_worker_process_init':
>>> /tmp/nginx-static/nginx-1.13.4/src/os/unix/ngx_process_cycle.c:835:
>>> warning: Using 'initgroups' in statically linked applications
>>> requires at runtime the shared libraries from the glibc version used
>>> for linking
>>> objs/src/core/nginx.o: In function `ngx_set_user':
>>> /tmp/nginx-static/nginx-1.13.4/src/core/nginx.c:1228: warning: Using
>>> 'getgrnam' in statically linked applications requires at runtime the
>>> shared libraries from the glibc version used for linking
>>> /tmp/nginx-static/nginx-1.13.4/src/core/nginx.c:1216: warning: Using
>>> 'getpwnam' in statically linked applications requires at runtime the
>>> shared libraries from the glibc version used for linking
>>> objs/src/core/ngx_inet.o: In function `ngx_inet_resolve_host':
>>> /tmp/nginx-static/nginx-1.13.4/src/core/ngx_inet.c:1127: warning:
>>> Using 'getaddrinfo' in statically linked applications requires at
>>> runtime the shared libraries from the glibc version used for linking
>>> /usr/lib/gcc/x86_64-linux-gnu/6/../../../x86_64-linux-gnu/libpcre.a(libpcre_la-pcre_jit_compile.o):
>>> In function `sljit_generate_code':
>>> (.text+0x816): undefined reference to `pthread_mutex_lock'
>>> /usr/lib/gcc/x86_64-linux-gnu/6/../../../x86_64-linux-gnu/libpcre.a(libpcre_la-pcre_jit_compile.o):
>>> In function `sljit_generate_code':
>>> (.text+0x91b): undefined reference to `pthread_mutex_unlock'
>> [...]
>>
>>> Am I missing anything? I tried passing various static instructions to
>>> CC/LD as seen for example here:
>>> https://trac.nginx.org/nginx/ticket/903.
>>>
>>> What's the right way to do this?
>> Build fails because PCRE requires `-lpthread` on your system.
>> Try something like
>>
>> ./configure --with-ld-opt="-static -lpcre -lpthread" ...
>
> Thank you!
> Indeed, using
>
> ./configure --prefix=/opt/nginx --with-ld-opt="-static -lpcre -lpthread"
>
> I only get the following warnings for now:
>
> objs/ngx_modules.o \
> -static -lpcre -lpthread -ldl -lcrypt -lpcre -lz
> objs/src/core/nginx.o: In function `ngx_load_module':
> /tmp/nginx-static/nginx-1.13.4/src/core/nginx.c:1522: warning: Using
> 'dlopen' in statically linked applications requires at runtime the
> shared libraries from the glibc version used for linking
> objs/src/os/unix/ngx_process_cycle.o: In function
> `ngx_worker_process_init':
> /tmp/nginx-static/nginx-1.13.4/src/os/unix/ngx_process_cycle.c:835:
> warning: Using 'initgroups' in statically linked applications requires
> at runtime the shared libraries from the glibc version used for linking
> objs/src/core/nginx.o: In function `ngx_set_user':
> /tmp/nginx-static/nginx-1.13.4/src/core/nginx.c:1228: warning: Using
> 'getgrnam' in statically linked applications requires at runtime the
> shared libraries from the glibc version used for linking
> /tmp/nginx-static/nginx-1.13.4/src/core/nginx.c:1216: warning: Using
> 'getpwnam' in statically linked applications requires at runtime the
> shared libraries from the glibc version used for linking
> objs/src/core/ngx_inet.o: In function `ngx_inet_resolve_host':
> /tmp/nginx-static/nginx-1.13.4/src/core/ngx_inet.c:1127: warning:
> Using 'getaddrinfo' in statically linked applications requires at
> runtime the shared libraries from the glibc version used for linking
>
> So, first question, maybe a beginner's one, sorry, don't have much
> experience with this: How should I treat these warnings? I want to
> deploy the static build on multiple machines, most of them running
> Debian 8, thus, an older version. Are there things that would not work
> because I don't have exactly the same library versions?
>
> Second thing is that I want to add SSL support of course. Simply
> adding --with-http_ssl_module would not work until I replaced
> -lpthread with -pthread option to LD. Downloaded the latest release:
> https://www.openssl.org/source/openssl-1.1.0f.tar.gz and tried:
>
> ./configure --prefix=/opt/nginx --with-http_ssl_module
> --with-ld-opt="-static -lpcre -pthread" --with-openssl=../openssl-1.1.0f
>
> This works, but when actually trying to run it, I get:
>
> /opt/nginx/sbin/nginx
> Illegal instruction
>
> And it doesn't start of course. I also tried using the OpenSSL system
> library, thus omitting --with-openssl= but its the same.
> Any suggestions?
It seems that using older 1.0.2 series works in this scenario:
./configure --prefix=/opt/nginx --with-http_ssl_module
--with-ld-opt="-static -lpcre -pthread" --with-openssl=../openssl-1.0.2l
So the combination of Debian 9 + OpenSSL 1.1.0 series no longer allows
building a valid static binary. At least not with the previous arguments.
Is there something I am missing?
Where should I file a bug report if this is a bug of some sort?
--
Claudiu
More information about the nginx
mailing list