最近因为工作需要,需要在服务器上安装配置docker,并且在docker上安装配置gitlab和redmine,并且使用nginx对他们进行反向代理,使得在公司局域网内客户端浏览器上输入http://serverip/gitlab和http://serverip/redmine就能很好的访问gitlab和redmine。
对于ubuntu上安装docker和docker上安装gitlab和redmine,我这里就不描述了,我这里主要讲的是我在使用nginx反向代理gitlab和redmine时遇到的问题以及我的解决方案。
我在docker上安装gitlab和redmine时,分别publish 出来的映射端口就是10180和10083,起初在局域网内客户端的浏览器上输入http://serverip:10180和http://serverip:10083是能很好访问他们的。我在使用nginx反向代理的时候,窃以为可以直接简单粗暴的跳转代理过去,于是,我刚开始的nginx的配置是这样的:
http{
……
server {
listen 80;
server_name localhost;
location /gitlab {
……
proxy_pass http://serverip:10180;
}
location /redmine {
……
proxy_pass http://serverip:10083;
}
……
}
}
在我对nginx的理解中和我工作的经验中判断,这是可行的。但是我每次在客户端访问时,他总是会出错,总是报出404的网页错误,在我查看nginx的错误日志时发现,他每次都会跑到nginx的默认html目录下去寻找gitlab目录和redmine目录,然而这两个目录是不存在的,所以网页会报出404的错误。对于这个错误我使用了很多方法都无法很好的解决,使用的这些方法有:
(1)将proxy_pass变量改为proxy_pass http://127.0.0.1:10180,proxy_pass http://127.0.0.1:10083,但是我发现这是很不稳定的,他每次只是去服务器的缓存中访问相应页面,如果缓存中没有相应的页面的时候,他也一样会报出404的错误.
(2) 将proxy_set_header Host $host设置为proxy_set_header Host $host:$server_port发现也还是无法很好的跳转代理。
最后,在一篇小文章中看到了一个虚拟ip的解决方案,于是就抱着尝试的心态试了试,结果真的可以很好的访问,查看access日志时发现访问是正确的,这种配置是:
先将eth0虚拟一个ip地址,使用ifconfig eth0:1 yourip命令虚拟,我在更改nginx.conf时将server的配置如下:
server {
listen yourip:80;
server_name yourip;
location /gitlab {
……
proxy_pass http://serverip:10180;
}
location /redmine {
……
proxy_pass http://serverip:10083;
}
……
}
在客户端的浏览器中输入http://yourip/gitlab和http://yourip/redmine就能很好的访问gitlab和redmine了!