nginx配置

nginx常用编译参数

对于nginx,如果使用源码安装,在进行./configure编译的时候,需要为其指定一些参数。

  • –prefix=PATH : 指定nginx的安装目录。默认 /usr/local/nginx
  • –conf-path=PATH : 设置nginx.conf配置文件的路径。nginx允许使用不同的配置文件启动,通过命令行中的-c选项。默认为prefix/conf/nginx.conf
  • –user=name: 设置nginx工作进程的用户。安装完成后,可以随时在nginx.conf配置文件更改user指令。默认的用户名是nobody。–group=name类似
  • –with-pcre : 设置PCRE库的源码路径,如果已通过yum方式安装,使用–with-pcre自动找到库文件。使用–with-pcre=PATH时,需要从PCRE网站下载pcre库的源码(版本4.4 – 8.30)并解压,剩下的就交给Nginx的./configure和make来完成。perl正则表达式使用在location指令和 ngx_http_rewrite_module模块中。
  • –with-zlib=PATH : 指定 zlib(版本1.1.3 – 1.2.5)的源码解压目录。在默认就启用的网络传输压缩模块ngx_http_gzip_module时需要使用zlib 。
  • –with-http_ssl_module : 使用https协议模块。默认情况下,该模块没有被构建。前提是openssl与openssl-devel已安装
  • –with-http_stub_status_module : 用来监控 Nginx 的当前状态
  • –with-http_realip_module : 通过这个模块允许我们改变客户端请求头中客户端IP地址值(例如X-Real-IP 或 X-Forwarded-For),意义在于能够使得后台服务器记录原始客户端的IP地址
  • –add-module=PATH : 添加第三方外部模块,如nginx-sticky-module-ng或缓存模块。每次添加新的模块都要重新编译(Tengine可以在新加入module时无需重新编译)

config基本配置概览

Nginx的配置文件默认在Nginx程序安装目录的conf目录下,其中核心文件为nginx.conf,当然你也可以自己写配置文件,然后在nginx.conf中引用。

nginx.conf配置具体信息如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#定义Nginx运行的用户和用户组
user www www;
#nginx进程数,建议设置为等于CPU总核心数。
worker_processes 8;
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;
#进程文件
pid /var/run/nginx.pid;
#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。
worker_rlimit_nofile 65535;
#工作模式与连接数上限
events
{
#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
#单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 65535;
}

#设定http服务器
http
{
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型
#charset utf-8; #默认编码
server_names_hash_bucket_size 128; #服务器名字的hash表大小
client_header_buffer_size 32k; #上传文件大小限制
large_client_header_buffers 4 64k; #设定请求缓
client_max_body_size 8m; #设定请求缓
sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。
tcp_nopush on; #防止网络阻塞
tcp_nodelay on; #防止网络阻塞
keepalive_timeout 120; #长连接超时时间,单位是秒

#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;

#gzip模块设置
gzip on; #开启gzip压缩输出
gzip_min_length 1k; #最小压缩文件大小
gzip_buffers 4 16k; #压缩缓冲区
gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
gzip_comp_level 2; #压缩等级
gzip_types text/plain application/x-javascript text/css application/xml;
#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
gzip_vary on;
#limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用

upstream blog.ha97.com {
#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。
server 192.168.80.121:80 weight=3;
server 192.168.80.122:80 weight=2;
server 192.168.80.123:80 weight=3;
}

#虚拟主机的配置
server
{
#监听端口
listen 80;
#域名可以有多个,用空格隔开
server_name www.ha97.com ha97.com;
index index.html index.htm index.php;
root /data/www/ha97;
location ~ .*.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
#图片缓存时间设置
location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 10d;
}
#JS和CSS缓存时间设置
location ~ .*.(js|css)?$
{
expires 1h;
}
#日志格式设定
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
#定义本虚拟主机的访问日志
access_log /var/log/nginx/ha97access.log access;

#对 "/" 启用反向代理
location / {
proxy_pass http://127.0.0.1:88;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#以下是一些反向代理的配置,可选。
proxy_set_header Host $host;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
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服务器传
}

#设定查看Nginx状态的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
}

#本地动静分离反向代理配置
#所有jsp的页面均交由tomcat或resin处理
location ~ .(jsp|jspx|do)?$ {
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://127.0.0.1:8080;
}
#所有静态文件由nginx直接读取不经过tomcat或resin
location ~ .*. (htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$
{ expires 15d; }
location ~ .*.(js|css)?$
{ expires 1h; }
}
}

nginx常用配置说明

nginx日志文件配置

关于日志文件的配置主要有两个属性log_format、access_log、error_log。

log_format

log_format为日志格式,其语法为:

1
log_format name format {format ... }

其中,name表示日志名字,format表示定义的格式样式。

log_format有一个默认的、无需配置的combined日志格式:

1
2
3
log_format combined '$remote_addr-$remote_user [$time_local]'
"$request"$status $body_bytes_sent
"$http_referer" "$http_user_agent"

在日志格式中的变量主要有:

参数 说明 示例
$remote_addr 反向代理服务器的IP地址 127.0.0.1
$remote_user 远程客户端用户名称
$time_local 访问时间与时区 18/Jul/2012:17:00:01 +0800
$request 请求URL与HTTP协议 GET /article-10000.html HTTP/1.1
$status 请求状态,例如成功时状态为200,页面找不到时状态为404 200
$body_bytes_sent 发送客户端的文件主体内容大小 1000
$upstream_status upstream状态 200
$http_referer 访问来源 https://www.baidu.com/
$http_user_agent 客户浏览器的相关信息 Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; GTB7.0; .NET4.0C;
$ssl_protocol SSL协议版本 TLSv1
$ssl_cipher 交换数据中的算法 RC4-SHA
$upstream_addr 后台upstream的地址,即真正提供服务的主机地址 10.10.10.100:80
$request_time 整个请求的总时间 0.205
$upstream_response_time 请求过程中,upstream响应时间 0.002
$http_host 请求地址,即浏览器中你输入的地址(IP或域名) www.baidu.com 192.168.1.1

access_log

access_log主要用于记录nginx访问日志。其语法如下:

1
access_log path [foramt {buffer-size | off} 

关闭日志方法:access_log off。

使用默认combined格式记录日志:access_log path。

使用自定义格式记录日志,首先定义一个log_format,如log_format customformat ‘具体配置’。

access_log path customformat buffer=32k。

结尾的buffer代表缓冲区大小。

error_log

与access_log不同的是,error_log主要记录nginx运行过程中的错误日志。其语法如下

1
error_log <FILE> <LEVEL>

其中参数含义如下:

  • FILE:代表日志文件存放目录。
  • LEVEL:错误日志级别。

常见的错误日志级别有:debug | info | notice | warn | error | crit | alert | emerg ,级别越高记录的错误信息越少。对于我们而言,一般用到的为warn,error,crit。

nginx压缩输出

nginx压缩输出使用的技术为gzip(GNU-ZIP)压缩技术。经过gzip压缩后的页面大小可以变为原来的30%以下,压缩页面后可以降低用户在浏览页面时下载资源的时间,但gzip有个明显的去诶按,就是需要服务端与客户端同步支持gzip,即服务器压缩,浏览器解压。目前IE、Chrome等主流浏览器均具备解压gzip的功能。

nginx中的gzip指令如下:

开启或关闭gzip

1
gzip on|off

设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流

1
gzip_buffers number size

设置gzip压缩比例

1
gzip_comp_level 1..9

设置允许压缩的页面最小字节数,当页面超过该数值时才进行压缩,其默认为0,即所有页面都进行压缩

1
gzip_min_length length

nginx作为静态服务器

nginx其根本上是一个HTTP服务器,可以将服务器撒花姑娘的静态资源文件(如HTML、JS、Image)通过HTTP协议展现给客户端。

1
2
3
4
5
6
server {
listen 80; # 端口号
location / {
root /usr/share/nginx/html; # 静态文件路径
}
}

nginx负载均衡与反向代理

负载均衡

负载均衡就是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种负载分担技术,将外部送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。

常见的复杂均衡主要有:

  • 用户手动选择:通过用户手动选择线路。
  • DNS轮询:为域名添加多个解析记录。
  • 四/七层负载均衡设备:硬件实现负载均衡,如F5。软件实现为LVS。
  • Nginx负载均衡

反向代理

反向代理是指以代理服务器来接受Internet上的连接请求,然后将请求发给内部网路上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

具体实现

在nginx中,通过Upstream可以设置一组在proxy_pass和fastcgi_pass指令中使用的代理服务器,默认的负载均衡方式为轮询,Upstream模块中的Server指令用于指定后端服务器的名称和参数,服务器的名称可以是一个域名、一个IP地址、端口号或UNIX Socket。

而在server{}虚拟主机内,可以通过proxy_pass和fastcgi_pass指令设置进行反向代理的服务器集群。

proxy_set_header指令用于在向反向代理的后端Web服务器发起请求时添加指定的Header头信息。

当后端Web服务器上有多个基于域名的虚拟主机时,要通过添加Header头信息Host,用于指定请求的域名,这样后端Web服务器才能识别该方向代理访问请求由哪一个虚拟主机来处理。

在使用方向代理后,连接通过代理服务器链接到目标服务器后,如果在目标服务器中存在获取用户真实IP的代码(比如,Java、PHP等后台语言)就会失效,这时服务器获取的是代理服务器的IP。如果要获取真实IP,需要在nginx反向代理配置里添加Header头信息:X-Forwarded-For,让目标服务器能够获取用户的真实IP。

具体配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
upstream baidu.com {
# weight 设置权重
server 127.0.0.1:8881 weight=3;
server 127.0.0.1:8882;
server 127.0.0.1:8888;
}
server{
listen 80;
server_name baidu.com;
location / {
proxy_pass http://baidu.com;
proxy_set_header Host $host;
#获取真实IP设置
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}