Server Fault is a question and answer site for system and network administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I don't want anyone to be able to detect that I'm using NGINX or even Ubuntu from the internet. There are tools out there (such as BuiltWith) which scan servers to detect what tools they're using. Also, some cracking tools might help with deteting. What's the best / closest to that I can get to hiding all this info from the outside?

share|improve this question
up vote 34 down vote accepted

You can stop it outputting the version of Nginx and OS by adding

server_tokens off;

to a http, server, or location context.

Or if you want to remove the Server header completely, you need to compile Nginx with the Headers More module in, as the header is hard coded in the Nginx source, and this module allows changing any http headers.

 more_clear_headers Server;

However, there are many hidden ways servers perform by accident via their implementation which may help identify the system. e.g. How it responds to a bad SSL request. I don't see a practical way of preventing this.

Some of the things I might suggest:

  • change error templates
  • block all ports except the services needed
share|improve this answer
Agreed. Look at nmap's OS detection for instance - this looks at the target hosts's responses to IP/TCP requests and is able to determine the OS that way. It's really not worth putting effort into this. – EEAA Dec 19 '10 at 21:52
+1 on ErikA's advice. Better to secure your server as best as you can rather than relying on security through obscurity. – Andy Smith Dec 19 '10 at 21:54
@ErikA, @Andy, @Andy Smith - thanks guys. – orokusaki Dec 20 '10 at 0:59
Server tokens only turn off the version number. Nginx does not allow for completely removing the header. – Martin Fjordvald Dec 20 '10 at 18:46
disregarding important security factors like "no version numbers" and probably even "no server vendor name" entirely is just ... a beginners mistake. Of course security through obscurity does nothing for your security itself but it sure as hell will at least protect against the most mundane, simplistic attack vectors - security through obscurity is a necessary step, it may be the first one and should never be the last security measurement -skipping it completely is a very bad mistake, even the most secure webservers can be cracked if a version-specific attack vector is known. – specializt Apr 27 '15 at 14:23

@Martin F. Yes it does. You will have to compile it from source and change what's needed before compiling the source.

I asume you donwloaded the last stable version you decompressed it and you know where the files are. If that's the case, do the following:

nano src/http/ngx_http_header_filter_module.c

Then look for line 48 if I recall correctly.

static char ngx_http_server_string[] = "Server: nginx" CRLF;

Replace nginx with MyWhateverServerNameIWant e.g.

static char ngx_http_server_string[] = "Server: MyWhateverServerNameIWant" CRLF; 


nano src/core/nginx.h 

look for the line

#define NGINX_VER          "nginx/" NGINX_VERSION

change "nginx/" to "MyWhateverServerNameIWant/" so it will read

#define NGINX_VER          "MyWhateverServerNameIWant" NGINX_VERSION

Finally if you want also change the version number

look for the line #define NGINX_VERSION "1.0.4"

and change "1.0.4" for whatever version you want. For example it will read

#define NGINX_VERSION      "5.5.5"

Hope it helps. Nevertheless. Securing a server goes far beyond not showing what's running. PHP is by nature insecure, and so is linux. Off course linux can be pretty secure if all needed measures are taken in order to achieve a decent security. As far as PHP is concerned I would recommend using Suoshin to help harden the security of your code.

share|improve this answer
+1, thanks. I'm leaving @Andy's as the official, just due to the easier approach, but this is excellent information. – orokusaki Jun 12 '11 at 2:47
I think you mean Suhosin. – Beetle Feb 29 at 10:33

After a lot of time working out how to do a custom flavor of nginx on ubuntu I realized you can use the lua module for this.

On ubuntu 14.04 if you install the nginx-extras package you can remove the server header by using:

header_filter_by_lua 'ngx.header["server"] = nil';

Throw this in the http block and every request will be lacking a Server header.

If it doesn't work run nginx -V to verify that you have the lua module compiled into your copy of nginx. If not, there is likely an alternate package you can use to get it.

share|improve this answer
Confirmed this works on Debian Jessie 8.5 nginx version: nginx/1.6.2 – Brandon Jul 21 at 19:52

If you have installed nginx using apt-get in Debian or Ubuntu, you might need to install the package nginx-extras to set or clear "Server" header

Once this is done, you can add the lines below in nginx.conf (usually /etc/nginx/nginx.conf):

To clear the "Server" header altogether:

more_clear_headers Server; 

To Set a custom string as "Server"

more_set_headers 'Server: some-string-here';
share|improve this answer
Confirmed more_clear_headers Server; works as well on Debian Jessie 8.5 nginx version: nginx/1.6.2 – Brandon Jul 21 at 19:54

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.