nginx如何按目录配置反向代理,混合反向代理设置
发布于 作者:苏南大叔 来源:程序如此灵动~
nginx
除了可以处理静态资源外,他的另外一个重要功能,就是反向代理。比如:nginx反代php/node/java等等。本文中,苏南大叔结合以前的相关文章,讲述一下nginx
的混合反向代理功能。这里强调一下混合
的概念,就是说:在一个域名下,可能同时反代到:php、node、java,甚至根本不知道源码是基于什么语言的其他网站。
前言
本文强调“在同一个域名”之下,混合部署多种不同编程语言的后台程序。听上去有些不是很正常,对吧?不过,这也许是个趋势走向,当一门编程语言,无法发挥其优势的时候,就必须辅以其它另外一名语言了。
本文的范例中,nginx
代理了:一个普通的php
,一个基于thinkjs
的node
代码,一个基于hexo
的node
,一个其它未知编程语言的网站。
配置文件及简要说明
nginx
的代理功能,常见的有两种配置方法。fastcgi_pass
和proxy_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代理php程序》:https://newsn.net/say/nginx-vhost-php.html
- 《nginx代理node程序》:https://newsn.net/say/nginx-thinkjs.html
小结
nginx很好很强大。更多经验文章,请查看苏南大叔的相关文字。https://newsn.net/tag/nginx/ 。


