首页 > Java > Nginx配置使用入门

Nginx配置使用入门

Nginx作为当今数一数二的负载均衡服务器,应用十分广泛,今天记录一下,大名鼎鼎的Nginx的配置信息

1. 一个简单的负载均衡的示例,把www.domain.com均衡到本机不同的端口,也可以改为均衡到不同的地址上。


http {
	upstream myproject {
	        server 127.0.0.1:8000 weight=3;
	        server 127.0.0.1:8001;
	        server 127.0.0.1:8002;
	        server 127.0.0.1:8003;
	}

	server {
		listen 80;
		server_name www.domain.com;
		location / {
			proxy_pass http://myproject;
		}
	}
}

weight就是权重,数值越大,分配到这个服务器的概率就越大,以本例来说,分配8000上的概率为二分之一,其他的三个均为为六分之一,另外需要注意的是:proxy_pass和upstream一定要一样

注:这么配置仅仅是解决了负载均衡的问题,但是没有解决session共享的问题,为了解决session共享我们有两个方案:
1. 配置粘连,也就是说,只要某一个请求被分配到该服务器,那么今后的该客端的所有请求全都分配到该服务器上;
2. 在代码中解决session共享问题
目前针对这两种方案,我都不是很熟悉,我将来会写一篇文章来解决这个问题

2. 静态资源处理


location ~ .(jpg|png|jpeg|bmp|gif|swf|css|js)$ {
	expires 30d;
	root /nginx-1.8.0;#root
	break;
}

就是说上面的这些静态资源文件都是相对于:/nginx-1.8.0的,所以如果我们代码中写的路径是img/bridgeli.png,那么我们就需要在nginx-1.8.0建一个img目录,把我们bridgeli.png放在里面。

3. 完整示例


#!nginx
# 使用的用户和组
user  www www;
# 指定工作衍生进程数
worker_processes  2;
# 指定 pid 存放的路径
pid /var/run/nginx.pid;

# [ debug | info | notice | warn | error | crit ] 
# 可以在下方直接使用 [ debug | info | notice | warn | error | crit ]  参数
error_log  /var/log/nginx.error_log  info;

events {
	# 允许的连接数
	connections   2000;
	# use [ kqueue | rtsig | epoll | /dev/poll | select | poll ] ;
	# 具体内容查看 http://wiki.codemongers.com/事件模型
	use kqueue;
}

http {
	include       conf/mime.types;
	default_type  application/octet-stream;

	log_format main      '$remote_addr - $remote_user [$time_local]  '
	'"$request" $status $bytes_sent '
	'"$http_referer" "$http_user_agent" '
	'"$gzip_ratio"';

	log_format download  '$remote_addr - $remote_user [$time_local]  '
	'"$request" $status $bytes_sent '
	'"$http_referer" "$http_user_agent" '
	'"$http_range" "$sent_http_content_range"';

	client_header_timeout  3m;
	client_body_timeout    3m;
	send_timeout           3m;

	client_header_buffer_size    1k;
	large_client_header_buffers  4 4k;

	gzip on;
	gzip_min_length  1100;
	gzip_buffers     4 8k;
	gzip_types       text/plain;

	output_buffers   1 32k;
	postpone_output  1460;

	sendfile         on;
	tcp_nopush       on;
	tcp_nodelay      on;
	send_lowat       12000;

	keepalive_timeout  75 20;

	#lingering_time     30;
	#lingering_timeout  10;
	#reset_timedout_connection  on;


	server {
		listen        one.example.com;
		server_name   one.example.com  www.one.example.com;

		access_log   /var/log/nginx.access_log  main;

		location / {
			proxy_pass         http://127.0.0.1/;
			proxy_redirect     off;

			proxy_set_header   Host             $host;
			proxy_set_header   X-Real-IP        $remote_addr;
			#proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;

			client_max_body_size       10m;
			client_body_buffer_size    128k;

			client_body_temp_path      /var/nginx/client_body_temp;

			proxy_connect_timeout      90;
			proxy_send_timeout         90;
			proxy_read_timeout         90;
			proxy_send_lowat           12000;

			proxy_buffer_size          4k;
			proxy_buffers              4 32k;
			proxy_busy_buffers_size    64k;
			proxy_temp_file_write_size 64k;

			proxy_temp_path            /var/nginx/proxy_temp;

			charset  UTF-8;
		}

		error_page  404  /404.html;

		location /404.html {
			root  /spool/www;

			charset         on;
			source_charset  UTF-8;
		}

		location /old_stuff/ {
			rewrite   ^/old_stuff/(.*)$  /new_stuff/$1  permanent;
		}

		location /download/ {

			valid_referers  none  blocked  server_names  *.example.com;

			if ($invalid_referer) {
				#rewrite   ^/   http://www.example.com/;
				return   403;
			}

			#rewrite_log  on;

			# rewrite /download/*/mp3/*.any_ext to /download/*/mp3/*.mp3
			rewrite ^/(download/.*)/mp3/(.*)..*$
			/$1/mp3/$2.mp3                   break;

			root         /spool/www;
			#autoindex    on;
			access_log   /var/log/nginx-download.access_log  download;
		}

		location ~* ^.+.(jpg|jpeg|gif)$ {
			root         /spool/www;
			access_log   off;
			expires      30d;
		}
	}
}

这是Nginx官方网站的一个例子,说实话里面的很多配置我也不是很清楚,但很多并不是非常难以理解

4. 如果我们有多个配置,全放到nginx.conf里面,那么会显得非常的乱,所以Nginx支持我们可以在其他地方创建一个我们自己的conf文件,然后在nginx.conf中引入就行,


    #access_log  logs/access.log  main;

    include       /home/devtool/nginx/conf/vhosts/*.conf;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

*.conf表示引入该目录下的所有配置文件,那么我们的其中一个配置文件就可以这么写


server {
	listen  80;
	server_name weixin.yuyime.com;

    access_log /opt/log/weixin.log  main;
	charset UTF-8;
	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_pass http://120.27.37.68:80;
  ##              proxy_redirect off;
  ##              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  ##              proxy_set_header Host mooc.chaoxing.com;
  ##              proxy_set_header Connection Close;
  ##              client_max_body_size 2g;
  ##              client_body_buffer_size 128k;
  ##               proxy_connect_timeout 120;
  ##              proxy_read_timeout 90;
  ##              proxy_send_timeout 60;
  ##              proxy_buffers 8 64k;
  ##              fastcgi_buffers 8 128k;
  ##              proxy_busy_buffers_size 64k;
  ##              proxy_temp_file_write_size 128k;
}

5. Nginx常用命令


nginx.exe				启动服务,直接运行,缺点控制台窗口关闭,服务关闭。
start nginx.exe			守护进程的方式启动
nginx -s stop			快速关闭Nginx,可能不保存相关信息,并迅速终止web服务
Nginx -s quit         	平稳关闭Nginx,保存相关信息,有安排的结束web服务
nginx -s  reload		因改变了Nginx相关配置,需要重新加载配置而重载

以前感觉负载均衡Nginx好复杂的一个东西,现在发现其实也并不难,相信大家根据老夫这篇小文章,就可以配出自己的Nginx的

2015.05.28 补记:
1. 负载均衡的示例中并没有解决session共享问题,其实配粘性session特别简单,只需加一个ip_hash即可,即:


http {
	upstream myproject {
                ip_hash;
	        server 127.0.0.1:8000 weight=3;
	        server 127.0.0.1:8001;
	        server 127.0.0.1:8002;
	        server 127.0.0.1:8003;
	}

	server {
		listen 80;
		server_name www.domain.com;
		location / {
			proxy_pass http://myproject;
		}
	}
}

粘性session存在的问题:因为一个人的请求固定分配到某一确定的服务器上,所以当该服务器挂掉之后,那么该用户的session也就没了,后果大家都懂得,不过这种方法用来解决服务器集群session共享是最简单的,为彻底解决这个问题,可以使用:memcached-session-manager

参考资料:http://wiki.nginx.org/NginxChs

分享到:
作 者: BridgeLi,http://www.bridgeli.cn/
原文链接:https://www.bridgeli.cn/archives/170
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
分类: Java 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.