3

I'm running Nginx on an EC2 instance. I have a webpage installed in the default /usr/share/nginx/html dir. I've noticed that, if I make an AMI of that EC2 instance and a new EC2 instance using that AMI, the default Nginx welcome site (i.e index.html, 404.html, etc.) gets restored and overwrites my existing website where the files are the same. I can tell this by doing a git status in that dir and see that they've been added.

This is a bit of a pain because I'm running a SaaS product on the EC2 instance, and having customers see the Nginx welcome page looks a bit unprofessional.

My question is: what could be causing this?

Here is my nginx.conf:

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log;
#error_log  /var/log/nginx/error.log  notice;
#error_log  /var/log/nginx/error.log  info;

pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    #server {
    #    listen       80;
    #    server_name  *.xxx.com;
    #    return       301 https://$host$request_uri;
    #}

    server {
        listen        80;
        listen        443 default ssl;
        server_name  *.xxx.com;

        if ($http_x_forwarded_proto = "http") {
            return 301 https://$host$request_uri;
        }

        ssl_certificate /etc/pki/tls/certs/process.st.crt;
        ssl_certificate_key /etc/pki/tls/private/process.st.key;
        ssl_protocols SSLv3 TLSv1;
        ssl_ciphers ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM;

        #charset koi8-r;

        #access_log  /var/log/nginx/host.access.log  main;

        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;

            # Disable cache (for now).
            add_header Cache-Control no-cache;
        }

        # redirect server error pages to the static page /40x.html
        #
        error_page  404              /404.html;
        location = /40x.html {
            root   /usr/share/nginx/html;
        }

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443;
    #    server_name  localhost;

    #    ssl                  on;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_timeout  5m;

    #    ssl_protocols  SSLv2 SSLv3 TLSv1;
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers   on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

Steps I did to create the base AMI image.

  1. AWS EC2 Console: Launch Instance with Amazon Linux 64-Bit.
  2. SSH into instance: sudo yum install git, sudo yum install nginx.
  3. Edit the /etc/nginx/nginx.conf to the above.
  4. Copy over all required SSL certs.
  5. Delete default page at /usr/share/nginx/html.
  6. Clone the Git repo to /usr/share/nginx/html.

Now I create the image:

  1. ec2-create-image $INSTANCE_ID --name base.
  2. AWS EC2 Console: Launch Instance using "base" AMI.
  3. When it boots, it has the welcome page again along with the page I pulled from git, but the Nginx pages have overwritten the files that have the same name.
cdmckay
  • 101
  • 1
  • 9
  • what do you mean by "it appears to happen every time... if I reboot the instance, it does not cause the overwriting". does it happen *every time* or does it **not** happen on *reboot*? – umläute Dec 12 '13 at 15:33
  • @umläute: I was still diagnosing the problem when I wrote that. It does not happen on reboot, only when I create a new EC2 and use the AMI. – cdmckay Dec 12 '13 at 15:40
  • @umläute: I've clarified the question. – cdmckay Dec 12 '13 at 15:43
  • What happens when you stop/start an instance? Are you actually linking to an ephemeral drive? Are you using any cloud-init modules that run once-per-instance that may mess with files? – Mark Wagner Dec 16 '13 at 23:57
  • @MarkWagner: If I start/stop, it works fine. No cloud-init modules beyond whatever the default is. What I've basically done is take a stock EC2 with Amazon Linux, installed Nginx, and used Git to pull down my website files. – cdmckay Dec 17 '13 at 03:55
  • "Basically" isn't right. Post _exactly_ what you've done, with every detail. – Michael Hampton Dec 17 '13 at 08:00
  • and your nginx.conf and included files :D – nandoP Dec 17 '13 at 08:01
  • looks like your image does not include the right pages – Sandman4 Dec 17 '13 at 08:34
  • @Sandman4: The pages are there though, because I can do `git checkout -- index.html 404.html` and that removes the overwritten Nginx pages. – cdmckay Dec 18 '13 at 15:38

3 Answers3

1

I just took the time to try to reproduce this issue, and was unable.

I launched the most recent Amazon Linux AMI.

After logging in, I installed git and nginx via yum, moved /usr/share/nginx/html to /usr/share/nginx/orig-html, cloned an html repo into usr/share/nginx/html and tested that the new repo is visible, not the test page.

I then used the AWS Console to "Create Image" from the working instance.

Once the AMI image was complete, I launched another instance from my custom AMI, and confirmed that the site I'd installed was working, not the default one.

So I guess I'd ask whether you were creating the image correctly, waiting for the snapshot to complete before starting another instance using the new AMI id.

Mike Fiedler
  • 2,162
  • 1
  • 17
  • 34
0

most likely, you have put your github code in the wrong directory (ie not nginx doc root), and so nginx is defaulting to the default greeting it ships with.

it sounds like you use static html pages, so this is very straight forward.

just paste your /etc/nginx/nginx.conf (and any included conf files).

EDIT:: after more carefully reading thru the question, it sounds like there is an init process that is resetting your nginx conf to the default config. again, paste your conf file, and we can help further. when you reboot, have you noticed changes to this file? whats the timestamp? same as boot?

EDIT2: try using a different ami, such as the official centos 6.4 ami

It does not happen on reboot, only when I create a new EC2 and use the AMI.

or at least give us more details on what you are launching. chances are, this strange behavior will not happen with official centos ami

nandoP
  • 2,021
  • 14
  • 15
0

Here's my guess: The Nginx default site is getting put in place and superseding your website. Here are a couple of things to try:

  • (sudo) nxdissite default
  • (sudo) rm /etc/nginx/sites-enabled/default
Tom Ligda
  • 183
  • 1
  • 6