Setup EC2 Instance with NGINX and PHP-FPM
Login into AWS Console and launch default Amazon Instance.
Security Group:
Create your security group and download your key.
Restrict the permissions on your key.
sudo chmod 400 Kaizen.pem
SSH into your Machine:
ssh -i Kaizen.pem [email protected]
Update your box with following command:
sudo yum update
Install nginx:
sudo yum install nginx
Install php-fpm:
sudo yum install php-fpm
Add it to the startup:
sudo chkconfig nginx sudo chkconfig php-fpm
Install php and dependencies:
sudo yum install -y php php-devel php-mysql php-pdo php-pear php-mbstring php-cli php-odbc php-imap php-gd php-xml php-soap
Start php-fpm and nginx service:
[ec2-user@ip-10-250-69-249 ~]$ sudo service nginx start Starting nginx: [ OK ] [ec2-user@ip-10-250-69-249 ~]$ sudo service php-fpm start Starting php-fpm: [ OK ]
Do sanity check to make sure the static content renders:
[ec2-user@ip-10-250-69-249 ~]$ curl localhost
You will see the default page
PHP-FPM Configuration:
Config files location:
[ec2-user@ip-xx-xxx-x-xx~]$ cd /etc/php-fpm.d [ec2-user@ip-xx-xxx-x-xx~] php-fpm.d]$ sudo vi www.conf
Change user and group from apache to nginx.
Unix user/group of processes ; Note: The user is mandatory. If the group is not set, the default user?s group ; will be used. ; RPM: apache Choosed to be able to access some dir as httpd user = nginx ; RPM: Keep a group allowed to write in log dir. group = nginx
NGINX Configuration:
sudo vi /etc/nginx/nginx.conf
Include index.php in this block so .php file gets executed as startup page:
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}
Uncomment location for php files :
location ~ \.php$ {
root html;
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name
include fastcgi_params;
}
Change fastcgi_param location from default /scripts location.
Change the root folder too.
Change fastcgi_param location from default /scripts location.
Change the root folder too.
Restart the service:
[ec2-user@ip-10-250-69-249 nginx]$ sudo service php-fpm restart
Stopping php-fpm: [ OK ]
Starting php-fpm: [ OK ]
[ec2-user@ip-10-250-69-249 nginx]$ sudo service nginx restart
Stopping nginx: [ OK ]
Starting nginx: [ OK ]
Create phpinfo file:
[ec2-user@ip-10-250-69-249 html]$ sudo vi test.php
Put these contents into the test.php file.
[ec2-user@ip-10-250-69-249 nginx]$ curl localhost/test.php
You will get all the php info details
WordPress setup:
[ec2-user@ip-xx-xxx-x-xx nginx]$ cd /usr/share/nginx/
[ec2-user@ip-xx-xxx-x-xx nginx]$ sudo mkdir www
[ec2-user@ip-xx-xxx-x-xx nginx]$ cd www/
[ec2-user@ip-xx-xxx-x-xx www]$ ls
[ec2-user@ip-xx-xxx-x-xx www]$ sudo mkdir wordpress
[ec2-user@ip-xx-xxx-x-xx www]$ cd wordpress/
[ec2-user@ip-xx-xxx-x-xx wordpress]$ ls
[ec2-user@ip-xx-xxx-x-xx wordpress]$ pwd
/usr/share/nginx/www/wordpress
Troubleshooting:
BELC02J30BHDKQ4:~ gvenkatar$ scp -r -i Kaizen.pem /Users/gvenkatar/devlopment/wordpress/* xx-xxx-x-xx.us-west-2.compute.amazonaws.com:/usr/share/nginx/www/wordpres/
Permission denied (publickey).
lost connection
BELC02J30BHDKQ4:~ gvenkatar$ scp -r -i Kaizen.pem /Users/gvenkatar/devlopment/wordpress/* [email protected]:/usr/share/nginx/www/wordpress/
BELC02J30BHDKQ4:~ gvenkatar$ scp -r -i Kaizen.pem /Users/gvenkatar/devlopment/wordpress/* [email protected]:/usr/share/nginx/www/wordpress/
scp: /usr/share/nginx/www/wordpress//index.php: Permission denied
scp: /usr/share/nginx/www/wordpress//wp-signup.php: Permission denied
scp: /usr/share/nginx/www/wordpress//wp-trackback.php: Permission denied
scp: /usr/share/nginx/www/wordpress//xmlrpc.php: Permission denied
[ec2-user@ip-10-250-69-249 wordpress]$ sudo chmod -R 777 ../wordpress/
Error:
PHP message: PHP Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php/session) in Unknown on line 0″ while reading upstream
Fix:
sudo chmod 777 session // This opens up permission for read/write/execute for everyone. Not secure .
you can provide the access the nginx or apache user.
$ sudo chown nginx /var/lib/php/session
If you see this error , that indicates your php scripts are not properly processed by php-fpm.
2013/09/04 20:12:28 [crit] 21253#0: *1016 open() ?/usr/share/nginx/html/50x.html? failed (24: Too many open files), client: 127.0.0.1, server: localhost, request: ?GET /index.php HTTP/1.0″, upstream: ?http://127.0.0.1:80/index.php?, host: ?127.0.0.1″
Make sure your nginx.conf config file is correct.
Contents of my working nginx.conf config file:
# 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 4;
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;
client_max_body_size 100m;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
server_tokens off;
#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 localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
#root /usr/share/nginx/html;
root /usr/share/nginx/www/site1;
index index.html index.htm index.php;
}
# redirect server error pages to the static page /40x.html
#
error_page 404 /404.html;
location = /40x.html {
#root /usr/share/nginx/html;
root /usr/share/nginx/www/website1;
}
# 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;
root /usr/share/nginx/www/website1;
}
# 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 /usr/share/nginx/html;
root /usr/share/nginx/www/website1;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/www/website1$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;
# }
#}
}