标签:nginx

F5旁路模式下nginx获取真实IP

在公司的网络中,使用F5工作在旁路模式,这样的好处是在不调整网络的基础架构上做负载均衡。但是在调整好网络之后,发现作为node(节点)的nginx已经不能正确获取到用户的IP地址,这导致之前使用nginx做的IP白名单策略失效。后来发现这是由于F5在旁路模式下将请求的头信息进行了修改,将源地址放到了X-Real-IP或X-Forwarded-For中。以这种情况来看,通过web应用程序应该可以很容易的获取这个地址,但这样就需要修改程序的业务逻辑,最好的办法还是让nginx支持读取真实IP。写到这里,回想起在使用HAProxy做LB的时候,需要配置类似于x-forwarded-for的选项了,所以,nginx还是有办法的。

nginx提供了这种获取方法,但是默认的编译参数中并没有支持,需要在编译的时候增加“–http-realip-module”作为参数。在重新编译完成之后,还需要对配置文件做一些修改,增加如下2项配置:

set_real_ip_from   192.168.160.8;
real_ip_header     X-Forwarded-For;

其中的192.168.160.8为F5的IP地址。OK,大功告成,再次查看access log,发现client IP地址已经生效,IP白名单也工作正常了。

在nginx的官方wiki中有关于“http realip module”的说明,文中提到:“如果nginx工作在一些7层负载均衡机之后,收到的请求来自本地IP(代理服务器),但是代理服务器又在头信息中添加了源IP,这时此模块就有用啦”,言外之意,如果有些L7的代理没有在头信息中增加源地址,这个模块也就没辙了。

在nginx上搭建HTTPS服务

最近GFW抽风,动不动就把推的api proxy给封了。据我观察是根据访问内容进行关键字过滤,如果发现敏感词,就封掉这IP提供的所有HTTP服务。既然如此,就搭建个HTTPS的服务吧,应该是有效的。搭建过程记录如下:

首先,用-V参数看看当前的nginx是否在编译时载入了https模块,只要看到 “–with-http_ssl_module”就可以了。如果没有,就需要重新编译nginx。debian的默认安装很不错,集成了很多模块,为我省了不少事儿。
接下来我们先要生成密钥,通过这个密钥再去给自己颁发证书。

root@n3yang:~# openssl genrsa -out privkey.pem 1024

现在密钥已经存到了privkey.pem中了,1024位的rsa加密,对于我来讲这已经足够了。

再来就是颁发证书

root@n3yang:~# openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095

随便填就行了,但Common Name必须填即将使用HTTPS的站点名称,比如:*.n3yang.com 。

继续配置nginx,在配置文件中指定证书,加入监听端口什么的就可以了。

listen 443;
ssl on;
ssl_certificate cacert.pem;
ssl_certificate_key privkey.pem;

重启nginx后通过 https 的方式就可以访问了。

不知道这次能坚持多久,我会拭目以待地⋯⋯嘿嘿。

利用nginx实时生成缩略图

Nginx?缩略图?两个貌似不搭边儿的词语怎么可以关联到一起?但nginx自0.75版本增加了实时转换图片的功能⋯⋯换句话说,假如服务器上存储的是大图,要想展示给用户一张缩略图,可以通过nginx进行实时转换,而不用生成实体文件,这样可以很大程度的节省磁盘空间资源。

nginx的默认编译中不支持此功能,需要在编译的时候增加 –with-http_image_filter_module 参数。如果之前安装过,就需要重新编译了。编译之前最好备份一下配置文件:

cp /usr/local/webapp/nginx/conf/nginx.conf /usr/local/webapp/nginx/conf/nginx.conf.bak

编译安装:

root@n3yang:~# cd /root/soft/
root@n3yang:~# tar zxf nginx-0.8.29.tar.gz
root@n3yang:~# cd nginx-0.8.29
root@n3yang:~# ./configure --user=www --group=www --prefix=/usr/local/webapp/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_image_filter_module
root@n3yang:~# make;make install

安装完成后,需要配置nginx转换哪些图片到什么样的尺寸。
假定原图地址为 http://avatar.n3yang.com/1.jpg
转化后图片路径为 http://avatar.n3yang.com/1_(width)x(height).jpg
如果头像文件不存在,将显示默认的头像:default-avatar.jpg
括号中的width与height分别为欲转化的图片宽度和高度。例如宽为45高为65的头像,那头像地址为http://avatar.n3yang.com/1_45x65.jpg

在配置文件nginx.conf 添加配置:

location ~ /(\d+)_(\d+)x(\d+)\.(JPG|jpg|GIF|gif|PNG|png)$ {
	if (!-f /$1.$4) {
		rewrite ^ /default-avatar.jpg break;
	}
	image_filter resize $2 $3;
	image_filter_buffer 2M;
}

重新载入配置文件后才能生效。

几点说明:
1、生成缩略图只是image_filter功能中的一个,它一共支持4种参数:

test:返回是否真的是图片
size:返回图片长短尺寸
corp:截取图片的一部分
resize:缩放图片

2、可以实现backend server的图片转换。对于访问量不大,但是需求多种尺寸的网站可以使用1台图片服务器作为原图存储,在展示时使用nginx进行实时转换,以节省空间资源。

3、对于大访问量的站点,可以在nginx之前再搭建一台vanish做缓存。由vanish分担并发压力,nginx仅在图片被第一次访问时生成缩略图。这样便可以在很大程度上节省了服务器空间。这种设计也有一个问题,就是在vanish崩溃、重启之后,缓存未生成,大量图片需要进行实时转换,nginx的压力一定会很大。

Nginx像Apache一样做反向代理

我们都知道Nginx是可以做反向代理的,就像Apache的ProxyPassReverse一样。
在apache中配置反向代理,我们这样写:

<VirtualHost myhost:80>
ServerName myhost
  DocumentRoot /path/to/myapp/public
  ProxyPass / http://myapp:8080/
  ProxyPassReverse / http://myapp:8080/
</VirtualHost>

但是Nginx没有ProxyPassReverse,解决办法就是添加丢失的HTTP头:

server {
  listen myhost:80;
  server_name myhost;
  location / {
    root /path/to/myapp/public;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://myapp:8080;
  }
}

那些丢失的头信息都是什么呢?

X-Forwarded-For:客户端IP地址
X-Forwarded-Host:客户端发起的原始主机请求头信息
X-Forwarded-Server:代理服务器主机名

Debian中升级Nginx到最新1.0

新版本的Nginx中提供了很多功能,而且在生产服务器中表现也相当不错。可惜VPS上用的是Debian 6,而在apt源中提供的Nginx版本太低,只有0.7。我能想到的升级办法有3个:1、更换其他的源;2、自己重新编译;3、使用测试版本。前2种方式都比较麻烦,更何况本人对于第三方源所提供的软件感觉不正统,也不是很信任。所以第三个方法就成了最适合我的选择。更新步骤很简单,流水记录如下:
1、安装apt-spy
apt-get install apt-spy
2、测试速度最快的源地址,并切换到测试版。部分参数说明:
-a 选择镜像服务器区域。VPS在美国,所以这里使用North-america。如果在中国使用Asia
-d 选择部署版本:stable稳定版、testing测试、unstable不稳定版本
-t 服务器相应时间,默认15
apt-spy -d testing -a North-america -t 10
3、更新apt的packages list
apt-get update
4、重新安装nginx
apt-get install nginx
如果之前修改了nginx的配置文件,那么重新安装的过程中会给予是否备份的提示。当然手动备份还是最保险的~