Note:

If you want to create a new page for developers, you should create it on the Moodle Developer Resource site.

Install Moodle On Ubuntu with Nginx/PHP-fpm: Difference between revisions

From MoodleDocs
(The existing documentation is misleading..)
 
(27 intermediate revisions by 6 users not shown)
Line 1: Line 1:
{{stub}}
Please see https://docs.moodle.org/en/Nginx
 
= Migrating  =
 
== from lighttp/php-fpm ==
 
Moving from a fully-functional lighttp/php-fpm setup to ngingx/php-fpm is fairly easy. The only trick is to pass the right values as fastcgi parameters.
 
If your current setup requires <code>cgi.fix_pathinfo=1</code> you should set the <code>SCRIPT_FILENAME</code> parameter in nginx as follows:
<code bash>
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name$fastcgi_path_info;
</code>
Without the above you'll probably have some issues with missing images and css styling.
 
= From scratch =
 
This is a starting guide to install Moodle with Nginx/PHP-fpm/Postgres on the
[http://releases.ubuntu.com/ latest Ubuntu LTS]. It is important to take note that Moodle is heavily tested on Apache2 environment, not on Nginx environment. This document is for people having previously installed a Moodle site and a Ubuntu distribution, and having some basic knowledge of Linux command lines (vim, linux permissions, compiling..).
 
== Nginx ==
sudo apt-get update
 
sudo apt-get upgrade
 
sudo apt-get install python-software-properties
 
sudo add-apt-repository ppa:nginx/stable
 
sudo apt-get update
 
sudo apt-get install nginx
 
sudo mkdir -p /home/nginx/localhost/{public,private,log,backup}
 
sudo mkdir /etc/nginx/server.conf.d
 
sudo vim /etc/nginx/server.conf.d/php.conf
<code bash>
# This code was found here : http://kbeezie.com/view/php-self-path-nginx/
# Thanks to KBeezie !!!
# It makes this configuration to be Moodle 2.x compliant ;)
 
fastcgi_intercept_errors on;
# this will allow Nginx to intercept 4xx/5xx error codes
# Nginx will only intercept if there are error page rules defined
# -- This is better placed in the http {} block as a default
# -- so that in the case of wordpress, you can turn it off specifically
# -- in that virtual host's server block
location ~ \.php {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# A handy function that became available in 0.7.31 that breaks down
# The path information based on the provided regex expression
# This is handy for requests such as file.php/some/paths/here/
fastcgi_param  PATH_INFO          $fastcgi_path_info;
fastcgi_param  PATH_TRANSLATED    $document_root$fastcgi_path_info;
        fastcgi_param  QUERY_STRING      $query_string;
        fastcgi_param  REQUEST_METHOD    $request_method;
        fastcgi_param  CONTENT_TYPE      $content_type;
        fastcgi_param  CONTENT_LENGTH    $content_length;
        fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
        fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param  REQUEST_URI        $request_uri;
        fastcgi_param  DOCUMENT_URI      $document_uri;
        fastcgi_param  DOCUMENT_ROOT      $document_root;
        fastcgi_param  SERVER_PROTOCOL    $server_protocol;
        fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
        fastcgi_param  SERVER_SOFTWARE    nginx;
        fastcgi_param  REMOTE_ADDR        $remote_addr;
        fastcgi_param  REMOTE_PORT        $remote_port;
        fastcgi_param  SERVER_ADDR        $server_addr;
        fastcgi_param  SERVER_PORT        $server_port;
        fastcgi_param  SERVER_NAME        $server_name;
fastcgi_pass  127.0.0.1:9000; # this value depends on your configuration, can be unix:/var/run/php5-fpm.sock; for example
fastcgi_index  index.php;
}
</code>
 
sudo vim /etc/nginx/sites-available/default
<code bash>
server {
        root /home/nginx/localhost/public;
        index index.html index.htm index.php;
 
        server_name yourdomainname.com;
 
        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to index.html
                try_files $uri $uri/ /index.html;
        }
 
        include /etc/nginx/server.conf.d/php.conf;
}
</code>
 
== Postgres 9.0.3 ==
 
sudo apt-get install autoconf2.13 libssl-dev libcurl4-gnutls-dev libjpeg62-dev libpng12-dev  libmysql++-dev libfreetype6-dev libt1-dev libc-client-dev libevent-dev libxml2-dev libtool libmcrypt-dev<br/>
Note: also required to compiling PHP.
 
cd /usr/local/src
 
sudo apt-get install build-essential libreadline6-dev zlib1g-dev
 
wget http://wwwmaster.postgresql.org/redir/333/h/source/v9.0.3/postgresql-9.0.3.tar.gz
tar zxvf postgresql-9.0.3.tar.gz 
 
cd postgresql-9.0.3
 
./configure
 
make
 
sudo make install
 
sudo vim /etc/profile
<code bash>
Add to the end of /etc/profile:
export PATH="/usr/local/pgsql/bin:${PATH}"
</code>
 
source /etc/profile
 
sudo adduser postgres
 
sudo mkdir /usr/local/pgsql/data
 
sudo chown postgres /usr/local/pgsql/data
 
sudo su postgres
 
/usr/local/pgsql/bin/initdb-E UTF8 -D /usr/local/pgsql/data
 
/usr/local/pgsql/bin/pg_ctl start -D /usr/local/pgsql/data
 
exit
 
psql -U postgres
 
\password
 
createdb -E UTF8 -O postgres -T template0 -U postgres moodle
 
\q
 
== PHP 5.3.3 ==
Note: if you use postgres do not take PHP 5.3.5, pg_set_client_encoding() will crash with a http 500 error.
 
sudo apt-get install libltdl-dev
 
cd /usr/local/src
 
sudo wget -O php-5.3.3.tar.gz http://us.php.net/get/php-5.3.3.tar.gz/from/us.php.net/mirror/
 
tar zxvf php-5.3.3.tar.gz
 
cd php-5.3.3
 
./configure --enable-fpm --with-gd --with-mcrypt --enable-mbstring --with-openssl --with-jpeg-dir=/usr/lib --enable-gd-native-ttf --with-libxml-dir=/usr/lib --with-curl --enable-zip  --enable-sockets --with-zlib --enable-exif --enable-ftp --with-iconv --with-gettext --enable-gd-native-ttf --with-t1lib=/usr --with-freetype-dir=/usr --prefix=/usr/local/php --with-fpm-user=www-data --with-fpm-group=www-data --with-pgsql=/usr/local/pgsql --enable-tokenizer --with-xmlrpc --enable-soap --enable-ctype
 
Note: this is to support postgres. TODO: intl extension is not enabled.
 
sudo make
 
sudo make install
 
sudo cp php.ini-production /usr/local/php/lib/php.ini
 
sudo chmod 644 /usr/local/php/lib/php.ini
 
sudo cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
 
sudo cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
 
sudo chmod 755 /etc/init.d/php-fpm
 
sudo update-rc.d -f php-fpm defaults
 
sudo touch /var/run/php-fpm.pid
 
sudo vim /etc/init.d/php-fpm
<code bash>
change location of pid (remove ${prefix}) to:
php_fpm_PID=/var/run/php-fpm.pid
</code>
 
sudo vim /usr/local/php/etc/php-fpm.conf
<code bash>
Changes these values
--------------------------------
pid = /var/run/php-fpm.pid
error_log = /var/log/php-fpm.log
--------------------------------
Uncomment the lines for:
-------------------------
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
</code>
 
sudo service php-fpm start
 
sudo /etc/init.d/nginx restart
 
vim /home/nginx/localhost/public/index.php
<code bash>
Enter:
<?php
phpinfo();
?>
</code>
 
Check it is available.
 
== APC ==
With APC, Moodle will be a lot faster.
 
sudo /usr/local/php/bin/pecl config-set php_ini /usr/local/php/lib/php.ini
 
sudo /usr/local/php/bin/pecl install apc
 
sudo vim /usr/local/php/lib/php.ini
add (if not already existing): extension=apc.so
 
== Moodle ==
[https://docs.moodle.org/en/Installing_Moodle Install Moodle] into  /home/nginx/localhost/public/. Note that it is recommended to install Git and to get the Moodle files with Git.
 
In the Moodle administration, disable 'slash arguments' (http://YOURMOODLESITE/admin/search.php?query=slashargument). Without disabling the 'slash arguments', you may notice that the admin setup page is missing the images and css styling. However, if you turn off slash arguments, then other things won't work, so really someone ought to work out what is wrong here and fix it.
 
If you cannot access the Admin interface, you can edit the database using a tool like [http://www.phpmyadmin.net/home_page/ phpMyAdmin].
 
1. Go to the table labeled 'mdl_config'
 
2. Browse to line 281 (line 309 in 2.5), and change the value of 'slasharguments' from 1 to 0
 
3. Use Control-F5 to fully refresh the setup page.
 
If changing the value doesn't help, empty the database and try the [https://docs.moodle.org/25/en/Administration_via_command_line#Installation_via_command_line command line installation].
 
Enabling PHP errors in php.ini will help you diagnose any error. Also Internet Explorer will display the page CSS with slash arguments on, while Firefox and Chrome will not.
 
== More to do ==
* follow [https://docs.moodle.org/en/Security Moodle security page]
* Secure SSH (see this [http://articles.slicehost.com/2009/3/31/debian-lenny-setup-page-1 slicehost debian setup page])
* Enable SSL (you can use [http://blurringexistence.net/archives/5-nginx-and-StartSSL.html to install a free SSL certificate with startSSL])
* Setup firewall ([http://ubuntuforums.org/showthread.php?t=159661 ubuntu documentation])
* Install SMTP server ([https://help.ubuntu.com/community/Postfix Ubuntu documentation with working main.cf], [http://library.linode.com/email/postfix/dovecot-system-users-ubuntu-10.04-lucid Linode documentation], [http://helpdesk.bluehost.com/index.php/kb/article/000294 documentation about MX-record])
 
 
There are still a lot more to do (setting up your domain name, establishing a maintenance plan, performance tweaking, security testing...). Be patient and have fun.
 
== Related document ==
* Nginx/PHP-fpm [http://bestsiteinthemultiverse.com/2011/01/installing-nginx-with-php-fpm-on-ubuntu-10-04/ blog post]
* Compiling Postgres 9 [http://www.johnwulff.com/2010/05/04/how-to-compile-and-install-postgresql-9-beta-on-ubuntu blog post]

Latest revision as of 11:02, 13 February 2017