如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留链接信息。

nginx除了可以处理静态资源外,他的另外一个重要功能,就是反向代理。比如:nginx反代php/node/java等等。本文中,苏南大叔结合以前的相关文章,讲述一下nginx的混合反向代理功能。这里强调一下混合的概念,就是说:在一个域名下,可能同时反代到:php、node、java,甚至根本不知道源码是基于什么语言的其他网站。

前言

本文强调“在同一个域名”之下,混合部署多种不同编程语言的后台程序。听上去有些不是很正常,对吧?不过,这也许是个趋势走向,当一门编程语言,无法发挥其优势的时候,就必须辅以其它另外一名语言了。

本文的范例中,nginx代理了:一个普通的php,一个基于thinkjs的node代码,一个基于hexo的node,一个其它未知编程语言的网站。

配置文件及简要说明

大体上,常见的有两种配置方法。fastcgi_passproxy_pass

  • fastcgi_pass,这种一般配置起来都比较麻烦,不同的编程语言有不同的配置方法和参数。
  • proxy_pass,使用proxy_pass的时候,nginx并不关心是什么编程语言的。只要写对了远程服务器的ip(或域名),端口号,及传递过去的header中的host,就可以正常实现反代功能。
server {
    listen       80;
    server_name  nginx;
    # root       /code/nginx/www/;
    index        index.html index.htm;

    location ^~ /php/{
      root /code/nginx/php/;
      index index.php;
      location ~ \.(php|phar)(/.*)?$ {
        fastcgi_split_path_info ^(.+\.(?:php|phar))(/.*)$;
        set $path_info $fastcgi_path_info;
        fastcgi_param PATH_INFO $path_info;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        include        fastcgi.conf;
        set $fastcgi_script_name2 $fastcgi_script_name;
        if ($fastcgi_script_name ~ "^(.+\.php)(/.+)$") {
          set $fastcgi_script_name2 $1;
          set $path_info $2;
        }
        fastcgi_param   PATH_INFO $path_info;
        fastcgi_param   SCRIPT_FILENAME   $document_root$fastcgi_script_name2;
        fastcgi_param   SCRIPT_NAME   $fastcgi_script_name2;
      }
    }


    location  ^~ /node {
        #proxy_pass http://127.0.0.1:4000;
        proxy_pass http://127.0.0.1:4000/;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header  Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
    }

    location  ^~ /css/ {
        root /code/nginx/node/public/;
    }

    location ~ ^/(fancybox|images|js)/{
      root /code/nginx/node/public/;
    }
}

proxy_pass要点说明

要明确nginx反代的最基本用法:那就是proxy_pass,这里有两个重要变数,大家一定要注意:

  • 第一个就是:放在proxy_pass <remote addr>后面的源地址(网址/ip,加端口号),这个地址的末尾带不带/斜线非常重要。带/斜线和不带/斜线的话,是有本质区别的:区别主要是是访问nginx的时候,路径部分在被proxy的server中如何处理的问题。
  • 第二个就是:proxy_set_header Host <host>中的<host>。上一条的中,即使写的是域名,程序在对待上也是按ip对待的,就是说一定要指定<host>,才能得到想要的结果。

相关文章

小结

nginx很好很强大。更多经验文章,请查看苏南大叔的相关文字。https://newsn.net/tag/nginx/

  【nginx】秘籍文章入口,仅传授于有缘之人  nginx

欢迎转载传播本篇原创文章,转载请保留链接及作者信息。
本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享。
转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议。
程序如此灵动~》下所有原创文章,如被用于商业用途,请您按规定支付稿费。

打赏领取小礼物

打赏任意金额,发送截图到邮箱 shang@newsn.net ,可以领取精选回馈如下(任选其一):
  • 《前端视频教程大礼包》一套
  • 《wordpress精选皮肤》一套
  • 《dedecms织梦精选模板》一套
感谢您的打赏,让我更有动力,将更多精彩教程文章,呈现给大家!谢谢!

岁月静好

关注互联网发展,关注苏南大叔的《程序如此灵动~》博客
本文章来自:程序如此灵动~
博客地址为:https://newsn.net/
原文地址为:https://newsn.net/say/nginx-conf-proxy.html
上一篇好文:chrome如何一键清除历史记录及页面缓存
下一篇好文:electron-packager如何正确处理第三方资源的打包问题

如果您转载了本文章,出于某种原因,并没有注明作者或者出处。
在这里,苏南大叔也表示理解和支持。因为苏南大叔深深地明白:
您会在合适的时机,合适的地方,给本博客一个外链。对吧?
您若开心,便是安好!岁月静好,但愿世界和平,没有纷争~