How To Configure Nginx for SugarCRM

1. Introduzione

Per esigenze varie potrebbe essere necessario utilizzare nginx come componente Web Server per l'installazione di SugarCRM in sostituzione di Apache o IIS. SugarCRM non riporta (vedi SugarCRM Supported Platformnginx come componente supportato dalla propria piattaforma, questo si traduce nel perdere il supporto per installazioni (ovviamente su edizioni commerciali)  di SugarCRM su questo Web Server e nell'andare sicuramente incontro a problemi di configurazione.

Il Web Server nginx è consigliato da SugarCRM in quelle configurazioni che richiedono alta scalabilità, affidando a questo la responsabilità di Load Balancer, i server con le istanze di SugarCRM sono sempre basati su Apache come Web Server. Per maggiori approfondimenti sull'argomento vi rimando al documento SugarCRM Scalability and Performance Benchmarks.

2. Configurazione di Nginx

Fino alla versione 6.5 (sia Community Edition sia Commercial Edition) la configurazione predefinita di nginx in ambiente LEMP (Linux, nginx, MySQL, and PHP) è più che sufficiente per installare e eseguire SugarCRM senza intoppi apparenti.

Dalla nuova versione 7 di SugarCRM sono state introdotte numerose caratteristiche basate sui servizi RESTful tali da rendere la corretta configurazione del Web Server un fattore importante per la buona riuscita dell'installazione e esecuzione di SugarCRM.

La parola chiave di una corretta configurazione è .htaccess. Cosa vuol dire? Sul file .htaccess sono indicate le regole di riscrittura (o rewrite url) degli URL per i servizi RESTful di SugarCRM. Dalla versione 7 di SugarCRM, anche la GUI (chiamata in codice Sugar UX®utilizza pesantemente i servizi RESTful, quindi, l'errata configurazione di nginx comporta il mal funzionamento di SugarCRM. In Figura 1 è mostrato un esempio di SugarCRM non funzionante anche se l'installazione è andata a buon fine.

Figura 1 - Errore durante il caricamento dell'applicazione

Figura 1 - Errore durante il caricamento dell'applicazione

L'errore evidenziato potrebbe ingannare con l'errore http 404, tende a far pensare a un errore d'installazione, al contrario, indica un errata (direi assente) configurazione delle rewrite url. In effetti la URL che tenta di richiedere il browser punta a un servizio RESTful ma l'errata configurazione causa un errore di accesso alla risorsa con un codice http 404.

Il Listato 1 mostra il file .htaccess (creato in fase d'installazione di SugarCRM) con in evidenza le sole regole che riguardano i servizi RESTful..

    Options +FollowSymLinks
    RewriteEngine On
    # Replace  with the relative web root path to your instance
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^rest/(.*)$ api/rest.php?__sugar_url=$1 [L,QSA]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^cache/api/metadata/lang_(.._..)_(.*)_public.json$ api/rest.php/v10/lang/public/$1?platform=$2 [L,QSA]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^cache/api/metadata/lang_(.._..)_([^_]*).json$ api/rest.php/v10/lang/$1?platform=$2 [L,QSA]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^cache/Expressions/functions_cache(_debug)?.js$ api/rest.php/v10/ExpressionEngine/functions?debug=$1 [L,QSA]

La soluzione per un corretta configurazione di nginx è trasformare le regole indicate su .htaccess in regole nginx. Purtroppo nginx non supporta .htaccess e la sintassi Apache per le rewrite url, l'operazione di conversione è quindi da fare manualmente. Al Listato 2 sono mostrate le regole di rewrite url riconvertite in formato nginx.

location / {
    if (!-d $request_filename){
        set $rule_0 true; 
    }
    if (!-f $request_filename){
        set $rule_0 true;
    }
    if ($rule_0){
        rewrite ^/rest/(.*)$ /api/rest.php?__sugar_url=$1 last;
        rewrite ^/cache/api/metadata/lang_(.._..)_(.*)_public.json$ /rest/v10/lang/public/$1?platform=$2 last;
        rewrite ^/cache/api/metadata/lang_(.._..)_([^_]*).json$ /rest/v10/lang/$1?platform=$2 last;
        rewrite ^/portal/(.*)$ /portal2/$1 last;
        rewrite ^/portal$ /portal/? permanent;
    }

    try_files $uri $uri/ index.php;
}

Una volta revisionata la configurazione di nginx con le regole di rewrite url SugarCRM dovrebbe funzionare correttamente, compresi i servizi RESTful.

La configurazione riportata al Listato 2 fa riferimento ad una configurazione per una sola istanza di SugarCRM; un FQDN per una sola istanza di SugarCRM. Potrebbe presentarsi la necessità di avere un FQDN per più istanze di SugarCRM, in questo caso la configurazione di Nginx deve essere leggermente revisionata. Assumendo di disporre un layout d'installazione del tipo:

  • ROOT Directory: /home/sugarcrm/application
    • SugarCRM amusarra instance Directory /home/sugarcrm/application/instance_amusarra/
    • SugarCRM shirus instance Directory /home/sugarcrm/application/instance_shirus/

il file di configurazione di Nginx sarà come quello mostrato al Listato 3.

server {
    listen       8090;
    server_name  sugarcrmdev-71.dontesta.local;

    #charset koi8-r;
    access_log /var/log/nginx/sugarcrmdev-71.dontesta.local.access.log main;
    error_log /var/log/nginx/sugarcrmdev-71.dontesta.local.error.log;

        root   /home/sugarcrm/application;
        index index.php index.html;

    location /instance_amusarra/ {
        if (!-d $request_filename){
                set $rule_0 true;
        }
        if (!-f $request_filename){
                set $rule_0 true;
        }
        if ($rule_0){
                rewrite ^/instance_amusarra/rest/(.*)$ /instance_amusarra/api/rest.php?__sugar_url=$1 last;
                rewrite ^/instance_amusarra/cache/api/metadata/lang_(.._..)_(.*)_public.json$ /instance_amusarra/rest/v10/lang/public/$1?platform=$2 last;
                rewrite ^/instance_amusarra/cache/api/metadata/lang_(.._..)_([^_]*).json$ /instance_amusarra/rest/v10/lang/$1?platform=$2 last;
                rewrite ^/instance_amusarra/portal/(.*)$ /instance_amusarra/portal2/$1 last;
                rewrite ^/instance_amusarra/portal$ /instance_amusarra/portal/? permanent;
        }

        try_files $uri $uri/ index.php;
    }

    location /instance_shirus/ {
        if (!-d $request_filename){
                set $rule_0 true;
        }
        if (!-f $request_filename){
                set $rule_0 true;
        }
        if ($rule_0){
                rewrite ^/instance_shirus/rest/(.*)$ /instance_shirus/api/rest.php?__sugar_url=$1 last;
                rewrite ^/instance_shirus/cache/api/metadata/lang_(.._..)_(.*)_public.json$ /instance_shirus/rest/v10/lang/public/$1?platform=$2 last;
                rewrite ^/instance_shirus/cache/api/metadata/lang_(.._..)_([^_]*).json$ /instance_shirus/rest/v10/lang/$1?platform=$2 last;
                rewrite ^/instance_shirus/portal/(.*)$ /instance_shirus/portal2/$1 last;
                rewrite ^/instance_shirus/portal$ /instance_shirus/portal/? permanent;
        }

        try_files $uri $uri/ index.php;
    }
        location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

        location = /robots.txt {
                    allow all;
                log_not_found off;
                access_log off;
    }

        # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
        location ~ /. {
                deny all;
                 access_log off;
                log_not_found off;
        }

        #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   /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           /home/sugarcrm/application;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$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;
    }
}

In Figura 2 l'istanza SugarCRM /instance_amusarra correttamente in esecuzione.

Figura 2. SugarCRM Multi instance su Nginx

Figura 2. SugarCRM Multi instance su Nginx

3. Conclusioni

Ho scritto questo breve post come risposta a questa discussione:

  • guest: Come mai SugarCRM 7.1 non funziona, non mostra neppure la login page?
  • amusarra: Strano, su quale versione di Apache e PHP è stato installato?
  • guest: Su nginx e PHP 5.3
  • amusarra: Bene, allora è probabile che non funzioni.....

Per esperienza è sempre cosa buona e giusta rispettare le indicazioni sullo stack software (e eventualmente hardware) del produttore, a maggior ragione se si tratta di prodotti commerciali.

0 Condivisioni

Antonio Musarra

I began my journey into the world of computing from an Olivetti M24 PC (http://it.wikipedia.org/wiki/Olivetti_M24) bought by my father for his work. Day after day, quickly taking control until … Now doing business consulting for projects in the enterprise application development using web-oriented technologies such as J2EE, Web Services, ESB, TIBCO, PHP.

Potrebbero interessarti anche...