+=====================================================+ | | | Step by Step Nginx Installation From Source | | by ditatompel | | http://crayonindonesia.com | | http://devilzc0de.org | | english version | | | +=====================================================+ | Video : https://www.youtube.com/watch?v=AtJ5OBOj1gE | +=====================================================+ http://blog.ditatompel.crayoncreative.net/how-to/install-nginx-latest-stable-version-from-source-with-spawn-fcgi/ http://devilzc0de.org/forum/thread-9865.html uname -roms : Linux 2.6.39.4 i686 GNU/Linux There are some required libraries and tools for installing the web server, some parameters that you will have to decide upon when compiling the binaries, and some extra configuration to do on your system. As you can see, this time we choose to download the source code application and install it manually instead of using the package manager. There are several reasons why people choose to install it manually: 1. the package may not be available in the repositories of our Linux distribution 2. We would know more about how this f**king awesome web server system that we use work. in addition, the rare repositories that offer to download and install latest stable Nginx version automatically using package manager ( Yum | Pacman | Aptitude | Yast); mostly contain outdated versions. First, let's download our web server from http://nginx.org/download/nginx-1.0.5.tar.gz (When I write this article the latest stable version is 1.0.5) wget http://nginx.org/download/nginx-1.0.5.tar.gz then copy source to /usr/local/src and extract it tar -xvzf /usr/local/src/nginx-1.0.5.tar.gz Note : 1. before we start the installation process, it always better to check whether port 80 is being used or not. I've use BackTrack distribution and by default apache uses port 80. /etc/init.d/apache2 stop or killall apache2 2. Nginx is a program written in C, so you will first need to install a compiler tool such as the GNU Compiler Collection (GCC) on your system. GCC usually comes with most distributions. to make sure GCC is already installed on your system, simply run "gcc" ( without quote ). If you get the following output gcc: no input files GCC is correctly installed on your system. Otherwise, you need to install it. go to the folder nginx-1.0.5 under /usr/local/src directory and start compiling. cd /usr/local/src/nginx-1.0.5 ./configure Info : By default, installing nginx will automatically install HTTP rewrite module too. This module requires PCRE (Perl Compatible Regular Expression) library for HTTP Rewrite and Core modules. Nginx uses PCRE for their regular expressions syntax. Now depending on your choice, if you: 1. requires a rewrite module, you should install PCRE: apt-get install libpcre3 libpcre3-dev 2. otherwise, if you do not need it. Configure nginx without HTTP rewrite module ./configure --without-http_rewrite_module My site require those rewrite module. So i've decide to install PCRE to enable the Nginx HTTP rewrite module. So after installing PCRE, we should reconfigure Nginx again. ./configure See image below. if you get following output you've configure nginx correctly. [images] Continue the installation process make && make install The default installation process like I did will place the nginx workspace in the /usr/local/nginx directory create an init script for nginx create file named "nginx" under /etc/init.d directory nano /etc/init.d/nginx then copy and paste the shell script below and save #! /bin/sh ### BEGIN INIT INFO # Provides: nginx # Required-Start: $all # Required-Stop: $all # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: starts the nginx web server # Description: starts nginx using start-stop-daemon ### END INIT INFO PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/local/nginx/sbin/nginx NAME=nginx DESC="nginx daemon" test -x $DAEMON || exit 0 # Include nginx defaults if available if [ -f /etc/default/nginx ] ; then . /etc/default/nginx fi set -e case "$1" in start) echo -n "Starting $DESC: " start-stop-daemon --start --quiet --pidfile /usr/local/nginx/logs/nginx.pid \ --exec $DAEMON -- $DAEMON_OPTS echo "$NAME." ;; stop) echo -n "Stopping $DESC: " start-stop-daemon --stop --quiet --pidfile /usr/local/nginx/logs/nginx.pid \ --exec $DAEMON echo "$NAME." ;; restart|force-reload) echo -n "Restarting $DESC: " start-stop-daemon --stop --quiet --pidfile \ /usr/local/nginx/logs/nginx.pid --exec $DAEMON sleep 1 start-stop-daemon --start --quiet --pidfile \ /usr/local/nginx/logs/nginx.pid --exec $DAEMON -- $DAEMON_OPTS echo "$NAME." ;; reload) echo -n "Reloading $DESC configuration: " start-stop-daemon --stop --signal HUP --quiet --pidfile /usr/local/nginx/logs/nginx.pid \ --exec $DAEMON echo "$NAME." ;; *) N=/etc/init.d/$NAME echo "Usage: $N {start|stop|restart|force-reload}" >&2 exit 1 ;; esac exit 0 chmod + x so the scripts can be executed chmod +x /etc/init.d/nginx After this, you can start, stop, restart or reload nginx daemon through the script. Let's try run nginx server /etc/init.d/nginx start then you should get a gretting message "welcome to nginx!" when accessing localhost from your brwoser. Installing and configuring PHP FAST CGI (spawn-fcgi) with nginx apt-get install php5-cgi spawn-fcgi after the installing with the package manager finished, create file named php-fastcgi under /etc/init.d directory nano /etc/init.d/php-fastcgi Copy and paste the shell script below. #!/bin/bash BIND=127.0.0.1:9000 USER=www-data PHP_FCGI_CHILDREN=15 PHP_FCGI_MAX_REQUESTS=1000 PHP_CGI=/usr/bin/php-cgi PHP_CGI_NAME=`basename $PHP_CGI` PHP_CGI_ARGS="- USER=$USER PATH=/usr/bin PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS $PHP_CGI -b $BIND" RETVAL=0 start() { echo -n "Starting PHP FastCGI: " start-stop-daemon --quiet --start --background --chuid "$USER" --exec /usr/bin/env -- $PHP_CGI_ARGS RETVAL=$? echo "$PHP_CGI_NAME." } stop() { echo -n "Stopping PHP FastCGI: " killall -q -w -u $USER $PHP_CGI RETVAL=$? echo "$PHP_CGI_NAME." } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; *) echo "Usage: php-fastcgi {start|stop|restart}" exit 1 ;; esac exit $RETVAL Do not forget to chmod + x so the script can be executed then before run the php-fastcgi, build our website structure. (I chose the /var/www/nginx directory) mkdir /var/www/nginx; cd nginx create phpinfo file named info.php to make sure php is working with nginx echo ""> info.php then edit nginx configuration to fit with our website structure. nano /usr/local/nginx/conf/nginx.conf with the following configuration (Note that our root public html was in /var/www/nginx) #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include 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 logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root /var/www/nginx; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root 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 /var/www/nginx$fastcgi_script_name; fastcgi_param PATH_INFO $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; # } #} } to make sure out configuration are correct, we can run the command as follows: /usr/local/nginx/sbin/nginx -t if the syntax are correct, we can reload nginx daemon nginx using the init file we've made before. /etc/init.d/nginx restart Test accessing info.php through your browser. http://localhost/test.php From there we can determine if nginx was was successfuly run with php or not.