web-dev-qa-db-fra.com

Apache 2.4: les liens symboliques vers le montage CIFS sont servis, mais ne sont pas vus par PHP ou mod_autoindex

J'essaie d'exécuter la galerie d'images/le DAM de Piwigo sur un Raspberry Pi via Arch Linux ARM avec Apache 2.4 et PHP7. Piwigo court heureusement. Pour une série de raisons sortant du cadre de cette question, mon objectif est de laisser les dizaines de milliers de fichiers image sur une machine Windows, de les partager via CIFS et de les lier de manière symétrique au répertoire FTP/synchronisation de Piwigo. Rapprocher des fichiers dans Piwigo est une pratique quotidienne recommandée par la documentation et les développeurs sur ses forums.

Mes fichiers sont montés avec des options qui les rendent propriétaires de l'utilisateur d'Apache. Tous les fichiers, y compris les liens symboliques dans le partage CIFS, sont correctement desservis par Apache si leurs URL sont saisies. Ce n'est pas un problème d'autorisations, ou du moins, ce n'est pas un problème simple. Le problème est que les liens symboliques dans le partage CIFS ne sont pas répertoriés ou synchronisés par PHP de Piwigo. Les liens symboliques vers le système de fichiers local sont synchronisés, puis cliquez sur OK. Bien que les autoindexes ne soient pas impliqués dans mon objectif, je pense que c'est un indice que les mêmes règles exactes s'appliquent aux index générés par mod_autoindex.

Mise en place d'un cas de test:

[alarm@alarmpi familytreetest]$ Sudo -u http -s
[http@alarmpi ~]$ mkdir /mnt/localfam
[http@alarmpi ~]$ cp /mnt/familytreetest/Bulk\ Uploads/1977\ Andrews/1977\ Andrews_1.jpg /mnt/localfam/
[http@alarmpi ~]$ ln -s /mnt/familytreetest/Bulk\ Uploads/1977\ Andrews/1977\ Andrews_1.jpg /srv/http/piwigo/galleries/family/CIFSlink.jpg
[http@alarmpi ~]$ ln -s /mnt/localfam/ /srv/http/piwigo/galleries/family/Locallink.jpg 
[http@alarmpi ~]$ cp /mnt/localfam/1977\ Andrews_1.jpg piwigo/galleries/family/1977_Andrews_1.jpg  

Le changement de nom lors de la copie du fichier dans Piwigo est intentionnel; Piwigo ne peut pas gérer les espaces dans cette fonction particulière.

Lors de l'enregistrement et de l'édition de toutes ces sorties, je n'ai pas réussi à penser aux chemins avec des espaces. Je viens de tester; Les liens symboliques vers les chemins du système de fichiers local qui incluent des espaces sont synchronisés par Piwigo et répertoriés par mod_autoindex. Je préférerais ne pas passer plus d'heures à refaire toutes les listes pour convaincre les gens sur cette question, mais si nécessaire.

[http@alarmpi ~]$ ls -l piwigo/galleries/family/
total 240
-rwxr-xr-x 1 http http 237934 Dec 23 17:43 1977_Andrews_1.jpg
lrwxrwxrwx 1 http http     64 Dec 23 17:28 CIFSlink.jpg -> /mnt/familytreetest/Bulk Uploads/1977 Andrews/1977 Andrews_1.jpg
lrwxrwxrwx 1 http http     32 Dec 23 17:42 Locallink.jpg -> /mnt/localfam/1977 Andrews_1.jpg

À ce stade, je lance l'outil de synchronisation de Piwigo. Je reçois deux images ajoutées à ma base de données. CIFSlink.jpg est omis. Si je tape maintenant l'une des URL de ces fichiers dans un navigateur quelconque, sur n'importe quel ordinateur de mon réseau, l'image s'affiche à l'écran.

[http@alarmpi ~]$ curl -I 192.168.0.100/piwigo/galleries/family/CIFSlink.jpg
HTTP/1.1 200 OK
Date: Sat, 23 Dec 2017 23:35:49 GMT
Server: Apache/2.4.25 (Unix) PHP/7.1.5
Last-Modified: Mon, 24 Jul 2017 18:00:52 GMT
ETag: "3a16e-55513feda1d00"
Accept-Ranges: bytes
Content-Length: 237934
Content-Type: image/jpeg

Je copie le répertoire de synchronisation dans DocumentRoot d'Apache (qui est également le répertoire de base de l'utilisateur http) afin que je puisse y accéder avec mod_autoindex.

[http@alarmpi ~]$ cp -r piwigo/galleries/family/ /srv/http/

Ici aussi, CIFSlink.jpg est exclu de la liste.

[http@alarmpi ~]$ curl 192.168.0.100/family/
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
 <head>
  <title>Index of /family</title>
 </head>
 <body>
<h1>Index of /family</h1>
  <table>
   <tr><th valign="top"><img src="/icons/blank.gif" alt="[ICO]"></th><th><a href="?C=N;O=D">Name</a></th><th><a href="?C=M;O=A">Last modified</a></th><th><a href="?C=S;O=A">Size</a></th><th><a href="?C=D;O=A">Description</a></th></tr>
   <tr><th colspan="5"><hr></th></tr>
<tr><td valign="top"><img src="/icons/back.gif" alt="[PARENTDIR]"></td><td><a href="/">Parent Directory</a>       </td><td>&nbsp;</td><td align="right">  - </td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/image2.gif" alt="[IMG]"></td><td><a href="1977_Andrews_1.jpg">1977_Andrews_1.jpg</a>     </td><td align="right">2017-12-23 18:49  </td><td align="right">232K</td><td>&nbsp;</td></tr>
<tr><td valign="top"><img src="/icons/image2.gif" alt="[IMG]"></td><td><a href="Locallink.jpg">Locallink.jpg</a>          </td><td align="right">2017-12-23 17:22  </td><td align="right">232K</td><td>&nbsp;</td></tr>
   <tr><th colspan="5"><hr></th></tr>
</table>
</body></html>

Ici aussi, le fichier est parfaitement accessible à Apache via son URL.

[http@alarmpi ~]$ curl -I 192.168.0.100/family/CIFSlink.jpg
HTTP/1.1 200 OK
Date: Sat, 23 Dec 2017 23:58:29 GMT
Server: Apache/2.4.25 (Unix) PHP/7.1.5
Last-Modified: Mon, 24 Jul 2017 18:00:52 GMT
ETag: "3a16e-55513feda1d00"
Accept-Ranges: bytes
Content-Length: 237934
Content-Type: image/jpeg

Les journaux des accès et des erreurs d'Apache ont été supprimés pour obtenir moins de 30 000 caractères. N'a rien montré qui semble pertinent.

EDIT: Si je monte le partage CIFS directement là où je mets les liens symboliques, les fichiers ne sont pas vus par l’application PHP, même s’ils ne contiennent pas de caractères non autorisés, mais sont inclus dans les index de mod_autoindex.

Mon httpd.conf, passé par awk pour supprimer les commentaires et les lignes vides:

[alarm@alarmpi familytreetest]$ Sudo awk '!/^ *#/ && NF' /etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd"
Listen 80
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_Host_module modules/mod_authz_Host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule include_module modules/mod_include.so
LoadModule filter_module modules/mod_filter.so
LoadModule mime_module modules/mod_mime.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule env_module modules/mod_env.so
LoadModule headers_module modules/mod_headers.so
LoadModule unique_id_module modules/mod_unique_id.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
<IfModule !mpm_prefork_module>
        #LoadModule cgid_module modules/mod_cgid.so
</IfModule>
<IfModule mpm_prefork_module>
        #LoadModule cgi_module modules/mod_cgi.so
</IfModule>
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
LoadModule php7_module modules/libphp7.so
<FilesMatch \.php$>
        SetHandler application/x-httpd-php
</FilesMatch>
<IfModule unixd_module>
User http
Group http
</IfModule>
ServerAdmin [email protected]
<Directory />
    AllowOverride none
    Require all denied
</Directory>
DocumentRoot "/srv/http"
<Directory "/srv/http">
    Options +Indexes +FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>
<Files ".ht*">
    Require all denied
</Files>
ErrorLog "/var/log/httpd/error_log"
LogLevel warn
<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
        LogFormat "%h %l %u %t \"%r\" %>s %b" common
    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
    CustomLog "/var/log/httpd/access_log" common
</IfModule>
<IfModule alias_module>
    ScriptAlias /cgi-bin/ "/srv/http/cgi-bin/"
</IfModule>
<IfModule cgid_module>
</IfModule>
<Directory "/srv/http/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>
<IfModule headers_module>
    RequestHeader unset Proxy early
</IfModule>
<IfModule mime_module>
    TypesConfig conf/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
</IfModule>
Include conf/extra/httpd-mpm.conf
Include conf/extra/httpd-multilang-errordoc.conf
Include conf/extra/httpd-autoindex.conf
Include conf/extra/httpd-languages.conf
Include conf/extra/httpd-userdir.conf
Include conf/extra/httpd-default.conf
Include conf/extra/phpmyadmin.conf
<IfModule proxy_html_module>
Include conf/extra/proxy-html.conf
</IfModule>
Include conf/extra/php7_module.conf
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>

Je n'ai pas changé de fichier httpd.conf depuis deux semaines et je l'ai redémarré une douzaine de fois pour vérifier que le serveur est à jour en ce qui concerne sa configuration.

J'avais mes autres fichiers de configuration Apache, mais ils m'ont mis plus de 30 000 caractères. Disponible sur demande en éditant d'autres éléments.

SELinux n'est pas officiellement pris en charge sur Arch Linux, sans parler de ALARM. Je ne suis pas passé par le processus ultra-poilu pour installer la version à moitié fonctionnelle que vous pouvez mettre. De toute façon, sa commande principale de diagnostic dit que ce n’est pas là et ne peut pas tout gâcher.

[alarm@alarmpi ~]$ sestatus
-bash: sestatus: command not found

La dernière chose à laquelle je peux penser est de vous lancer une strace d'Apache essayant d'analyser ces fichiers. Tout d'abord, le travailleur de Piwigo effectue une synchronisation. Il est censé voir les fichiers aux lignes 57 à 61 et aux lignes 81 à 84. Je remarque que dans le premier bloc, il scanne les deux premiers fichiers, puis appuie à nouveau sur le répertoire, puis sur CIFSlink. Dans le deuxième bloc, il est potentiellement intéressant que CIFSlink et seulement CIFSlink soit touché deux fois. Tout retourne toujours le statut 0, cependant. Je suis revenu en arrière et j'ai confirmé que l'action finale sur les fichiers à 158-166 se produisait même si je n'exécutais aucune action, mais une synchronisation avant. Ctrl+C terminer Apache. Ce seul appel de readlink () en 162 reste le seul appel même si deux liens symboliques locaux ont été synchronisés avec succès.

[alarm@alarmpi ~]$ nl phpstrace.txt | less
(snip)
    43  20559 send(10, "E\0\0\0\3\nSELECT IF(MAX(id)+1 IS NUL"..., 73, MSG_DONTWAIT) = 73
    44  20559 poll([{fd=10, events=POLLIN|POLLERR|POLLHUP}], 1, 1471228928) = 1 ([{fd=10, revents=POLLIN}])
    45  20559 recv(10, "\1\0\0\1\0019\0\0\2\3def\0\0\0#IF(MAX(id)+1 IS"..., 1479, MSG_DONTWAIT) = 90
    46  20559 gettimeofday({tv_sec=1514078472, tv_usec=648129}, NULL) = 0
    47  20559 stat64("./galleries", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    48  20559 open("./galleries", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 11
    49  20559 fstat64(11, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    50  20559 getdents(11, /* 4 entries */, 32768) = 76
    51  20559 stat64("./galleries/.", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    52  20559 stat64("./galleries/..", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    53  20559 stat64("./galleries/family", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    54  20559 open("./galleries/family", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 12
    55  20559 fstat64(12, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    56  20559 getdents(12, /* 5 entries */, 32768) = 116
    57  20559 stat64("./galleries/family/1977_Andrews_1.jpg", {st_mode=S_IFREG|0755, st_size=237934, ...}) = 0
    58  20559 stat64("./galleries/family/Locallink.jpg", {st_mode=S_IFREG|0755, st_size=237934, ...}) = 0
    59  20559 stat64("./galleries/family/.", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    60  20559 stat64("./galleries/family/CIFSlink.jpg", {st_mode=S_IFREG|0755, st_size=237934, ...}) = 0
    61  20559 stat64("./galleries/family/..", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    62  20559 getdents(12, /* 0 entries */, 32768) = 0
    63  20559 close(12)                         = 0
    64  20559 stat64("./galleries/index.php", {st_mode=S_IFREG|0644, st_size=1765, ...}) = 0
    65  20559 getdents(11, /* 0 entries */, 32768) = 0
    66  20559 close(11)                         = 0
    67  20559 gettimeofday({tv_sec=1514078472, tv_usec=671461}, NULL) = 0
    68  20559 gettimeofday({tv_sec=1514078472, tv_usec=672515}, NULL) = 0
    69  20559 stat64("./galleries", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    70  20559 open("./galleries", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 11
    71  20559 fstat64(11, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    72  20559 getdents(11, /* 4 entries */, 32768) = 76
    73  20559 stat64("./galleries/family", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    74  20559 stat64("./galleries/index.php", {st_mode=S_IFREG|0644, st_size=1765, ...}) = 0
    75  20559 getdents(11, /* 0 entries */, 32768) = 0
    76  20559 close(11)                         = 0
    77  20559 stat64("./galleries/family", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    78  20559 open("./galleries/family", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 11
    79  20559 fstat64(11, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    80  20559 getdents(11, /* 5 entries */, 32768) = 116
    81  20559 stat64("./galleries/family/1977_Andrews_1.jpg", {st_mode=S_IFREG|0755, st_size=237934, ...}) = 0
    82  20559 stat64("./galleries/family/Locallink.jpg", {st_mode=S_IFREG|0755, st_size=237934, ...}) = 0
    83  20559 stat64("./galleries/family/CIFSlink.jpg", {st_mode=S_IFREG|0755, st_size=237934, ...}) = 0
    84  20559 stat64("./galleries/family/CIFSlink.jpg", {st_mode=S_IFREG|0755, st_size=237934, ...}) = 0
    85  20559 getdents(11, /* 0 entries */, 32768) = 0
    86  20559 close(11)                         = 0
    87  20559 gettimeofday({tv_sec=1514078472, tv_usec=685288}, NULL) = 0
    88  20559 gettimeofday({tv_sec=1514078472, tv_usec=686100}, NULL) = 0
    89  20559 send(10, "I\0\0\0\3\nSELECT id, path\n  FROM piw"..., 77, MSG_DONTWAIT) = 77
    90  20559 poll([{fd=10, events=POLLIN|POLLERR|POLLHUP}], 1, 1471228928) = 1 ([{fd=10, revents=POLLIN}])
    91  20559 recv(10, "\1\0\0\1\2=\0\0\2\3def\tpiwigopix\rpiwigo_i"..., 1389, MSG_DONTWAIT) = 240
    92  20559 gettimeofday({tv_sec=1514078472, tv_usec=691698}, NULL) = 0
    93  20559 gettimeofday({tv_sec=1514078472, tv_usec=692510}, NULL) = 0
    94  20559 send(10, "A\0\0\0\3\nSELECT IF(MAX(id)+1 IS NUL"..., 69, MSG_DONTWAIT) = 69
    95  20559 poll([{fd=10, events=POLLIN|POLLERR|POLLHUP}], 1, 1471228928) = 1 ([{fd=10, revents=POLLIN}])
    96  20559 recv(10, "\1\0\0\1\0019\0\0\2\3def\0\0\0#IF(MAX(id)+1 IS"..., 1149, MSG_DONTWAIT) = 90
    97  20559 gettimeofday({tv_sec=1514078472, tv_usec=697001}, NULL) = 0
    98  20559 gettimeofday({tv_sec=1514078472, tv_usec=697784}, NULL) = 0
    99  20559 gettimeofday({tv_sec=1514078472, tv_usec=698459}, NULL) = 0
   100  20559 gettimeofday({tv_sec=1514078472, tv_usec=699212}, NULL) = 0
   101  20559 gettimeofday({tv_sec=1514078472, tv_usec=699768}, NULL) = 0
   102  20559 send(10, "\314\0\0\0\3\nSELECT DISTINCT c.id\n  FRO"..., 208, MSG_DONTWAIT) = 208
   103  20559 poll([{fd=10, events=POLLIN|POLLERR|POLLHUP}], 1, 1471228928) = 1 ([{fd=10, revents=POLLIN}])
   104  20559 recv(10, "\1\0\0\1\0015\0\0\2\3def\tpiwigopix\1c\21piwigo"..., 1059, MSG_DONTWAIT) = 80
   105  20559 gettimeofday({tv_sec=1514078472, tv_usec=706517}, NULL) = 0
   106  20559 gettimeofday({tv_sec=1514078472, tv_usec=707219}, NULL) = 0
   107  20559 send(10, "\236\0\0\0\3\nSELECT DISTINCT id\n  FROM "..., 162, MSG_DONTWAIT) = 162
   108  20559 poll([{fd=10, events=POLLIN|POLLERR|POLLHUP}], 1, 1471228928) = 1 ([{fd=10, revents=POLLIN}])
   109  20559 recv(10, "\1\0\0\1\1E\0\0\2\3def\tpiwigopix\21piwigo_c"..., 979, MSG_DONTWAIT) = 96
   110  20559 gettimeofday({tv_sec=1514078472, tv_usec=713776}, NULL) = 0
   111  20559 gettimeofday({tv_sec=1514078472, tv_usec=714489}, NULL) = 0
   112  20559 gettimeofday({tv_sec=1514078472, tv_usec=715212}, NULL) = 0
   113  20559 gettimeofday({tv_sec=1514078472, tv_usec=715798}, NULL) = 0
   114  20559 send(10, "p\0\0\0\3\nSELECT id, id_uppercat, up"..., 116, MSG_DONTWAIT) = 116
   115  20559 poll([{fd=10, events=POLLIN|POLLERR|POLLHUP}], 1, 1471228928) = 1 ([{fd=10, revents=POLLIN}])
   116  20559 recv(10, "\1\0\0\1\5E\0\0\2\3def\tpiwigopix\21piwigo_c"..., 883, MSG_DONTWAIT) = 468
   117  20559 gettimeofday({tv_sec=1514078472, tv_usec=721655}, NULL) = 0
   118  20559 gettimeofday({tv_sec=1514078472, tv_usec=723454}, NULL) = 0
   119  20559 gettimeofday({tv_sec=1514078472, tv_usec=724212}, NULL) = 0
   120  20559 gettimeofday({tv_sec=1514078472, tv_usec=724792}, NULL) = 0
   121  20559 send(10, "R\0\0\0\3\nSELECT id\n  FROM piwigo_ca"..., 86, MSG_DONTWAIT) = 86
   122  20559 poll([{fd=10, events=POLLIN|POLLERR|POLLHUP}], 1, 1471228928) = 1 ([{fd=10, revents=POLLIN}])
   123  20559 recv(10, "\1\0\0\1\1E\0\0\2\3def\tpiwigopix\21piwigo_c"..., 415, MSG_DONTWAIT) = 102
   124  20559 gettimeofday({tv_sec=1514078472, tv_usec=730105}, NULL) = 0
   125  20559 gettimeofday({tv_sec=1514078472, tv_usec=730977}, NULL) = 0
   126  20559 send(10, "_\0\0\0\3\nSELECT id, path, represent"..., 99, MSG_DONTWAIT) = 99
   127  20559 poll([{fd=10, events=POLLIN|POLLERR|POLLHUP}], 1, 1471228928) = 1 ([{fd=10, revents=POLLIN}])
   128  20559 recv(10, "\1\0\0\1\3=\0\0\2\3def\tpiwigopix\rpiwigo_i"..., 313, MSG_DONTWAIT) = 313
   129  20559 poll([{fd=10, events=POLLIN|POLLERR|POLLHUP}], 1, 1471228928) = 1 ([{fd=10, revents=POLLIN}])
   130  20559 recv(10, "77_Andrews_1.jpg\373\5\0\0\10\376\0\0\2\0", 2500, MSG_DONTWAIT) = 26
   131  20559 gettimeofday({tv_sec=1514078472, tv_usec=737467}, NULL) = 0
   132  20559 gettimeofday({tv_sec=1514078472, tv_usec=738418}, NULL) = 0
   133  20559 gettimeofday({tv_sec=1514078472, tv_usec=739147}, NULL) = 0
   134  20559 gettimeofday({tv_sec=1514078472, tv_usec=740066}, NULL) = 0
   135  20559 send(10, "G\0\0\0\3\nUPDATE piwigo_images\n  SET"..., 75, MSG_DONTWAIT) = 75
   136  20559 poll([{fd=10, events=POLLIN|POLLERR|POLLHUP}], 1, 1471228928) = 1 ([{fd=10, revents=POLLIN}])
   137  20559 recv(10, "0\0\0\1\0\0\0\2\0\0\0(Rows matched: 1  Cha"..., 2474, MSG_DONTWAIT) = 52
   138  20559 gettimeofday({tv_sec=1514078472, tv_usec=745234}, NULL) = 0
   139  20559 gettimeofday({tv_sec=1514078472, tv_usec=746016}, NULL) = 0
   140  20559 send(10, "G\0\0\0\3\nUPDATE piwigo_images\n  SET"..., 75, MSG_DONTWAIT) = 75
   141  20559 poll([{fd=10, events=POLLIN|POLLERR|POLLHUP}], 1, 1471228928) = 1 ([{fd=10, revents=POLLIN}])
   142  20559 recv(10, "0\0\0\1\0\0\0\2\0\0\0(Rows matched: 1  Cha"..., 2422, MSG_DONTWAIT) = 52
   143  20559 gettimeofday({tv_sec=1514078472, tv_usec=750938}, NULL) = 0
   144  20559 gettimeofday({tv_sec=1514078472, tv_usec=751526}, NULL) = 0
   145  20559 gettimeofday({tv_sec=1514078472, tv_usec=752395}, NULL) = 0
   146  20559 gettimeofday({tv_sec=1514078472, tv_usec=752957}, NULL) = 0
   147  20559 send(10, "R\0\0\0\3\nSELECT id\n  FROM piwigo_ca"..., 86, MSG_DONTWAIT) = 86
   148  20559 poll([{fd=10, events=POLLIN|POLLERR|POLLHUP}], 1, 1471228928) = 1 ([{fd=10, revents=POLLIN}])
   149  20559 recv(10, "\1\0\0\1\1E\0\0\2\3def\tpiwigopix\21piwigo_c"..., 2370, MSG_DONTWAIT) = 102
   150  20559 gettimeofday({tv_sec=1514078472, tv_usec=758239}, NULL) = 0
   151  20559 gettimeofday({tv_sec=1514078472, tv_usec=758945}, NULL) = 0
   152  20559 send(10, "\205\0\0\0\3\nSELECT id, path, represent"..., 137, MSG_DONTWAIT) = 137
   153  20559 poll([{fd=10, events=POLLIN|POLLERR|POLLHUP}], 1, 1471228928) = 1 ([{fd=10, revents=POLLIN}])
   154  20559 recv(10, "\1\0\0\1\3=\0\0\2\3def\tpiwigopix\rpiwigo_i"..., 2268, MSG_DONTWAIT) = 339
   155  20559 gettimeofday({tv_sec=1514078472, tv_usec=764752}, NULL) = 0
   156  20559 gettimeofday({tv_sec=1514078472, tv_usec=765603}, NULL) = 0
   157  20559 gettimeofday({tv_sec=1514078472, tv_usec=766339}, NULL) = 0
   158  20559 stat64("././galleries/family/Locallink.jpg", {st_mode=S_IFREG|0755, st_size=237934, ...}) = 0
   159  20559 getcwd("/srv/http/piwigo", 4096)  = 17
   160  20559 gettimeofday({tv_sec=1514078472, tv_usec=768178}, NULL) = 0
   161  20559 lstat64("/srv/http/piwigo/././galleries/family/Locallink.jpg", {st_mode=S_IFLNK|0777, st_size=32, ...}) = 0
   162  20559 readlink("/srv/http/piwigo/././galleries/family/Locallink.jpg", "/mnt/localfam/1977 Andrews_1.jpg", 4096) = 32
   163  20559 lstat64("/mnt/localfam/1977 Andrews_1.jpg", {st_mode=S_IFREG|0755, st_size=237934, ...}) = 0
   164  20559 lstat64("/mnt/localfam", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
   165  20559 lstat64("/mnt", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
   166  20559 open("/mnt/localfam/1977 Andrews_1.jpg", O_RDONLY) = 11
   167  20559 fstat64(11, {st_mode=S_IFREG|0755, st_size=237934, ...}) = 0
   168  20559 _llseek(11, 0, [0], SEEK_CUR)     = 0
   169  20559 read(11, "\377\330\377\340\0\20JFIF\0\1\1\0\0\1\0\1\0\0\377\333\0C\0\r\t\n\v\n\10\r"..., 8192) = 8192
   170  20559 close(11)                         = 0

Et enfin, la strace de mod_autoindex indexant un répertoire sans inclure CIFSlink. Numérisation de fichier à 43-48. Une fois encore, les fichiers retenus sont analysés, puis le point unique, puis CIFSlink, mais une fois encore, il semble être analysé à la fin.

[alarm@alarmpi ~]$ nl indexstrace.txt | less
     1  20536 _newselect(0, NULL, NULL, NULL, {tv_sec=1, tv_usec=0}) = 0 (Timeout)
     2  20536 wait4(-1, 0x7ecec9f0, WNOHANG|WSTOPPED, NULL) = 0
     3  20536 _newselect(0, NULL, NULL, NULL, {tv_sec=1, tv_usec=0} <unfinished ...>
     4  20558 <... accept4 resumed> {sa_family=AF_INET6, sin6_port=htons(10914), inet_pton(AF_INET6, "::ffff:192.168.0.107", &sin6_addr), sin6_flowinfo=htonl(0), sin6_scope_id=0}, [128->28], SOCK_CLOEXEC) = 9
     5  20558 getsockname(9, {sa_family=AF_INET6, sin6_port=htons(80), inet_pton(AF_INET6, "::ffff:192.168.0.100", &sin6_addr), sin6_flowinfo=htonl(0), sin6_scope_id=0}, [128->28]) = 0
     6  20558 fcntl64(9, F_GETFL)               = 0x2 (flags O_RDWR)
     7  20558 fcntl64(9, F_SETFL, O_RDWR|O_NONBLOCK) = 0
     8  20558 gettimeofday({tv_sec=1514078503, tv_usec=263541}, NULL) = 0
     9  20558 read(9, "GET /family/ HTTP/1.1\r\nHost: 192"..., 8000) = 287
    10  20558 gettimeofday({tv_sec=1514078503, tv_usec=264926}, NULL) = 0
    11  20558 gettimeofday({tv_sec=1514078503, tv_usec=265863}, NULL) = 0
    12  20558 gettimeofday({tv_sec=1514078503, tv_usec=266380}, NULL) = 0
    13  20558 gettimeofday({tv_sec=1514078503, tv_usec=266905}, NULL) = 0
    14  20558 gettimeofday({tv_sec=1514078503, tv_usec=267410}, NULL) = 0
    15  20558 gettimeofday({tv_sec=1514078503, tv_usec=267897}, NULL) = 0
    16  20558 gettimeofday({tv_sec=1514078503, tv_usec=268395}, NULL) = 0
    17  20558 gettimeofday({tv_sec=1514078503, tv_usec=268985}, NULL) = 0
    18  20558 gettimeofday({tv_sec=1514078503, tv_usec=269744}, NULL) = 0
    19  20558 stat64("/srv/http/family/", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    20  20558 stat64("/srv/http/family/index.html", 0x7ecec600) = -1 ENOENT (No such file or directory)
    21  20558 lstat64("/srv", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    22  20558 lstat64("/srv/http", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    23  20558 lstat64("/srv/http/family", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    24  20558 lstat64("/srv/http/family/index.html", 0x7ecec600) = -1 ENOENT (No such file or directory)
    25  20558 stat64("/srv/http/family/index.php", 0x7ecec600) = -1 ENOENT (No such file or directory)
    26  20558 lstat64("/srv", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    27  20558 lstat64("/srv/http", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    28  20558 lstat64("/srv/http/family", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    29  20558 lstat64("/srv/http/family/index.php", 0x7ecec600) = -1 ENOENT (No such file or directory)
    30  20558 stat64("/srv/http/family/index.html", 0x7ecec600) = -1 ENOENT (No such file or directory)
    31  20558 lstat64("/srv", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    32  20558 lstat64("/srv/http", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    33  20558 lstat64("/srv/http/family", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    34  20558 lstat64("/srv/http/family/index.html", 0x7ecec600) = -1 ENOENT (No such file or directory)
    35  20558 open("/srv/http/family/", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 10
    36  20558 fstat64(10, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    37  20558 stat64("/srv/http/family/HEADER.html", 0x7ecec4a0) = -1 ENOENT (No such file or directory)
    38  20558 lstat64("/srv", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    39  20558 lstat64("/srv/http", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    40  20558 lstat64("/srv/http/family", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    41  20558 lstat64("/srv/http/family/HEADER.html", 0x7ecec4a0) = -1 ENOENT (No such file or directory)
    42  20558 getdents64(10, /* 5 entries */, 32768) = 160
    43  20558 lstat64("/srv/http/family/1977_Andrews_1.jpg", {st_mode=S_IFREG|0755, st_size=237934, ...}) = 0
    44  20558 lstat64("/srv/http/family/Locallink.jpg", {st_mode=S_IFLNK|0777, st_size=32, ...}) = 0
    45  20558 stat64("/srv/http/family/Locallink.jpg", {st_mode=S_IFREG|0755, st_size=237934, ...}) = 0
    46  20558 lstat64("/srv/http/family/.", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    47  20558 lstat64("/srv/http/family/CIFSlink.jpg", {st_mode=S_IFLNK|0777, st_size=64, ...}) = 0
    48  20558 stat64("/srv/http/family/CIFSlink.jpg", {st_mode=S_IFREG|0755, st_size=237934, ...}) = 0
    49  20558 lstat64("/srv/http/family/..", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    50  20558 getdents64(10, /* 0 entries */, 32768) = 0
    51  20558 close(10)                         = 0
    52  20558 stat64("/srv/http/family/README.html", 0x7ecec4a0) = -1 ENOENT (No such file or directory)
    53  20558 lstat64("/srv", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    54  20558 lstat64("/srv/http", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    55  20558 lstat64("/srv/http/family", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    56  20558 lstat64("/srv/http/family/README.html", 0x7ecec4a0) = -1 ENOENT (No such file or directory)
    57  20558 gettimeofday({tv_sec=1514078503, tv_usec=311917}, NULL) = 0
    58  20558 read(9, 0x3c9f60, 8000)           = -1 EAGAIN (Resource temporarily unavailable)
    59  20558 gettimeofday({tv_sec=1514078503, tv_usec=312941}, NULL) = 0
    60  20558 writev(9, [{iov_base="HTTP/1.1 200 OK\r\nDate: Sun, 24 D"..., iov_len=218}, {iov_base="<!DOCTYPE HTML PUBLIC \"-//W3C//D"..., iov_len=1112}], 2) = 1330
    61  20558 write(7, "192.168.0.107 - - [23/Dec/2017:2"..., 80) = 80
    62  20558 times({tms_utime=0, tms_stime=4, tms_cutime=0, tms_cstime=0}) = 953790583
    63  20558 gettimeofday({tv_sec=1514078503, tv_usec=316096}, NULL) = 0
    64  20558 poll([{fd=9, events=POLLIN}], 1, 5000 <unfinished ...>

La seule pensée vague qui me reste est que peut-être un délai d’attente a-t-il lieu en quelques millisecondes pour obtenir des informations sur le partage CIFS, mais il semble qu'Apache, de tous les serveurs, devrait être assez tolérant vis-à-vis de la latence. Je ne pense pas que cela ait une chance réelle d’être la solution et, en tout cas, je ne sais pas comment le tester.

1
Hypocee ee

Dans un mot, -noserverino. D'après mes modifications initiales, l'angle des liens symboliques était un hareng rouge, tout comme l'était le SMB/CIFS. Il s’avère que les machines Windows génèrent des nombres d’inodes supérieurs à 32 bits, que les autres programmes peuvent gérer mais que PHP ne peut pas. -noseverino dans la commande de montage indique au système de générer des numéros d'inode virtuels inférieurs à 32 bits. PHP fonctionne comme prévu par la suite.

1
Hypocee ee