Nginx http 反向代理设置

在上一篇 Nginx 在 CentOS 上的安装时已经提到了 Nginx 是一个应用广泛的反向代理服务,可是有的人可能就一脸问号了,反向代理是啥意思?

A proxy server is a go‑between or intermediary server that forwards requests for content from multiple clients to different servers across the Internet. A reverse proxy server is a type of proxy server that typically sits behind the firewall in a private network and directs client requests to the appropriate backend server. A reverse proxy provides an additional level of abstraction and control to ensure the smooth flow of network traffic between clients and servers.

Ningx 的官网给出了解释,https://www.nginx.com/resources/glossary/reverse-proxy-server/

大致意思是说:

代理服务器是一个中间服务器,它主要是把英特网上的不同客户端的请求转发到不同的服务器上。而反向代理服务器则是代理服务器的一种,它也是把英特网上的不同客户端的请求转发到不同的服务器上,它这些服务器是位于某个私有网络中,且该私有网络具有防火墙(比如防火墙只允许该私有网络通过一个指定的 IP 与 端口与外网连接)。也就是说我们直接访问需要访问的服务器是不通的,如下是 Nginx 官网的 Nginx 配置 API 网关示意图,但我觉得它同样能表达反向代理的过程。

反向代理示意图

另外,反向代理还提供了额外的抽象和控制级别(比如对传输数据进行压缩等等),以确保客户端和服务器之间的网络流量顺畅。

下面,就介绍一些反向代理的常用的设置。

一、nginx.conf 配置


1.1 用户配置

如果 nginx 使用 root 用户运行,那么最好将 nginx.conf 中的 user 配置为 root (默认为 nobody)。不然,如果转发为目录时,如果目录权限不是 777,那么将访问不到转发的目录而报 403 错误。

user root;
用户设置

1.2 引入自定义配置

正常来说,我们可以在 nginx.conf 配置许多个转发规则,反向解析到不同的服务,比如 api.jiangzhuolin.com 我需要解析到我的 api 服务,mail.jiangzhuolin.com 转发到我的邮箱服务,file.jiangzhuolin.com 转发到我的服务器上的某个文件目录。但是如果全都配置到一个文件里,那么会很乱很难维护。

因此,我们可以把每一个转发规则分离出去,便于维护。

root 用户执行如下命令编辑 nginx.conf:

[root@lab1 sbin]# vim ${NGINX_HOME}/conf/nginx.conf

注:${NGINX_HOME} 表示你的 nginx 的安装路径,比如:nginx 安装在 /usr/local/nginx

在文件中添加如下内容,并保存退出:

include vhost/*.conf;

如下所示:

虚拟主机配置文件引入

注:
(1) nginx.conf 所在的位置与 nginx 的安装位置有关。比如,我的 nginx 安装在 /usr/local/nginx 下, nginx.conf 就应该在 /usr/local/nginx/conf/nginx.conf,如果你的 nginx 安装在 /usr/nginx 下,那么你的 nginx.conf 就在 /usr/nginx/conf/nginx.conf

(2) include vhost/*.conf 表示引入 vhost 目录下的所有 .conf 结尾的文件内容

1.3 创建一个自定义配置文件目录

在 ${NGINX_HOME}/conf 目录下新建 vhost 目录:

[root@lab1 conf]# pwd

/usr/local/nginx/conf

[root@lab1 conf]# mkdir vhost

注:vhost 目录名称可以为其他,只需要引入对应名称的目录下的所有配置文件即可。

二、端口转发

端口转发就是将一个域名转发到监听某个端口进程服务上。

示例:

在 vhost 目录下创建 demo.jzl.com.conf :

[root@lab1 vhost]# vi demo.jzl.com.conf

内容如下:

server

{
    listen 80;
    server_name demo.jzl.com;
    location / {
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://192.168.56.130:8081/web-demo/;
    }
    access_log logs/demo.jzl.com_access.log;
}

注:

(a) server {} 表示的是 nginx 的配置,其中 listen 80 表示 nginx 的监听端口为 80, server_name demo.jzl.com 表示该主机解析的域名

(b) location / {} 表示的是转发规则,proxy_pass http://192.168.56.130:8081/web-demo/ 表示当使用 demo.jzl.com 访问时,转发到 192.168.56.130 的 8081 端口下的 web-demo 目录

(c) 当然,你的 192.168.56.130 必须要有程序运行监听在 8081 端口~,我的 192.168.56.130 上运行了一个 tomcat 监听端口 8081,tomcat 的 webapps 下部署了一个 context 为 web-demo 程序

(d) 如果你不想设置域名,当然也可以设置 ip ,比如把 demo.jzl.com 换成 192.168.56.130 ,那么当访问 http://192.168.56.130:80 ,会被 nginx 转发到 192.168.56.130:8081/web-demo/

三、虚拟域名

如果你的主机没有由 DNS 解析的域名,那么可以设置虚拟域名来访问,所谓虚拟域名,就是在我们的 hosts 文件中配置的域名,它只在我们配置的计算机上生效。设置方法如下:

3.1 配置虚拟域名

在你的被访问的 server 上 ( nginx server) 设置本机域名解析,vi /etc/hosts ,添加内容如下示例:

192.168.56.130 demo.jzl.com

示例:

配置虚拟域名

3.2 配置访问客户端的虚拟域名

在你需要访问远程 server 的客户机上也设置一个虚拟域名解析(注意,客户机必须与远程 server 网络连通),此处以本地的 windows 客户机为例:

打开并编辑下方文件:

C:\Windows\System32\drivers\etc\host

添加内容如下,并保存 (注:直接用 windows 的编辑打开文件可能会没有权限保存,可以将文件复制出来更改后再覆盖原文件;也可以使用 notepadd ++ 来编辑文件可以保存):

192.168.56.130 demo.jzl.com

示例如下图:

客户机虚拟域名配置

验证:

添加上面的 nginx 配置规则后,需要重启 nginx。(当然,如果你之前没启动 nginx,不用重启,直接启动即可)

${NGINX_HOME}/sbin/nginx    # 启动 ngnix

${NGINX_HOME}/sbin/nginx -s reload    # 重载 nginx

注:${NGINX_HOME} 代表你 nginx 的安装目录,如果你配置了 nginx 的全局环境变量 (参考上一篇 Nginx 安装),也可以在任意目录位置直接执行 nginx/nginx -s reload

查看 nginx 的监听端口以及运行进程号:

[root@lab1 pentaho-server]# netstat -apn|grep nginx
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      8917/nginx          
unix  3      [ ]         STREAM     CONNECTED     29047  8917/nginx          
unix  3      [ ]         STREAM     CONNECTED     29046  8917/nginx

查看 8080 端口的监听及运行情况:

[root@lab1 conf]# netstat -apn|grep 8080
tcp        0      0 :::8080                     :::*                        LISTEN      1580/java

浏览器中访问:

通过虚拟域名访问
通过 IP 端口访问

可以看到已经配置成功。

四、目录转发

示例:

在 vhost 目录下创建 file.jzl.com.conf :

[root@lab1 vhost]# vi file.jzl.com.conf

内容如下示例:

server {
    default_type 'text/html';
    charset utf-8;

    listen 80; #端口
    autoindex on;
    server_name file.jzl.com; #域名
    access_log /usr/local/nginx/logs/file.jzl.com_access.log combined;
    index index.html index.htm index.jsp index.php;

     # 转发规则[目录转发]
    location / {
        root /opt;
        add_header Access-Control-Allow-Origin *;
    }

   location /elk {
        alias /data/elk/;
        add_header Access-Control-Allow-Origin *;
    }
}

注:

(a) autoindex on; 此设置必须加上,表示让nginx 自动为目录添加索引。如果不加上,当在浏览器中访问时,会出现403错误

403 错误

(b) root /opt 代表的是定义一个基准目录,也就是说当我们访问 file.jzl.com 域名下的 / (file.jzl.com/) 时,会自动转发到 /opt/ 目录下。

(c) alias /data/elk/ 表示的是当我们访问 file.jzl.com 下的 elk (file.jzl.com/elk/) 时,会自动转发到 /data/elk/ 目录。另,如果是设置 alias, 目录最后的 / 不可少,即不能写成 /data/elk

(d) 配置目录转发时,alias 与 root 两种方式任选一种即可,但需要注意两种方式使用上的不同。

(e) 配置 server 与 client 的 hosts 文件如下:

服务器 file.jzl.com 配置
客户机 file.jzl.com 配置

浏览器中输入域名访问如下:

访问目录
访问目录
访问目录

注:如果你已经有 DNS 解析的域名,则完全不用配置 hosts 文件中的本地域名解析了,直接在反向代理中配置具体域名即可。

附录一、nginx 反向代理


官方反向代理配置介绍地址:

https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/

附录二、nginx laction 配置


官方 location 介绍地址如下:

http://nginx.org/en/docs/http/ngx_http_core_module.html?#location

附录三、复杂 location 配置示例


server {
listen 80;
autoindex on;
server_name example.jzl.com);

access_log /usr/local/nginx/logs/access.log combined;
index index.html index.htm index.jsp index.php;

if ( $query_string ~* ".*[\;'\<\>].*" ){
        return 404;
        }

location = / {
        root /product/front/mmall_fe/dist/view;
        index index.html;
}

location ~ .*\.html$ {
        root /product/front/mmall_fe/dist/view;
        index index.html;
}

location / {
        proxy_pass [http://127.0.0.1:8080/;](http://127.0.0.1:8080/;)
        }

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|ico)$ {
        proxy_pass [http://127.0.0.1:8080](http://127.0.0.1:8080/);
        expires 30d;
        }

location ~ .*\.(js|css)?$ {
        proxy_pass [http://127.0.0.1:8080](http://127.0.0.1:8080/);
        expires 7d;
        }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容