Ubuntu下Nginx配置路径及proxy_pass问题记录

首先,ubuntu下nginx的配置文件可以位于好几个地方,但是一般都是在/etc/nginx/这个大的目录下面,包括其下的conf.d目录,nginx.conf文件,sites-available目录和sites-enabled目录。默认的sites-enabled/default是个软连接,指向/etc/nginx/sites-available/default。一般配置文件路径就是这些,除非还有自己定义include别的配置文件路径。

下面是具体测试,包括nginx默认配置文件等。

在一台新机器上安装nginx,或者卸载干净nginx的机器上安装nginx。这里稍微记录点插曲,我直接apt remove nginx卸载,然后安装的时候出现了依赖问题,主要是“nginx 依赖于 nginx-core (<< 1.14.0-0ubuntu1.1.1~)”等报错,可以先用:

dpkg --get-selections | grep nginx

筛选有关包,比如得到:

libnginx-mod-http-geoip                         install
libnginx-mod-http-image-filter                  install
libnginx-mod-http-xslt-filter                   install
libnginx-mod-mail                               install
libnginx-mod-stream                             install
nginx-common                                    install
nginx-core                                      install

然后

sudo apt --purge remove nginx-common

完全删除nginx,另外可以去检查/etc下的nginx目录,仍存在则删除掉。然后就可以安装了,命令为:

sudo apt install nginx

安装后应该就启动了nginx,或者sudo service nginx start启动。接着,sudo vim /etc/nginx/sites-available/default可以查看当前默认配置,其root指向/var/www/html,该目录下有index.nginx-debian.html,也就是这个常见的页面:

现在,将该默认配置的“listen 80 default_server;”和“root /var/www/html;”注释掉,重启nginx服务,你会发现nginx还是监听80端口。当前仅有一个server,且该server未配置监听端口,则自动监听了80端口,且其root的默认值变成了/usr/share/nginx/html/。

我为什么会这么做,因为在一个jupyter和nginx的联合配置过程中不需要root,而且一时忘记了监听80,所以出现了未配置80监听却能访问80默认页面的怪事,困扰了好长时间,找了各个配置文件路径也没有找到对应的文件。这也就是前面提到的为什么有那么多配置文件路径,因为我为了这个没有配置的80找遍了配置,后来才知道是nginx运行中发现所以配置文件没有一个监听端口的时候给了默认的80。可以对比测试下,如果nginx就一个server配置,且正确分配了一个端口号,如81,那么80不会占用。要是所有的server都没有配置一个可以用的端口,nginx就给一个80。

以上是花费最多时间排查的,后来在nginx通过proxy_pass给jupyter反向代理的时候,发现其localhost被替换成了该机器的地址,导致jupyter无法访问。该部分参考:

扫描二维码关注公众号,回复: 3629004 查看本文章

http://www.albertauyeung.com/post/setup-jupyter-nginx-supervisor/

配置如下(这里是8888;而不是8888/;则访问会被转为如http://localhost:8888/notebook/test.html否则就是http://localhost:8888/test.html了):

location /notebook {
    proxy_pass http://localhost:8888;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $http_host;
    proxy_http_version 1.1;
    proxy_redirect off;
    proxy_buffering off;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 86400;
}

由于jupyter没有配置(这里好像'*'代替'0.0.0.0'会出错):

c.NotebookApp.ip = '0.0.0.0'

所以非127.0.0.1的访问会被阻断,也就是proxy_pass是通过本机访问jupyter的,应该是127.0.0.1的身份,但是实际却是192.168.3.120这样的服务器本机地址,导致jupyter不认。所以后面添加了'0.0.0.0'这样的监听才解决了proxy_pass这个问题。

现在就要探讨下proxy_pass的一些知识点了,主要是结合前面ip变化的问题,发现x-forwarded-for参数是以前所不了解的。该参数指定了proxy_pass的时候会记录客户端的代理过程,如192.168.247.1, 192.168.247.131, 192.168.247.132就是x-forwarded-for的值,则192.168.247.1是客户端地址。对应还有个x-real-ip记录真实地址,这个有兴趣的可以去查一下。

建立一个server:

server {
    listen 81;

    location / {
        proxy_pass http://localhost;
    }
}

这里访问81会反向代理到默认80上,比如在另一个机器访问http://192.168.206.197:81/,那么nginx日志显示未:

127.0.0.1 - - [16/Oct/2018:10:41:12 +0800] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
192.168.206.199 - - [16/Oct/2018:10:41:12 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"

也就是192.168.206.199先访问到了192.168.206.197的81端口,被代理后ip记录为127.0.0.1,然后给192.168.206.199返回。这里代理后ip是127.0.0.1而不是服务器本身的192.168.206.197,与前面配置jupyter的那台机器表现不一致,实际测试添加了x-forwarded-for等也没有影响。

这个暂时还不知道原因,原来配置jupyter的机器问题解决了也就没再折腾,可能那台机器的localhost有别的配置吧,暂时就记录这些。

总结一下,就是nginx的server没有配置端口的时候会自己用起来80,这个可能不知道的情况下很疑惑为什么没配置80也运行了80。第二个问题是nginx反向代理的时候有的机器会以127.0.0.1的身份访问本机服务,有的会以自己对外ip(如192.168.3.120)来访问本机服务。而第二种会被jupyter认为是外部访问,在未开放0.0.0.0监听的时候会被jupyter阻断从而出现问题。其中第二个问题解决后没有继续调查为什么会出现不同身份的具体原因。

猜你喜欢

转载自blog.csdn.net/u012911347/article/details/83068191