总所周知,nginx是一款很优秀的反代工具,针对用户的不同请求可以转发到不同的服务器上,最近做的项目用到了nginx,也做了一定得反向代理,现在记录下来,希望能够对需要的铜须提供帮助。

nginx的配置文件也比较通俗易懂,这是一个我写好的转发配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
user nginx;
worker_processes 1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http{ 
    upstream service_user{
        server 0.0.0.0:32769;
        server 0.0.0.0:32770;
    }
    upstream service_server{
        server 0.0.0.0:32771;
        server 0.0.0.0:32772;
    }
    
    underscores_in_headers on;

    server {
        listen 8888;
        server_name 127.0.0.1;
        root html;
        location / {

            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_set_header  X-User 			$http_x_user;

            set $flag service;
            
            if ($http_x_user = "user") {set $flag "${flag}_user";}

            if ($http_x_user = "server") {set $flag "${flag}_server";}
            
            if ($flag = "service_user") {
                proxy_pass http://service_user;
            }

            if ($flag = "service_server") {
                proxy_pass http://service_server;
            }
            
        }
    }
    include /etc/nginx/conf.d/*.conf;
}

当时做的时候遇到了几个问题,在这记录一下。 #php启动错误 有一次我是想用nginx反代下php,结果总是代理出错,看日志也是一脸懵逼,不知道怎么个情况,在网上搜的也都是太高级,感觉不是我遇到的问题。最后发现我nginx第一行的user跟php的不一致,导致总是出现问题,改成一致就正常了。 #自定义头部 从我这个配置文件里面可以看出,我做转发的时候是基于不同的请求头的,而且不是http标准的请求头,是一个叫做X-User的头做的转发。刚开始还不太明白怎么对自定义请求头转发,在网上查了查发现nginx是可以处理这种自定义头的。proxy_set_header可以将我X-User 使我设置为$http_x_user。注意这个地方的问题,要使用$http_x_user,注意,要使用$http开头,然后就可以进行使用了。 #if出错 当时我写好配置文档后不管怎么执行就是结果不对,if的语句错误,在网上查了一堆,怎么解释的都有,就是没有一个解决问题的。 最后无奈之下我看着我的文件跟官方的配置文件进行对比,发现是if语句跟{}之间要有个空格,不注意的就没有就会报错了。真坑爹啊! 这比python代码还坑! #相关配置文件解释 实际上这个配置文件我不解释大部分同学也都能够看得懂了,不过还是啰嗦几句吧。 proxy_pass这个就是转发的,后面的内容就是将请求转发到的服务器上。 upstream就是转发的服务器,接受处理转发过来的请求,里面的内容就是具体的服务器的地址。可以写多个,进行负载均衡。nginx提供了一些负载均衡的算法了,比如轮询,比如最少链接等等。 #学习 实际上假设就这么一用nginx或许就到头了,但是我发现nginx的功能可远远不限制与此。 由于nginx开源,使得用户可以添加自己想要的功能进去。而这才是nginx的魅力所在吧。然而由于经历以及时间关系,我一直都没有深入的学习,我目前只是在入门的阶段,以后有机会了要好好研读下。只是nginx的有点也算缺点,是用c写的,相对来说难以理解一点。 nginx_lession是淘宝等好多大神一起写的教程,写的比较清晰明快,先记录下,有机会一定要学习学习。