Reverse Proxy Nginx : 2 sites HTTPS

Bonjour,

J’ai un Raspberry PI (qui a dit : comme tout le monde ??) avec donc nginx 1.2.1 sous Raspbian.

Je me suis fait un site DokuWiki en HTTPS, ce qui est relativement simple (j’avais utilisé IP_PUBLIQUE pour y accéder de l’extérieur jusqu’à présent).

J’ai un second site web à héberger sur ce même serveur, l’idée étant que si je tape sur le NET https://site1.no-ip ou https://site2.no-ip, cela me renvoie vers l’un ou l’autre site.

Mes fichiers de site dans /etc/nginx/sites-available/ sont similaires, mis à part le server_name qui correspond bien évidemment à la redirection NO-IP effectuée. Pour mes deux sites, la configuration est la suivante :

[code]server {
listen 443;
server_name site1.no-ip.info;

    server_name_in_redirect off;

    ssl_certificate /etc/nginx/certs/moncertif.crt;
    ssl_certificate_key /etc/nginx/certs/macle.key;

    # Path to the root of your installation
    root /var/www/site1[/code]

Puis voici mon nginx.conf :


user www-data;
worker_processes 1;

pid /var/run/nginx.pid;

events {
        # 1024 is a decent starting point
        # You can increase it further, but you should check "ulimit -n" before
        # adjusting higher
        worker_connections 1024;
}





http {

        sendfile on;
        tcp_nodelay on;

        # This might be better set to on for some, off for some
        # for me however, I saw no difference between having it enabled or disabled
        tcp_nopush on;

        # How long to wait for new request from the same connection
        keepalive_timeout 180;

        server_tokens off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        # Logging
        error_log /var/log/nginx/error.log;

        # Gzip Settings
        gzip on;

        gzip_disable "msie6";
        gzip_disable "Wget";

        # Make sure any third-party proxies cache things properly
        gzip_vary on;

        # Compress regardless of caching headers
        gzip_proxied any;

        # Compress as much as possible
        gzip_comp_level 6;

        # File types to Gzip compress, it works best for plain text files
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        proxy_cache_path /var/cache/nginx levels=2:2:2 keys_zone=STATIC:100m inactive=24h max_size=100m;

        # Include Folders
        map_hash_bucket_size 64;
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

Enfin, dans /etc/nginx/conf.d/proxy.conf :

#proxy_redirect          off;
proxy_set_header        Host $host;

proxy_set_header        X-Real-IP $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header        Accept "";
proxy_set_header        Connection "";

proxy_cache             STATIC;

# Cache 200 (OK), as well as 301 and 302 (redirect) responses for 4h
proxy_cache_valid       200 301 302 4h;

# Cache 404 (Not found) responses for only 10m, just in case of human errors
proxy_cache_valid               404 10m;

# Allow using stale data (cached data that has expired) in the following cases:
# - an error has occurred while connecting to the server, sending a request to it, or reading its response
# - timeout occurred during the connection with the server, transfer the request or while reading response from the server
# - server returned a empty or incorrect answer
# - server returned an error status (500, 502-504)
proxy_cache_use_stale   error timeout invalid_header updating http_500 http_502 http_503 http_504;

Mes sites me renvoient tous deux dans Firefox : “Echec de la connexion sécurisé. ssl_error_rx_record_too_long”

J’ai pensé que comme j’utilisais le même certificat pour les deux configurations de sites, cela pouvait faire conflit… J’ai cru voir du chainage de certificat sur Google, mais j’ai pas vraiment compris… Je précise que mon certificat fonctionne lorsqu’un seul site est à héberger (sans Reverse Proxy).

Une idée ?

Merci :wink:

Bon, sorry… forcément si je dis pas d’utiliser SSL dans la conf de site, ça ne peut pas fonctionner…

server { listen 443 ssl;

Plus d’erreur SSL, mais maintenant lorsque j’accepte le certificat dans Firefox, j’ai une erreur sur page blanche :

500 : Internal Server Error

J’ai un message d’erreur dans /var/log/nginx/error.log :

J’ai essayé de modifier un peu une directive de mon fichier de VirtualHost, mais sans succès.
Je vais continuer à chercher un peu, je posterais mes astuces si j’y arrive.

Bon, je galère toujours …

Je vais poster ma conf de site complète, peut-être que cela aidera plus, car il y a un truc que j’ai pas saisi.

[code]server {
listen 443;
ssl on;
server_name site1.no-ip.info;

    server_name_in_redirect off;

    ssl_certificate /etc/nginx/certs/moncertif.crt;
    ssl_certificate_key /etc/nginx/certs/macle.key;

    # Path to the root of your installation
    root /var/www/site1;

    client_max_body_size 10G; # set max upload size
    fastcgi_buffers 64 4K;

    # rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
    # rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
    # rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;

    index doku.php;
    error_page 403 = /core/templates/403.php;
    error_page 404 = /core/templates/404.php;

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

    location ~ ^/(data|config|\.ht|db_structure\.xml|README) {
            deny all;
    }

    location / {
            # The following 2 rules are only needed with webfinger
            rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
            rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

            rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
            rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;

            rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;
            # try_files $uri;
            # try_files $uri $uri/ index.php;
            proxy_pass https://127.0.0.1;
            include /etc/nginx/conf.d/*;
            proxy_redirect default;

    }

    location ~ ^(.+?\.php)(/.*)?$ {
            try_files $1 = 404;

            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$1;
            fastcgi_param PATH_INFO $2;
            fastcgi_param HTTPS on;
            fastcgi_pass unix:/var/run/php5-fpm.sock;

            # fastcgi_pass 127.0.0.1:9000;
            # Or use unix-socket with 'fastcgi_pass unix:/var/run/php5-fpm.sock;'
    }

    # Optional: set long EXPIRES header on static assets
    location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
            expires 30d;
            # Optional: Don't log access to assets
            access_log off;
    }

}
[/code]

Je ne sais pas si la ligne proxy_pass 127.0.0.1 est correcte. Mon port 443 est évidemment ouvert, donc ça devrait aller, mais est-ce que le fait d’avoir les sites sur le même port est normal, en reverse proxy ???

Dans la configuration actuelle, si tout semble bon, j’obtiens quand même toujours une erreur 500, avec maintenant dans /var/log/nginx/error.log :

Bon, j’ai posté pour rien, j’avais besoin de parler un peu avec moi-même pour y arriver…

Enfin le principal c’est que maintenant ça marche :smiley:

En fait, les directives suivantes dans mes fichiers de sites ne servent que pour du load balancing (afin de renvoyer les requêtes clientes sur l’IP ou le port spécifique d’un site, si j’ai bien compris. Mais mon site et mon reverse proxy étant sur la même machine, donc une seule IP et mes 2 sites sur le même port, pas besoin dans mon cas).

Je les ait donc commentées et ça a fonctionné.

proxy_pass https://127.0.0.1; proxy_redirect default;

Je tombe maintenant bien sur site1 ou site2, selon le nom de domaine que je tape, et toujours en HTTPS !

Bonne journée :wink: