首页 > 网络技术 > nginx反向代理配置与优化[一]:先让nginx跑起来
2014
03-01

nginx反向代理配置与优化[一]:先让nginx跑起来

nginx不用过多介绍,直接进入主题.

我所使用的模块为:ngx_http_proxy_module,实现反向代理服务器,简单的负载均衡及缓存以及防注入策略.

环境为:Windows2003 + nginx.(根据官方文档建议,使用1.5.10版本,即当前最新版).

一.简单的配置,让nginx先跑起来

nginx配置比较简单.conf目录下找到nginx.conf文件,修改如下配置

server {
        listen       80; //绑定的监听端口
        server_name  www.ninecmd.com ninecmd.com; //绑定的域名

        #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.ninecmd.com
REDIRECT_STATUS=200
SCRIPT_FILENAME=/web/tools/test.php
HTTP_HOST=ninecmd.com
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;
}
最后编辑:
作者:NINE
这个作者貌似有点懒,什么都没有留下。