How to configure GitLab as a subdomain in nginix.c

2019-03-27 15:06发布

问题:

I was using Apache2 before I installed GitLab on my VPS. I just want to make GitLab a subdomain of my site (git.example.com) and have my main site (www.example.com) look at /var/www/html/index.html

Here is my nginx.conf file as of now:

user www-data;
worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    # multi_accept on;
}

http {
    include       /etc/nginx/mime.types;

    access_log  /var/log/nginx/access.log;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay        on;

    gzip  on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

upstream gitlab {

    server unix:/home/gitlab/gitlab/tmp/sockets/gitlab.socket; }

    server {

        listen 80;
        server_name www.example.com;
        root /home/gitlab/gitlab/public;

        # individual nginx logs for this gitlab vhost
        access_log  /var/log/nginx/gitlab_access.log;
        error_log   /var/log/nginx/gitlab_error.log;

        location / {
            # serve static files from defined root folder;.
            # @gitlab is a named location for the upstream fallback, see below
            try_files $uri $uri/index.html $uri.html @gitlab;
        }

        # if a file, which is not found in the root folder is requested,
        # then the proxy pass the request to the upsteam (gitlab unicorn)
        location @gitlab {
            proxy_redirect     off;

            # you need to change this to "https", if you set "ssl" directive to "on"
            proxy_set_header   X-FORWARDED_PROTO http;
            proxy_set_header   Host              $http_host;
            proxy_set_header   X-Real-IP         $remote_addr;

            proxy_pass http://gitlab;
        }
    }

}

回答1:

Here is my setup that works on a subdomain.

server {
  listen 80;
  server_name gitlab.example.com;
  root /home/gitlab/gitlab/public;

  # individual nginx logs for this gitlab vhost
  access_log  /var/log/nginx/gitlab_access.log;
  error_log   /var/log/nginx/gitlab_error.log;

  location / {
    # serve static files from defined root folder;.
    # @gitlab is a named location for the upstream fallback, see below
    try_files $uri $uri/index.html $uri.html @gitlab;
  }

  # if a file, which is not found in the root folder is requested, 
  # then the proxy pass the request to the upsteam (gitlab unicorn)
  location @gitlab {
    proxy_redirect     off;
    # you need to change this to "https", if you set "ssl" directive to "on"
    proxy_set_header   X-FORWARDED_PROTO http;
    proxy_set_header   Host              gitlab.example.com:80;
    proxy_set_header   X-Real-IP         $remote_addr;
    proxy_pass http://gitlab;
  }
} 


回答2:

Here's what I did, I don't know if it's optimal but it works.

nginx.conf:

events {
    worker_connections 1024;
}
http {
    include /etc/nginx/mime.types;
    root .;
    server {
          listen 80;
          server_name www.whatever.com whatever.com;
    }
    server {
          listen 80;
          server_name gitlab.whatever.com;
          location / {
               proxy_pass http://127.0.0.1:8000;
          }
     }
}

in gitlab.rb, uncomment/edit this line:

nginx['listen_port'] = 8000


回答3:

You will need to create two different vhost file for each of projects (Gitlab and your main site).

In your Gitlab vhost file, you can use the default file, changing some fields:

# GITLAB repository

upstream gitlab {
  server unix:/home/git/gitlab/tmp/sockets/gitlab.socket;
}

server {
    listen 80;                   # In most cases *:80 is a good idea
    server_name git.example.com; # E.g., server_name source.example.com;
    server_tokens off;           # don't show the version number, a security best practice

    root /home/git/gitlab/public;         # Where your repository is located
    index index.php index.html index.htm; # Extensions to look for

    # Logs for this gitlab vhost. If something goes wrong, check these files to figure out what is missing
    access_log /var/log/nginx/gitlab_access.log;
    error_log  /var/log/nginx/gitlab_error.log;

    location / {
        # serve static files from defined root folder;.
        # @gitlab is a named location for the upstream fallback, see below
        try_files $uri $uri/index.html $uri.html @gitlab;
    }

    # if is a file that could not be found in the root folder is requested,
    # then the proxy pass the request to the upsteam (gitlab unicorn)
    location @gitlab {
        proxy_read_timeout 300;    # https://github.com/gitlabhq/gitlabhq/issues/694
        proxy_connect_timeout 300; # https://github.com/gitlabhq/gitlabhq/issues/694
        proxy_redirect     off;

        proxy_set_header X-Forwared-Proto $scheme;
        proxy_set_header X-Real-IP        $remote_addr;
        proxy_set_header X-Forwarded-For  $remote_addr;
        proxy_set_header Host             git.example.org:80; # Host name for your Gitlab Project

        proxy_pass  http://gitlab; # Alias
    }
}

Then, create a new symbolic link in your /sites-enabled/ folder:

$ sudo rm /etc/nginx/sites-enabled/example
$ sudo ln -s /etc/nginx/sites-available/example /etc/nginx/sites-enabled/example

Restart Nginx service nginx restart.

If still not working, check out your error log using tail -f /var/log/nginx/gitlab_error.log. This may help you to figure out what else you are missing.

Note: For this answer, the PHP version that I used was 5.3.10 and the Nginx version was 1.1.19.

References

How To Configure Nginx as a Reverse Proxy for Apache - https://www.digitalocean.com/community/tutorials/how-to-configure-nginx-as-a-reverse-proxy-for-apache

Tail command - http://en.wikipedia.org/wiki/Tail_%28Unix%29