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 Platform) nginx 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.
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.
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.
Related articles
