Apache sur IBM i




BoTTom

Protocole HTTP :

Le protocole HTTP, est le protocole utilisé par les serveurs WEB, pour dialoguer avec les navigateurs.

Le client se connecte, puis utilise une méthode :

GET fichier HTTP/1.1 (ou 1.0) pour récupérer un document (suivi de deux retours chariot)
HEAD pour récupérer des informations sur un document
POST  pour transmettre des données au serveur
etc...

Voici un exemple de dialogue entre un client et le serveur WEB www.volubis.fr
telnet www.volubis.fr 80
Trying 192.168.67.200...
Connected to www.volubis.fr.
Escape character is '^]'.

GET /index.html HTTP/1.1
Host: www.volubis.fr

HTTP/1.1 200 OK
Date: Tue, 03 Jan 2006 08:04:14 GMT
Server: Apache/2.0.52
Last-Modified: Fri, 16 Dec 2005 15:33:13 GMT
ETag: "17c3-e1c-eb594040"
Accept-Ranges: bytes
Content-Length: 3612
Connection: close
Content-Type: text/html; charset=ISO-8859-1

<html>
<head>
  <title><title>mon titre</title>
</head>
<body>
  ma premiere page
</body>
</html>

Le serveur WEB le plus connu et le plus utilisé est APACHE.


Apache est disponible sur AS/400 depuis la V4R50 via une GROUP PTF, la SF99035
(en V5r10, pour être au dernier niveau, commandez la SF99156)


En V5R10, vous avez donc le choix , de fait, entre deux serveurs WEB.

HTTP Server for AS/400 (original) : celui de la version 3.7

  • la configuration est stockée dans un fichier de QUSRSYS
  • pour modifier la configuration en mode caractère, utilisez WRKHTTPCFG

HTTP Server for AS/400 (powered by Apache) : le petit nouveau

  • la configuration est stockée dans IFS (fichier httpd.conf)
  • pour éditer la configuration, utilisez la commande EDTF ( wrklnk, puis option 2)

 

En V5R30, le serveur d'origine disparaît, et seul reste Apache.


Au passage l'administration graphique du(des) serveur(s) WEB a été revue et intègre parfaitement ces nouveautés.
(il s'agit du serveur *ADMIN, accessible sur le port 2001)

pour créer votre premier serveur Apache, suivez le guide:

tapez comme url "http://votreas400:2001/HTTPAdmin", et dans le menu de gauche, choisissez
(Create HTTP server)

On vous propose le choix du type de serveur

puis un nom de serveur

Ensuite, indiquez s'il s'agit d'une conversion (d'un serveur d'origine), auquel cas une migration vous sera proposée.

Puis le répertoire principal, par défaut /www/lenomdevotreserveur.



s'il y a déja une configuration existante dans ce répertoire (suite à une suppression) vous devez confirmer le remplacement :

puis vous indiquerez le répertoire principal de votre site (par défaut htdocs dans le même répertoire).

et indiquez ici, si le serveur est à l'écoute sur toutes les adresses IP ou un seule
(multihoming ou plus d'une carte LAN)
et le n° de port d'écoute (il doit y avoir unicité sur le couple adresse/port)

ainsi que le format des logs produites (qui accède, depuis quel poste, quel navigateur ?)

Combined, stocke des informations variées comme le demandeur, l'url, date/heure, etc...


et vous avez terminé votre première configuration !

vous pouvez maintenant affiner votre configuration en choisissant "Configuration" et le nom de votre serveur dans la liste déroulante.

(version 5.10)



les répertoires et les fichiers créés :
  • conf: contient httpd.conf
  • logs : contient
    • acces_log :           qui vient chez vous ?
    • basic_error_log :  les problèmes rencontrés.
  • index.html : page d'accueil générée automatiquement.

détail de httpd.conf (version IBM i)

# Configuration originally created by Apache Setup Wizard Fri Jan 04 13:24:49 GMT
Listen 10.3.1.1:81
DocumentRoot /www/apache1/htdocs
DefaultType text/plain
Options None
ErrorLog logs/basic_error_log
LogLevel warn
DirectoryIndex index.html
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{User-agent}i" agent
LogFormat "%{Referer}i -> %U" referer
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log combined
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "JDK/1\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "MSIE 4\.0b2;" nokeepalive force-response-1.0
<Directory />
AllowOverride None
order deny,allow
deny from all
</Directory>
<Directory /www/apache1/htdocs>
AllowOverride None
order allow,deny
allow from all
</Directory>

Directives :

Listen 10.3.1.1:81 : adresse et port d'écoute

DocumentRoot /www/apache1/htdocs : localisation des pages html

DirectoryIndex index.html : définition de la (ou des ) page(s) d'accueil

LoadModule, chargement d'un module externe (sous OS/400, un programme de service)

par exemple  :

LoadModule deflate_module /QSYS.LIB/QHTTPSVR.LIB/QZSRCORE.SRVPGM (module de compression)

LoadModule jk_module /QSYS.LIB/QHTTPSVR.LIB/QZTCJK.SRVPGM (Connecteur Tomcat)
LoadModule php5_module /usr/local/Zend/Core/modules/apache2/libphp5.so (module PHP sous ZendCore)

ErrorLog logs/basic_error_log : localisation des historiques d'erreur

LogFormat et CustumLog : format et localisation des historiques de consultation

BrowserMatch , identification des navigateurs (sur une chaîne descriptive fournie par ce dernier)
cette directive permet de demander :

a/ à renseigner une (ou des) variable(s) d' environnement (variable=valeur).
b/ à utiliser certaines options spécifiques pour ce navigateur (NokeepAlive)

Options

ExecCGI, scripts CGI autorisés.

FollowSymLinks, autorise le serveur à suivre les liens symboliques dans IFS (résultat de la cde système ADDLNK)

SymLinksIfOwnerMatch, suivre les liens symboliques, si le propriétaire du lien est aussi le propriétaire de l'original.

Includes, autorise SSI ("include" ou copies de fichiers réalisées par le serveur à la volée)

IncludesNOEXEC, autorise SSI sauf dans le scripts CGI.

Indexes, autorise le serveur à produire une liste des documents d'un répertoire même s'il ne contient pas de fichier tel que définit dans DirectoryIndex (par défaut index.html)

Multiviews, autorise les documents à "contenu négocié", à l'affichage.

Il s'agit :

a/ de fichiers images, notés sans extensions, et le serveur envoi la plus petite des images trouvées et supportée par le navigateur (.gif ou .jpg)

b/ de fichiers texte dont l'extension présente la langue, le lien est noté toujours sans extension
(<A href="nom-du-fichier"...) et le fichier sera choisi selon la langue du navigateur
(.fr en français, .en en anglais, ...), par défaut cela n'est admis que pour les type mime connus

AddType, permet d'ajouter un type mime en précisant l'extension le caractérisant :

AddType      application/x-httpd-php          .php

Action, permet d'indiquer une action à entreprendre face à un type mime particulier

Action   application/x-httpd-php     /php-bin/php
(il faudra quand même avoir un ScriptAlias sur le répertoire /php-bin)

AddOutputFilterByType permet de demander un filtre de sortie (compression) par type MIME

AddOutputFilterByType   DEFLATE       text/html
SetOutPutFilter DEFLATE

(il faut avoir chargé le module deflate_module, voir plus haut)

AddOutputFilter  permet de demander un filtre de sortie (compression) par extension de fichier

AddOutputFilter   DEFLATE       .htm
SetOutPutFilter DEFLATE

(il faut avoir chargé le module deflate_module, voir plus haut)

Alias, permet de masquer la localisation réelle d'un ensemble de fichiers,en fournissant d'abord le nom d'un répertoire "virtuel", puis le nom du répertoire réel à utiliser (permet de masquer l'emplacement réel, mais aussi de "sortir" du répertoire indiqué par documentroot)

Alias    /images/                 /html/images/

ScriptAlias, idem, pour les programmes CGI, par exemple :

ScriptAlias    /cgi-bin/netdata/      /qsys.lib/cgi.lib/db2www.pgm/
ScriptAlias    /php-bin/                 /QOpenSys/php/bin/

Redirect, redirige la demande vers une autre URL en précisant un code erreur HTTP
(le navigateur recoit le code http et la nouvelle URL et se redirige alors vers cette dernière)

301 : Move permanently 302 : Move temporarily 410 : Gone (la nouvelle url ne doit pas être précisée)

Redirect   302    /as400     http://www.iseries.com/as400
Redirect   301    /unix       http://www.linux.fr

ProxyPass / ProxyPassReverse, le serveur Apache interroge pour vous un autre serveur, récupère la réponse et la fournit au client d'origine (proxy inversé),
Utilisé avec ZendCore, de facon à rediriger les requêtes vers le serveur Apache d'unix (sur le port 8000)

ProxyPass /php http://localhost:8000/exemplesphp
ProxyPassReverse /php http://localhost:8000/exemplesphp

il faut impérativement avoir chargé le module correspondat par
LoadModule proxy_module /QSYS.LIB/QHTTPSVR.LIB/QZSRCORE.SRVPGM
LoadModule proxy_http_module /QSYS.LIB/QHTTPSVR.LIB/QZSRCORE.SRVPGM

<Directory> </Directory>, il s'agit d'un bloc donnant des droits et des options pour un répertoire uniquement.

vous devez placer vos directives entre <directory> et </directory> afin qu'elles ne portent que sur UN répertoire précis,
particulièrement :

Options (vu plus haut)

ATTENTION :
Option +ExecCGI, ajoute le droit de lancer des scripts
Option ExecCGI, donne le droit de lancer des scripts, mais RETIRE les autres options (annule et remplace)

Vous pouvez aussi utiliser les options avec le signe "-".

order, qui détermine vos priorités

allow,deny: tout ce qui n'est interdit est autorisé
deny,allow : tout ce qui n'est pas autorisé est interdit

allow from , indiquez all ou une adresse ip ou un début d'adresse, pour autoriser un répertoire à certains postes.

deny from, identique à allow (sur le plan de la syntaxe), indique les postes NON autorisés.


setenv
, mise en place d'une variable d'environnement spécifique, particulièrement utilise pour CGI en fixant la variable d'environnement QIBM_CGI_LIBRARY_LIST.


sur le même mode, vous trouverez

<Files> </Files>              liste des directives liées à un fichier

<Location> </Location> liste des directives liées à une URL et non une localisation (avant réécriture, par ScriptAlias par ex.)


Exemples :

Pour des raisons de sécurité, on vous propose d'interdir par défaut tous
les répertoires, sauf le répertoire htdocs (contenant vos pages) :

DocumentRoot /www/apache1/htdocs

<Directory />
AllowOverride None
order deny,allow
deny from all
</Directory>
<Directory /www/apache1/htdocs> 
AllowOverride None
order allow,deny
allow from all
</Directory>

 

la production d'index dynamiques (liste des fichiers d'un répertoire)
est interdite, sauf pour htdocs/documentation/

Options none


<Directory /www/apache1/htdocs/documentation>
Options +indexes
order allow,deny
allow from all
</Directory>

 

l'exécution de scripts CGI n'est autorisée que dans /QSYS.LIB/WWWCGI.LIB

Options none

ScriptAlias /cgi-bin/   /QSYS.LIB/WWWCGI.LIB/


<Directory /QSYS.LIB/WWWCGI.LIB/>
Options +ExecCGI
order allow,deny
allow from all
setenv QIBM_CGI_LIBRARY_LIST "FORMATION;BDVIN;QGPL;QTEMP"
</Directory>


Protection de répertoires (authentification)

ProfileToken ON, pour autoriser les authentifications

Authname, founit le titre de la fenêtre d'authentification (on parle aussi de REALM )

Si vous protégez un répertoire avec une directive d'authentification et que le navigateur demande une autre page du même site avec le même realm, il ne doit pas redemander la saisie du mot de passe, mais envoyer celui qu'il a gardé en mémoire (jusqu'à la fermeture du navigateur).

Authtype basic, authentification basique (cryptage du mot de passe)

PasswdFile, où vérifier ?

%%SYSTEM%% : vérification réalisée avec la base des utilisateurs OS/400 (objets *USRPRF)

%%KERBEROS%% validation par une accrédition kerberos (Single SignOn)

bib/malvld
: vérification réalisée avec des utilisateurs enregistrés dans une liste de validation (CRTVLDL) et ajoutés soit par API, soit depuis l'administration graphique du serveur WEB (ils sont inconnus du monde 5250, par exemple)

UserId , profil à utiliser sur le 400 après authentification (un nom ou %%CLIENT%%)

Require, liste des utilisateurs ou des groupes autorisés à accèder à un répertoire.
"valid-user" signifie tout utilisateur préalablement authentifié

exemple : On doit s'authentifier avec un profil OS/400, le JOB bascule sous le profil saisi..

Alias /secret /www/apache1/htdocs/prive
<Directory /www/apache1/htdocs/prive>
AllowOverride None
order allow,deny
allow from all
ProfileToken ON
AuthName "identifiez vous"
Authtype basic
PasswdFile %%SYSTEM%%
UserID %%CLIENT%%
require valid-user
</Directory>

 

Pour une authentification automatique avec kerberos, voyez EIM et ajoutez :

<Directory /www/apachedft/htdocs>
  Order Allow,Deny
  Allow From all
  Require valid-user
  PasswdFile %%KERBEROS%%
  AuthType Kerberos
</Directory>

Vérifiez ensuite que vous autorisez bien l'authentificaiton Windows intégrée (ici IE8)


VirtualHost : hôtes virtuels.

Il s'agit ici, sur le même modèle que <directory> </directory>, de dédier des directives à un site WEB particulier .

ATTENTION, il faut que le client soit compatible HTTP1.1 pour transmettre l'URL et non l'adresse IP.
(Netscape 2.0 n'est pas compatible, MOSAIC non plus, mais ils sont dépassés)

imaginons que vous ayez à construire deux serveurs WEB (web1.societe.com et web2.societe.com)
mais en ne possédant qu'une seule adresse IP, par exemple 10.10.10.10.

vous écrivez

NameVirtualHost 10.10.10.10

<VirtualHost 10.10.10.10>
Servername web1.societe.com

  .../...(par exemple DocumentRoot /html/web1 )

</VirtualHost>

<VirtualHost 10.10.10.10>
Servername web2.societe.com

  .../...(par exemple DocumentRoot /html/web2 )

</VirtualHost>

tout ce qui se trouve dans le premier pavé n'est considéré que si l'URL demandée commence par http://web1.societe.com,
à l'identique pour le deuxième. Attention, toute demande portant sur un nom de serveur non reconnu, sera assimilé au premier serveur.

la plupart des directives peuvent être placées dans un hôte virtuel.

Directives spécifiques


ModeRewrite ON

il s'agit d'un module permettant de réécrire tout ou partie de l'URL en utilisant les métacaractères du monde Unix:

.    n'importe quel caractère.

*    n'importe quel nombre d'occurrences du motif précédent

a* : signifie n'importe quel nombre de fois "a" (0 compris)

.* : signifie n'importe quel nombre de n'importe quel caractère.

+    une occurrence ou plus du motif précédent

?    zéro ou une occurrence du motif précédent

|     reconnait soit le motif situé à gauche de | , soit celui situé à droite.

( )  sauvegarde le motif situé entre ( et ), il sera réutilisé dans la partie réécrite sous forme $1,$2, etc...(dans l'ordre rencontré)

^   si c'est en début de ligne

$    si c'est en fin de ligne

\     déspécialise le caractère suivant (ainsi \* , veut dire le caractère "*")

[ ]    un des caractères entre crochet, peut être noté [0123456789] ou bien [0-9] (identiques)

[^ ]  tout caractère SAUF ceux entre crochet (négation de la ligne précédente)

 

Les Directives suivantes acceptent le mode réécriture:

AliasMatch, ScriptAliasMatch, BrowserMatch, BrowserMatchNoCase,
Directorymatch, FIlesMatch, LocationMatch, Redirectmatch.

ainsi

ScriptAliasMatch   ^/cgi-bin/(.*)     /QSYS.LIB/MABIB.LIB/$1.PGM , remplace
www.monsite.com/cgi-bin/toto par /QSYS.LIB/MABIB.LIB/TOTO.PGM et exécute le pgm.

et

RedirectMatch  302   (.*)\.php$       http://autreserveur.com/php/$1.php, récrit l'url
www.monsite.com/toto.php en   http://autreserveur.com/php/toto.php et indique une redirection au navigateur.

 

enfin, RewriteRule (il faut RewriteEngine On), permet de réécrire l'URL AVANT son traitement par les autres directives.

Pour plus de détail sur les directives de configuration d'apache sur IBM i, voyez la liste des directives :
 http://publib.boulder.ibm.com/infocenter/iseries/v7r1m0/topic/rzas1/rzas1directivefinder.htm

sur le module de réécriture httpd.apache.org/docs-2.0/misc/rewriteguide.html et sur Apache en général


 

Pour PHP, le produit ZendCore installait une instance APACHE tournant sous PASE , pour y accèder il fallait jouter les lignes suivantes :

 

LoadModule proxy_module /QSYS.LIB/QHTTPSVR.LIB/QZSRCORE.SRVPGM        
LoadModule proxy_http_module /QSYS.LIB/QHTTPSVR.LIB/QZSRCORE.SRVPGM   
LoadModule proxy_connect_module /QSYS.LIB/QHTTPSVR.LIB/QZSRCORE.SRVPGM
LoadModule proxy_ftp_module /QSYS.LIB/QHTTPSVR.LIB/QZSRCORE.SRVPGM

puis, par exemple

ProxyPass /php http://localhost:8000/exemplesphp       
ProxyPassReverse /php http://localhost:8000/exemplesphp    

Qui demande à ce que chaque requête dont l'URL commence par php soit redirigée vers le port 8000, donc vers le serveur apache sous Pase, url exemplesphp

 

En 2010, pour le support de ZendServer, IBM implémente le standard FastCGI , plus simple, plus rapide et surtout ne necessiatnt plus un deuxième serveur apache.

Cette norme permet le pré-chargement d'un pgm (sur IBM i , PASE Uniquement) et le dialogue via sockets entre le serveur Apache et ce programme.

 

Vérifiez que vous avez les PTF suivantes (c'est intégré à la version 7)

 

puis, ajouter à votre serveur apache existant :

 

LoadModule zend_enabler_module /QSYS.LIB/QHTTPSVR.LIB/QZFAST.SRVPGM

puis


AddType  application/x-httpd-php   .php
AddHandler  fastcgi-script   .php

 

Dans le même temps vous devez créer un fichier fastcgi.conf dans le même répertoire que le fichier httpd.conf


contenant


Quelques commentaires

Server type="application/x-httpd-php" la chaîne doit être la même que pour la directive AddType du fichier httpd.conf
CommandLine="/usr/local/ZendSvr/bin/php-cgi.bin Coordonnées du PGM PASE à lancer
StartProcesses="1" Démarrer le pgm PASE à l'avance (1 = oui)
SetEnv="PHP_FCGI_CHILDREN=5 Nombre de travaux à démarrer
SetEnv="CCSID=819" CCSID des fichiers .php
SetEnv="LANG=fr_FR" Doit être le code langage de la langue primaire (2928 en France)
SetEnv="INSTALLATION_UID=20101216110903706188" recopiez la valeur de fastcgi.conf du répertoire /www/zendsvr/conf

 


Depuis les versions 7.1, 7.2 vous pouvez faire tourner le serveur Apache dans un sous-système séparé (et non QHTTPSVR)

pour cela

 

Top


Copyright © 1995,2015 VOLUBIS