本文是博主自学Nginx时整理的笔记,通过在网上多处搜集资料并整理。部分内容摘自其他文章,文章来源已经记不清了。
侵删。
Nginx(发音同engine x)是一个异步框架的 Web服务器,也可以用作反向代理,负载平衡器 和 HTTP缓存。
代理:生活中就比如我们去某些厂商的专卖店去买东西,专卖店就是代理,被代理的角色就是厂商,目标角色就是用户。
反向代理:主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。
正向代理:客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。
负载均衡:将服务器接收到的请求按照规则分发的过程。
硬负载:直接在服务器和外部网络间安装负载均衡设备,负载均衡器
软负载:在一台或多台服务器相应的操作系统上安装一个或多个附加软件来实现负载均衡
... #全局块
events {
#events块
...
}
http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
2.结构详解
全局块
:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
events块
:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
http块
:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
server块
:配置虚拟主机的相关参数,一个http中可以有多个server。
location块
:配置请求的路由,以及各种页面的处理情况。
Nginx主要功能:1、代理服务 2、负载均衡 3、静态资源(动静分离) 4、缓存服务
正向代理配置的指令:
resolver指令:用于指定DNS服务器IP地址
resolver_timeout指令:用于设置DNS域名解析超时时间
proxy_pass指令:用于设置代理服务器的协议和地址
因为正向代理服务的场合不多,所以指令较少,功能也比较简单。
反向代理配置的指令:
proxy_pass指令:用于设置被代理服务器的地址
upstream指令:这个配置是写一组被代理的服务器地址,然后配置负载均衡的算法
语法结构:
proxy_pass URL;
URL包含传输协议、主机名称或者IP地址加端口号等要素。
传输协议通常是"http"或者"https"
注意upstream和proxy_pass搭配使用的两种情况
(1)proxy_list中指明了传输协议
upstream proxy_list
{
server http://192.168.1.100:8080/uri/;
server http://192.168.1.200:8080/uri/;
}
server
{
location /
{
proxy_pass proxy_list;
}
}
(2)proxy_list中没传输协议
upstream proxy_list
{
server 192.168.1.100:8080/uri/;
server 192.168.1.200:8080/uri/;
}
server
{
location /
{
proxy_pass http://proxy_list;
}
}
还有需要注意URL中是否包含URI,以访问"http://www.test.com/test/index.html"为例
server{
server_name www.test.com;
location /test/
{
#proxy_pass http://192.168.12.19; --->转到"http://192.168.12.19/test/index.html"
#proxy_pass http://192.168.12.19/index/; --->转到"http://192.168.12.19/index/index.html"
#proxy_pass http://192.168.12.19/; --->转到"http://192.168.12.19/index.html"
}
}
其他指令:
location / {
index index.jsp;
proxy_pass http://proxy_list; #在这里设置一个代理,和upstream的名字一样
#以下是一些反向代理的配置可删除
proxy_redirect off;#没有重定向就配置成默认,除非后端返回301情况下设置成具体重定向地址
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
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; #缓冲区代理缓冲用户端请求的最大字节数
proxy_connect_timeout 300; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 300; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 300; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
}
代理服务器组的配置:
upstream proxy_list{
server 192.168.1.100:8080;
server 192.168.1.200:8080;
}
server {
....
location ~*^.+$ {
proxy_pass http://proxy_list; #请求转向proxy_list定义的服务器列表
}
负载均衡策略主要有以下四种:
upstream proxy_list{
server 192.168.1.100:8080;
server 192.168.1.200:8080 backup; #热备
}
upstream proxy_list{
server 192.168.1.100:8080;
server 192.168.1.200:8080;
}
upstream proxy_list{
server 192.168.1.100:8080 weight=1;
server 192.168.1.200:8080 weight=2;
}
upstream proxy_list{
ip_hash;
server 192.168.1.100:8080;
server 192.168.1.200:8080;
}
关于nginx负载均衡配置的几个状态参数讲解。
upstream mysvr {
server 192.168.1.100:8080 weight=2 max_fails=2 fail_timeout=2;
server 192.168.1.200:8080 weight=1 max_fails=2 fail_timeout=1;
}
为了提高网站的响应速度,减轻程序服务器(Tomcat,Jboss等)的负载,对于静态资源比如图片,js,css等文件,我们可以在反向代理服务器中进行缓存,这样浏览器在请求一个静态资源时,代理服务器就可以直接处理,而不用将请求转发给后端服务器。用户请求的动态文件比如servlet,jsp则转发给Tomcat,Jboss服务器处理,这就是动静分离。这也是反向代理服务器的一个重要的作用。
静态文件的请求比如:gif、jpg、js、css等静态资源请求,由Nginx进行处理,配置如下:
location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma|js|css)$
{
root /usr/webapps;
expires 30d;
}
完整的配置:
#vim /usr/local/nginx/conf/nginx.conf
upstream node {
server 192.9.191.31:8081;
server 192.9.191.31:8082;
}
proxy_cache_path /cache levels=1:2 keys_zone=cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
listen 80;
server_name www.test.com;
index index.html;
if ($request_uri ~ ^/(static|login|register|password)) {
set $cookie_nocache 1;
}
location / {
proxy_pass http://node;
proxy_cache cache;
proxy_cache_valid 200 304 12h;
proxy_cache_valid any 10m;
add_header Nginx-Cache "$upstream_cache_status";
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_no_cache $cookie_nocache $arg_nocache $arg_comment;
proxy_no_cache $http_pargma $http_authorization;
}
}
参数详解:
proxy_cache_path /soft/cache levels=1:2 keys_zone=cache:10m max_size=10g inactive=60m use_temp_path=off;
#proxy_cache //存放缓存临时文件
#levels //按照两层目录分级
#keys_zone //开辟空间名,10m:开辟空间大小,1m可存放8000key
#max_size //控制最大大小,超过后Nginx会启用淘汰规则
#inactive //60分钟没有被访问缓存会被清理
#use_temp_path //临时文件,会影响性能,建议关闭
proxy_cache cache;
proxy_cache_valid 200 304 12h;
proxy_cache_valid any 10m;
add_header Nginx-Cache "$upstream_cache_status";
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
#proxy_cache //开启缓存
#proxy_cache_valid //状态码200|304的过期为12h,其余状态码10分钟过期
#proxy_cache_key //缓存key
#add_header //增加头信息,观察客户端respoce是否命中
#proxy_next_upstream //出现502-504或错误,会跳过此台服务器访问下一台服务器
部分页面不加缓存,通过以下配置实现。
if ($request_uri ~ ^/(static|login|register|password)) {
set $cookie_nocache 1;
}
清理缓存:
1.rm删除已缓存的数据
rm -rf /cache/*
2.通过ngx_cache_purge扩展模块清理,需要编译安装nginx
user nobody; #配置用户或者组,默认为nobody nobody。
worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
#error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events{
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
http{
#设置默认类型为二进制流
default_type application/octet-stream;
server_names_hash_bucket_size 128;
#指定来自客户端请求头的headerbuffer大小,设置为32KB
client_header_buffer_size 32k;
#指定客户端请求中较大的消息头的缓存最大数量和大小,这里是4个32KB
large_client_header_buffers 4 32k;
#上传文件大小
client_max_body_size 356m;
#nginx的HttpLog模块指定,指定nginx日志的输出格式,输出格式为access
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#access日志存在未知
access_log /var/log/nginx/access.log access;
#开启高效模式文件传输模式,将tcp_nopush和tcp_nodelay两个指另设置为on,用于防止网络阻塞。
sendfile on;
tcp_nopush on;
tcp_nodelay on;
#设置客户端连接保持活动的超时时间
keepalive_timeout 65;
server_tokens off;
#客户端请求主体读取缓存
client_body_buffer_size 512k;
proxy_connect_timeout 5;
proxy_send_timeout 60;
proxy_read_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
#开启gzip
gzip on;
#允许压缩的最小字节数
gzip_min_length 1k;
#4个单位为16k的内存作为压缩结果流缓存
gzip_buffers 4 16k;
#设置识别HTTP协议版本,默认是1.1
gzip_http_version 1.1;
#gzip压缩比,可在1~9中设置,1压缩比最小,速度最快,9压缩比最大,速度最慢,消耗CPU
gzip_comp_level 2;
#压缩的类型
gzip_types text/plain application/x-javascript text/css application/xml;
#让前端的缓存服务器混村经过的gzip压缩的页面
gzip_vary on;
upstream mycluster{
server 192.168.1.100:8080 weight=1;
server 192.168.1.200:8080 weight=1;
}
server{
listen 8080;
server_name 192.168.32.228;
charset utf-8; #设置编码为utf-8;
#location / {
# root html;
# index index.html index.htm;
#}
#location ~ .*\.(jsp|do|action)$
location / {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_pass http://mycluster;
# 真实的客户端IP
proxy_set_header X-Real-IP $remote_addr;
# 请求头中Host信息
proxy_set_header Host $host;
# 代理路由信息,此处取IP有安全隐患
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 真实的用户访问协议
proxy_set_header X-Forwarded-Proto $scheme;
deny 127.0.0.1; #拒绝的ip
allow all; #允许的ip
}
#静态文件交给nginx处理
location ~ .*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{
root /usr/local/webapps;
expires 30d;
}
#静态文件交给nginx处理
location ~ .*\.(js|css)?$
{
root /usr/local/webapps;
expires 1h;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}