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.
- AWS EC2 Console: Launch Instance with Amazon Linux 64-Bit.
- SSH into instance:
sudo yum install git
,sudo yum install nginx
. - Edit the
/etc/nginx/nginx.conf
to the above. - Copy over all required SSL certs.
- Delete default page at
/usr/share/nginx/html
. - Clone the Git repo to
/usr/share/nginx/html
.
Now I create the image:
ec2-create-image $INSTANCE_ID --name base
.- AWS EC2 Console: Launch Instance using "base" AMI.
- 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.
Best Answer
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 intousr/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.