环境为:Windows2003 + nginx.(根据官方文档建议,使用1.5.10版本,即当前最新版).
一.简单的配置,让nginx先跑起来
nginx配置比较简单.conf目录下找到nginx.conf文件,修改如下配置
代码如下 | 复制代码 |
server { listen 80; //绑定的监听端口 server_name www.111cn.net 111cn.net; //绑定的域名 #charset koi8-r; #access_log logs/host.access.log main; location / { root html; proxy_pass http://192.168.0.23:81/; //位于内网的http server proxy_redirect off; proxy_set_header Host $proxy_host;//后端服务器的主机名和端口 proxy_set_header X-Real-IP $remote_addr; //反向代理IP,其中X-Real-IP为自定义请求头 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; index index.aspx default.aspx index.html index.htm;//默认文档 } |
注意proxy_set_header Host $proxy_host;这个配置,官方文档为proxy_set_header Host $host; 但是经过试验,并不能成功启用反向代理,文档中的内嵌变量也没有$host,不知文档有错误,还是我的理解错误.
将cmd切换至nginx目录,运行start nginx,运行nginx,进程中就多了2个nginx.exe进程.运行nginx -s stop关闭nginx,运行nginx -s reload重启nginx.注意:关闭或重启命令有时候不能关闭nginx,如果修改配置无效,要检查下nginx是否真正退出.
2.通过反向代理后的请求头变化
我们来看下启用反向代理后,请求头多了些什么.上一段php取请求头的代码
代码如下 | 复制代码 |
<?php $headers = array(); foreach ($_SERVER as $key => $value) { echo $key."=".$value; echo "<br />"; if ('HTTP_' == substr($key, 0, 5)) { $headers[str_replace('_', '-', substr($key, 5))] = $value; } } ?> |
通过反向代理访问这段脚本后,得到如下结果:
代码如下 | 复制代码 |
USER=www HOME=/home/www FCGI_ROLE=RESPONDER GATEWAY_INTERFACE=CGI/1.1 SERVER_SOFTWARE=nginx/1.2.9 QUERY_STRING= REQUEST_METHOD=GET CONTENT_TYPE= CONTENT_LENGTH= SCRIPT_NAME=/tools/test.php REQUEST_URI=/tools/test.php DOCUMENT_URI=/tools/test.php DOCUMENT_ROOT=/web SERVER_PROTOCOL=HTTP/1.1 REMOTE_ADDR=123.170.241.72 REMOTE_PORT=11827 SERVER_ADDR=103.251.91.175 SERVER_PORT=80 SERVER_NAME=www.111cn.net REDIRECT_STATUS=200 SCRIPT_FILENAME=/web/tools/test.php HTTP_HOST=111cn.net HTTP_CONNECTION=keep-alive HTTP_CACHE_CONTROL=max-age=0 HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 HTTP_USER_AGENT=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36 HTTP_ACCEPT_ENCODING=gzip,deflate,sdch HTTP_ACCEPT_LANGUAGE=zh-CN,zh;q=0.8 HTTP_COOKIE=wp-settings-1=imgsize%3Dfull%26editor%3Dtinymce%26hidetb%3D1%26ngg_show_update_notice196%3D1%26libraryContent%3Dbrowse%26align%3Dnone%26urlbutton%3Dpost%26mfold%3Do; wp-settings-time-1=1386907183; bdshare_firstime=1393228286385; wordpress_test_cookie=WP+Cookie+check; wordpress_logged_in_c9c95ee17ba7f5ef416fc56a8a98a5ff=NINE%7C1393388079%7Cce226d537feb3af00ea52d0cf8d71600 PHP_SELF=/tools/test.php REQUEST_TIME=1393261963 |
3.后端网站代码修改
如果后端网站需要取访问者IP,通过取请求中的”REMOTE_ADDR”属性取到的是反向代理的ip,此时我们通过反向代理转发请求时添加的请求头来获取访问者的真实IP.目前我的后端网站为.net.
代码如下 | 复制代码 |
public string getRequstAddr (HttpContext context){ string ip; if (context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null) { string str = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; string[] iparray = str.Split(','); ip = iparray[0]; } else{ ip = context.Request.ServerVariables["REMOTE_ADDR"].ToString(); } return ip; } |
时间: 2024-12-26 23:43:21