Search code examples
phpnginxhaproxy

Nginx together with haproxy does not point the root index.php file


I have 1 local haproxy server (10.10.1.18) that is used for loadbalance 2 nginx local webservers (web1=10.10.1.21,web2=10.10.1.22).

I can reach local ips of web servers to the index.php file successfully like that http://10.10.1.21/ and http://10.10.1.22/

However, when I point local ip of haproxy http://10.10.1.18/, it only brings the index.html file instead of index.php file. We also have a domainname that points the public ip to the haproxy but http://example.uni.edu brings again the index.html file and not index.php file

So I don't think it's about public vs local ip but rather haproxy or nginx configuration

/etc/haproxy/haproxy.cfg


    #---------------------------------------------------------------------
    # Example configuration for a possible web application.  See the
    # full configuration options online.
    #
    #   http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
    #
    #---------------------------------------------------------------------

    #---------------------------------------------------------------------
    # Global settings
    #---------------------------------------------------------------------
    global
        # to have these messages end up in /var/log/haproxy.log you will
        # need to:
        #
        # 1) configure syslog to accept network log events.  This is done
        #    by adding the '-r' option to the SYSLOGD_OPTIONS in
        #    /etc/sysconfig/syslog
        #
        # 2) configure local2 events to go to the /var/log/haproxy.log
        #   file. A line like the following can be added to
        #   /etc/sysconfig/syslog
        #
        #    local2.*                       /var/log/haproxy.log
        #
        log         127.0.0.1 local2

        chroot      /var/lib/haproxy
        pidfile     /var/run/haproxy.pid
        maxconn     10000
        user        haproxy
        group       haproxy
        daemon

        # turn on stats unix socket
        stats socket /var/lib/haproxy/stats

    #---------------------------------------------------------------------
    # common defaults that all the 'listen' and 'backend' sections will
    #use if not designated in their block
    #---------------------------------------------------------------------
    defaults
        mode                    http
        log                     global
        option                  httplog
        option                  dontlognull
        option http-server-close
        option forwardfor       except 127.0.0.0/8
        option                  redispatch
        retries                 3
        timeout http-request    10s
        timeout queue           1m
        timeout connect         10s
        timeout client          1m
        timeout server          1m
        timeout http-keep-alive 10s
        timeout check           10s
        maxconn                 10000


    #---------------------------------------------------------------------
    #HAProxy statistics backend
    #---------------------------------------------------------------------
    listen haproxy3-monitoring *:80
      mode    http
      option forwardfor except 127.0.0.1
      option httpclose
      stats   enable
      stats   show-legends
      stats   refresh           5s
      stats   uri               /stats
      stats   realm             Haproxy\ Statistics
      stats   auth              username:password
      stats   admin             if TRUE

    #---------------------------------------------------------------------
    # main frontend which proxys to the backends
    #---------------------------------------------------------------------
    frontend main
            bind *:80
            default_backend webapp-main

    # round robin balancing between the various backends
    #---------------------------------------------------------------------
    backend webapp-main
            balance roundrobin
            option httpchk HEAD / HTTP/1.1\r\nHost:\ example.uni.edu
            server  web1 10.10.1.21:80 check
            server  web2 10.10.1.22:80 check

web1 nginx - /etc/nginx/conf.d/default.conf


    server {
        listen       80;
        server_name  10.10.1.21;


        # note that these lines are originally from the "location /" block
        root   /usr/share/nginx/html;
        index index.php index.html index.htm;

        location / {
            try_files $uri $uri/  =404;


        }
        error_page 404 /404.html;
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root /usr/share/nginx/html;
        }


        location ~ [^/]\.php(/|$) {
            fastcgi_split_path_info  ^(.+\.php)(/.+)$;
            fastcgi_index   index.php;
            fastcgi_pass    unix:/var/run/php-fpm/php-fpm.sock;
            include         fastcgi_params;
            fastcgi_param   PATH_INFO       $fastcgi_path_info;
            fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }   

        location /dataroot/ {
            internal;
            alias /var/moodledata/; # ensure the path ends with /
        }

        location /cachedir/ {
            internal;
            alias /var/moodledata/cache/; # ensure the path ends with /
        }


        location /localcachedir/ {
            internal;
            alias /var/moodledata/localcache/; # ensure the path ends with /
        }

        location /tempdir/ {
            internal;
            alias /var/moodledata/temp/; # ensure the path ends with /
        }

        location /filedir/ {
            internal;
            alias /var/moodledata/filedir/; # ensure the path ends with /
        }

    }

web2 has the same configs as web1 along with its own local ip.

When I point directly the index.php http://10.10.1.18/index.php it downloads the index.php file and gives

503 Service Unavailable

Anybody has similar experience issues like this?


Solution

  • Finally it worked out, please follow these steps:

    • do not use config files under /etc/nginx/conf.d/ only use 1 config file /etc/nginx/nginx.conf like this
    
    
    
         # For more information on configuration, see:
            #   * Official English Documentation: http://nginx.org/en/docs/
            #   * Official Russian Documentation: http://nginx.org/ru/docs/
    
            user nginx;
            worker_processes auto;
            error_log /var/log/nginx/error.log;
            pid /run/nginx.pid;
    
            events {
                worker_connections 8192;
            }
    
            http {
                log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                                  '$status $body_bytes_sent "$http_referer" '
                                  '"$http_user_agent" "$http_x_forwarded_for"';
    
                access_log  /var/log/nginx/access.log  main;
                tcp_nopush     on;
                sendfile            on;
                keepalive_timeout   65;
                types_hash_max_size 2048;
    
                client_body_buffer_size 10K;
                client_header_buffer_size 1k;
                client_max_body_size 512m;
                large_client_header_buffers 2 1k;
    
                client_body_timeout 1200;
                client_header_timeout 1200;
                send_timeout 100;
    
                include             /etc/nginx/mime.types;
                default_type        application/octet-stream;
    
            server {
                listen       80;
                server_name  example.uni.edu;
    
                # note that these lines are originally from the "location /" block
                root   /usr/share/nginx/html;
                index index.php index.html index.htm;
    
                location / {
                    root   /usr/share/nginx/html;
                    try_files $uri $uri/ =404;
                    index index.php;
                }
                error_page 404 /404.html;
                error_page 500 502 503 504 /50x.html;
                location = /50x.html {
                    root /usr/share/nginx/html;
                }
    
                location ~ [^/]\.php(/|$) {
                    root   /usr/share/nginx/html;
                    fastcgi_split_path_info  ^(.+\.php)(/.+)$;
                    fastcgi_index   index.php;
                    fastcgi_pass    unix:/var/run/php-fpm/php-fpm.sock;
                    #fastcgi_pass 127.0.0.1:9000;
                    include         fastcgi_params;
                    fastcgi_param   PATH_INFO       $fastcgi_path_info;
                    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
                }
    
                ###################### For Moodle Application ##################
                location /dataroot/ {
                    internal;
                    alias /var/moodledata/; # ensure the path ends with /
                }
    
                location /cachedir/ {
                    internal;
                    alias /var/moodledata/cache/; # ensure the path ends with /
                }
    
    
                location /localcachedir/ {
                    internal;
                    alias /var/moodledata/localcache/; # ensure the path ends with /
                }
    
                location /tempdir/ {
                    internal;
                    alias /var/moodledata/temp/; # ensure the path ends with /
                }
    
                location /filedir/ {
                    internal;
                    alias /var/moodledata/filedir/; # ensure the path ends with /
                }
                ###################### For Moodle Application ##################
            }
           }
    
    
    • Make sure you use a valid haproxy config along with 2 different ports 80 is for backend and 8080 is to monitor the stats
    
        #---------------------------------------------------------------------
        # Example configuration for a possible web application.  See the
        # full configuration options online.
        #
        #   http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
        #
        #---------------------------------------------------------------------
    
        #---------------------------------------------------------------------
        # Global settings
        #---------------------------------------------------------------------
        global
            # to have these messages end up in /var/log/haproxy.log you will
            # need to:
            #
            # 1) configure syslog to accept network log events.  This is done
            #    by adding the '-r' option to the SYSLOGD_OPTIONS in
            #    /etc/sysconfig/syslog
            #
            # 2) configure local2 events to go to the /var/log/haproxy.log
            #   file. A line like the following can be added to
            #   /etc/sysconfig/syslog
            #
            #    local2.*                       /var/log/haproxy.log
            #
            log         127.0.0.1 local2
    
            chroot      /var/lib/haproxy
            pidfile     /var/run/haproxy.pid
            maxconn     10000
            user        haproxy
            group       haproxy
            daemon
    
            # turn on stats unix socket
            stats socket /var/lib/haproxy/stats
    
        #---------------------------------------------------------------------
        # common defaults that all the 'listen' and 'backend' sections will
        #use if not designated in their block
        #---------------------------------------------------------------------
        defaults
            mode                    http
            log                     global
            option                  httplog
            option                  dontlognull
            option http-server-close
            option forwardfor       except 127.0.0.0/8
            option                  redispatch
            retries                 3
            timeout http-request    10s
            timeout queue           1m
            timeout connect         10s
            timeout client          1m
            timeout server          1m
            timeout http-keep-alive 10s
            timeout check           10s
            maxconn                 10000
    
    
        #---------------------------------------------------------------------
        #HAProxy statistics backend
        #---------------------------------------------------------------------
        listen haproxy3-monitoring *:8080
          mode    http
          option forwardfor
          option httpclose
          stats   enable
          stats   show-legends
          stats   refresh           5s
          stats   uri               /stats
          stats   realm             Haproxy\ Statistics
          stats   auth              username:password
          stats   admin             if TRUE
    
        #---------------------------------------------------------------------
        # main frontend which proxys to the backends
        #---------------------------------------------------------------------
        frontend main
                bind *:80
                option http-server-close
                option forwardfor
                default_backend webapp-main
    
        # round robin balancing between the various backends
        #---------------------------------------------------------------------
        backend webapp-main
                balance source
                option httpchk HEAD / HTTP/1.1\r\nHost:\ example.uni.edu
                server  web1 10.10.1.21:80 check
                server  web2 10.10.1.22:80 check
    
    

    You can also browse your application http://example.uni.edu

    Note: Make sure you public ip points to your haproxy server successfully!