【转载】非常详细的nginx反向代理参数配置

原文链接:http://blog.51cto.com/meiling/1978482

nginx反向代理配置详解

转载于:http://blog.51cto.com/meiling/1978482 侵删

反向代理配置

修改部署目录下conf子目录的nginx.conf文件(如/opt/nginx/conf/nginx.conf)内容,可调整相关配置。

 

反向代理配置示例:

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

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

#定义Nginx运行的用户和用户组

user nginx nginx;

 

#nginx进程数,建议设置为等于CPU总核心数

worker_processes  1;

 

#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]

error_log logs/error.log info;

 

#进程文件

pid run/nginx/nginx.pid;

 

#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。

worker_rlimit_nofile 65535;

 

 

#工作模式与连接数上限

events {

    #use epoll;

    #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; 

epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就

用kqueue模型。window下不指定。

补充说明:

与apache相类,nginx针对不同的操作系统,有不同的事件模型。

A)标准事件模型

Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll

B)高效事件模型

Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。

Epoll:使用于Linux内核2.6版本及以后的系统。

/dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。

Eventport:使用于Solaris 10。 为了防止出现内核崩溃的问题, 有必要安装安全补丁。

       

       

      #单个进程最大连接数(最大连接数=连接数*进程数)

    worker_connections  4000;

}

 

#设定http服务器

http {

    #隐藏Nginx版本信息

    server_tokens off;

    include       mime.types;#文件扩展名与文件类型映射表

    default_type  application/octet-stream;#默认文件类型

    #charset utf-8; #默认编码

    server_names_hash_bucket_size 128; #服务器名字的hash表大小

    client_header_buffer_size 32k; #上传文件大小限制

 

     

     

    #access默认原先日志格式

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

      #              '$status $body_bytes_sent "$http_referer" '

      #                '"$http_user_agent" "$http_x_forwarded_for"';

 

      #access_log  logs/access.log  main;

     

    autoindex off;#开启目录列表访问设置为on,合适下载服务器,默认关闭。

     

    #日志格式定义为如下

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"'

                       '$upstream_addr $upstream_response_time $request_time ';

    log_format log404 '$status [$time_local] $remote_addr $host$request_uri $sent_http_location';

     

    日志格式设置说明:

     $remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;

     $remote_user:用来记录客户端用户名称;

     $time_local: 用来记录访问时间与时区;

     $request: 用来记录请求的url与http协议;

     $status: 用来记录请求状态;成功是200,

     $body_bytes_sent :记录发送给客户端文件主体内容大小;

     $http_referer:用来记录从那个页面链接访问过来的;

     $http_user_agent:记录客户浏览器的相关信息;

     通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿

     到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以

     增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。

     

     

    access_log  logs/nginx/access.log main;

    access_log  logs/host.access.404.log  log404;

     用了log_format指令设置了日志格式之后,需要用access_log指令指定日志文件的存放路径;

     

    sendfile  on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数

    来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置

    为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这

    个改 成off。

    #tcp_nopush on; #防止网络阻塞

    #tcp_nodelay on; #防止网络阻塞

     

    keepalive_timeout  65; ##给客户端分配keep-alive链接超时时间。服务器将在这个超时时间过后关闭链接。我们将它设置低些可以让ngnix持续工作

    的时间更长,单位是秒

    client_header_timeout 10;  

        client_body_timeout 10;    #设置客户端读请求的超时时间,默认是60s  

        reset_timedout_connection on; #在客户端停止响应之后,允许nginx服务器关闭连接,释放socket关联的内存  

        send_timeout 10;     # 设置客户端的响应超时时间.如果客户端停止读取数据,在这么多时间之后就释放过期的客户端连接,默认是60s

         

        client_header_timeout 和client_body_timeout #设置请求头和请求体(各自)的超时时间。我们也可以把这个设置低些。

     

    #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面

    意思都能理解,单位是秒 

    fastcgi_connect_timeout 300; 

    fastcgi_send_timeout 300;

    fastcgi_read_timeout 300;

    fastcgi_buffer_size 64k; 

    fastcgi_buffers 4 64k; 

    fastcgi_busy_buffers_size 128k; 

    fastcgi_temp_file_write_size 128k;

  

    #gzip模块设置

    gzip on; #开启gzip压缩输出

    gzip_min_length 1k; #最小压缩文件大小 

    gzip_buffers 4 16k; #压缩缓冲区 

    gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0) 

    gzip_comp_level 2; #压缩等级 

    gzip_types text/plain application/x-javascript text/css application/xml;

         

    #压缩类型,默认就已经包含textml,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。

    gzip_vary on; 

    #limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用

     

     

   #虚拟主机的配置 

    server {

        listen       80;#侦听的80端口

         

        #域名可以有多个,用空格隔开

        server_name  10.40.50.52;

         

        #client_header_buffer_size 4k;客户端请求头部的缓冲区大小。这个可以根据你的

        系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分

        页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取

        得。

         

        large_client_header_buffers 4 128k; 客户请求头缓冲大小。nginx默认会

        用client_header_buffer_size这个buffer来读取header值,如果header过大,它会

        使用large_client_header_buffers来读取。

         

        client_max_body_size 300m; #允许客户端请求的最大单文件字节数

         

        client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数

         

        proxy_connect_timeout 600; #nginx跟后端服务器连接超时时间(代理连接超时,单位秒)

         

        proxy_read_timeout 600; #连接成功后,后端服务器响应时间(代理接收超时,单位秒)

         

        proxy_send_timeout 600; #后端服务器数据回传时间(代理发送超时,单位秒)

         

        proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小

         

        proxy_buffers   4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,

        这样设置

        proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)

         

        proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将

        从upstream服务器传

         

——————————————————————————————————————————————————————————        

#proxy_buffers 4 256k;

#设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统

#的不同可能是4k或者8k

  

#proxy_busy_buffers_size 256k;

  

#proxy_temp_file_write_size 256k;

#设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长

         

#proxy_temp_path /data0/proxy_temp_dir;

#proxy_temp_path和proxy_cache_path指定的路径必须在同一分区

 

#proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;

#设置内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。

 

#client_body_buffer_size 512k;

#如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,来提交任意小

于256k的图片,都很正常。如果注释该指令,使用默认的client_body_buffer_size设置,也就是操作

系统页面大小的两倍,8k或者16k,问题就出现了。

#无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server

 Error错误

  

#proxy_intercept_errors on;

#表示使nginx阻止HTTP应答代码为400或者更高的应答。

——————————————————————————————————————————————————————————

 

#设定查看Nginx状态的地址

        location /nginxstatus{

                stub_status on;

                access_log on;

                auth_basic "nginxstatus";

                auth_basic_user_file htpasswd;

                #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。

        }

         

————————————————————————————————————————————————————————————————————        

相关数据说明

Active connections: 对后端发起的活动连接数.

Server accepts handled requests: Nginx总共处理了655个连接,成功创建655次握手(证明中间没

有失败的),总共处理了1985个请求.

Reading: Nginx 读取到客户端的Header信息数.

Writing: Nginx 返回给客户端的Header信息数.

Waiting: 开启keep-alive的情况下,这个值等于 active – (reading + writing),意思就是

Nginx已经处理完成,正在等候下一次请求指令的驻留连接.

所以,在访问效率高,请求很快被处理完毕的情况下,Waiting数比较多是正常的.如果reading +writing

数较多,则说明并发访问量非常大,正在处理过程中.        

————————————————————————————————————————————————————————————————————

 

#hone服务

        location /hone {

           index  index.html index.htm index.jsp;

           proxy_pass      http://11.33.22.56:8080/hone;

           proxy_set_header X-Real-IP $remote_addr;

           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

           proxy_set_header Host $host:$server_port;

        }

 

#门户网站

        location /GR133 {

           index  index.html index.htm index.jsp;

           proxy_pass  http://192.168.133.12:8585/GR133;

           proxy_set_header X-Real-IP $remote_addr;

           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

           proxy_set_header Host $host:$server_port;

        }

        location /GR133File {

           index  index.html index.htm index.jsp;

           proxy_pass  http://192.168.133.12:8585/GR133File;

           proxy_set_header X-Real-IP $remote_addr;

           proxy_set_header Host $host:$server_port;

        }

 

        #不允许访问的网站目录 

        location ~ ^/(WEB-INF|META-INF)/{  

           deny all;  

        }

                 

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

    }

     

    include /opt/nginx/conf/vhost/*.conf;  #加载其它配置文件

}

分析:

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

1.proxy_set_header X-real-ip $remote_addr;

有了这句就可以在web服务器端获得用户的真实ip,$remote_addr代表客户端IP,当前配置的输出结果为

最后一个代理服务器的IP,并不是真实客户端IP;

 

但是,实际上要获得用户的真实ip,不是只有这一个方法,下面我们继续看。

 

2.proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

我们先看看这里有个X-Forwarded-For变量,这是一个squid开发的,用于识别通过HTTP代理或负载平衡

器原始IP一个连接到Web服务器的客户机地址的非rfc标准,如果有做X-Forwarded-For设置的话,每次经

过proxy转发都会有记录,格式就是client1, proxy1, proxy2,以逗号隔开各个地址,由于他是非rfc标

准,所以默认是没有的,需要强制添加,在默认情况下经过proxy转发的请求,在后端看来远程地址都

是proxy端的ip 。也就是说在默认情况下我们使用request.getAttribute("X-Forwarded-For")获取不

到用户的ip,如果我们想要通过这个变量获得用户的ip,我们需要自己在nginx添加如下配置:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

 

意思是增加一个$proxy_add_x_forwarded_for到X-Forwarded-For里去,注意是增加,而不是覆盖,当

然由于默认的X-Forwarded-For值是空的,所以我们总感觉X-Forwarded-For的值就等于

$proxy_add_x_forwarded_for的值,实际上当你搭建两台nginx在不同的ip上,并且都使用了这段配置,

那你会发现在web服务器端通过request.getAttribute("X-Forwarded-For")获得的将会是客户端ip和第

一台nginx的ip。

 

那么$proxy_add_x_forwarded_for又是什么?

$proxy_add_x_forwarded_for变量包含客户端请求头中的"X-Forwarded-For",与$remote_addr两部分,

他们之间用逗号分开。

举个例子,有一个web应用,在它之前通过了两个nginx转发,www.linuxidc.com 即用户访问该web通过

两台nginx。

在第一台nginx中,使用

proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

现在的$proxy_add_x_forwarded_for变量的"X-Forwarded-For"部分是空的,所以只有$remote_addr,而

$remote_addr的值是用户的ip,于是赋值以后,X-Forwarded-For变量的值就是用户的真实的ip地址了。

到了第二台nginx,使用

proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;

现在的$proxy_add_x_forwarded_for变量,X-Forwarded-For部分包含的是用户的真实ip,$remote_addr

部分的值是上一台nginx的ip地址,于是通过这个赋值以后现在的X-Forwarded-For的值就变成了“用户

的真实ip,第一台nginx的ip”,这样就清楚了吧。

最后我们看到还有一个$http_x_forwarded_for变量,这个变量就是X-Forwarded-For,由于之前我们说

了,默认的这个X-Forwarded-For是为空的,所以当我们直接使用proxy_set_header X-Forwarded-For $http_x_forwarded_for时

会发现,web服务器端使用request.getAttribute("X-Forwarded-For")获得的值是null。如果想要通过

request.getAttribute("X-Forwarded-For")获得用户ip,就必须先使用proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

这样就可以获得用户真实ip。

 

在/opt/nginx/目录下创建htpasswd文件:

利用htpasswd命令添加用户 

1

htpasswd -bc conf/htpasswd nginx usernginx19

在/opt/nginx/conf目录下生成一个passwd文件,用户名nginx,密码:usernginx19,默认采用MD5加密方式。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章