Nginx 安装

Nginx下载地址

apt安装

1
$ apt-get install nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/usr/sbin/nginx : 主程序位置

/etc/nginx:nginx文件配置

/usr/share/nginx:存放静态文件

/var/log/nginx:存放日志

/etc/init.d/nginx start 启动Nginx

/etc/init.d/nginx restart 重启Nginx

service nginx status Nginx状态

service nginx restart 重启Nginx

源码安装

安装gcc g++的依赖库
1
2
$ apt-get install build-essential
$ apt-get install libtool
复制代码安装 pcre依赖库
1
2
$ apt-get update
$ apt-get install libpcre3 libpcre3-dev
zlib依赖库 ssl依赖库
1
2
3
$  apt-get install zlib1g-dev

$ apt-get install openssl
安装nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#下载最新版本:
wget http://nginx.org/download/nginx-1.11.3.tar.gz
#解压:
tar -zxvf nginx-1.11.3.tar.gz
#进入解压目录:
cd nginx-1.11.3
#配置:
./configure --prefix=/usr/local/nginx
#编辑nginx:
make
注意:这里可能会报错,提示“pcre.h No such file or directory”,具体详见:http://stackoverflow.com/questions/22555561/error-building-fatal-error-pcre-h-no-such-file-or-directory
需要安装 libpcre3-dev,命令为:sudo apt-get install libpcre3-dev
#安装nginx:
sudo make install
#启动nginx:
sudo /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
注意:-c 指定配置文件的路径,不加的话,nginx会自动加载默认路径的配置文件,可以通过 -h查看帮助命令。

#查看nginx进程:
ps -ef|grep nginx
基本命令
1
2
3
$ ./sbin/nginx -s reload  #重新加载配置
$ ./sbin/nginx -s stop #停止Nginx
$ /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf #启动
安装Nginx脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
sudo apt-get install -y build-essential
path=$(pwd)
echo "Download nginx...."
wget http://nginx.org/download/nginx-1.14.2.tar.gz
tar -zxvf nginx-1.14.2.tar.gz
echo "Download openssl"
wget https://www.openssl.org/source/openssl-1.0.2r.tar.gz
tar -zxf openssl-1.0.2r.tar.gz
echo "Download pcre"
wget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz
tar -zxf pcre-8.42.tar.gz
cd pcre-8.42/
./configure && make &&make install
cd ..
echo "Download zlib"
wget http://zlib.net/zlib-1.2.11.tar.gz
tar -zxf zlib-1.2.11.tar.gz
cd zlib-1.2.11/
./configure && make && make install
cd ..
echo "编译 nginx..."
cd nginx-1.14.2/ && ./configure --prefix=$path/nginx --with-pcre=$path/pcre-8.42/ --with-zlib=$path/zlib-1.2.11/ --with-http_ssl_module --with-openssl=$path/openssl-1.0.2r/ --with-stream --with-stream_ssl_module --with-http_v2_module --with-threads && make && make install

配置文件详解

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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
...                            #全局块
events{ #events 块
...
}
http{ #http 块
... #http 全局块
server{ #server 块
... #server 全局块
location [PATTERN]{ #location 块
...
}
location [PATTERN]{ #location 块
...
}
}
server{ #server 块
...
}
... #http 全局块
}


1.全局块
  全局块是默认配置文件从开始到events块之间的一部分内容,主要设置一些影响Nginx服务器整体运行的配置指令,因此,这些指令的作用域是Nginx服务器全局。
  通常包括配置运行Nginx 服务器的用户(组)、允许生成的worker process数、Nginx 进程 PID存放路径、日志的存放路径和类型以及配置文件引入等。
  2.events 块
  events 块涉及的指令主要影响Nginx 服务器与用户的网络连接。常用到的设置包括是否开启对多worker process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型处理连接请求,每个 worker process可以同时支持的最大连接数等。
  这一部分指令对 Nginx服务器的性能影响较大,在实际配置中应该根据实际情况灵活调整。
  3.http 块
  http块是Nginx 服务器配置中的重要部分,代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这个模块。可以在 http全局块中配置的指令包括文件引入、MIME-Type定义、日志自定义、是否使用sendfile传输文件、连接超时时间、单连接q 请求数上限等。
  4.server 块
  server 块和“虚拟主机”的概念有密切联系。在 server 全局块中,最常见的两个配置项是本虚拟主机的监听配置和本虚拟主机的名称或 IP 配置。
  5.location 块
  location 块的主要作用是,基于Nginx服务器接受到的q 请求字符串,对除虚拟主机名称之外的字符串j 进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能都是在这部分实现。许多第三方模块的配置也是在location块中提供功能。



#普通配置
#==性能配置


#运行用户
user nobody;
#pid文件
pid logs/nginx.pid;

#Nginx基于事件的非阻塞多路复用模型(epoll或kquene)
#一个进程在短时间内可以响应大量请求,工作进程设置与cpu数相同,避免cpu在多个进程间切换增加开销
#==worker进程数,通常设置<=CPU数量,auto为自动检测,一般设置最大8个即可,再大性能提升较小或不稳定
worker_processes auto;

#==将每个进程绑定到特定cpu上,避免进程在cpu间切换的开销
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

#==worker进程打开最大文件数,可CPU*10000设置,或设置系统最大数量655350
worker_rlimit_nofile 102400;
#全局错误日志
error_log logs/error.log;


#events模块中包含nginx中所有处理连接的设置,并发响应能力的关键配置
events {
#==每个进程同时打开的最大连接数(最大并发数)
worker_connections 102400;

#==告诉nginx收到一个新链接通知后接受尽可能多的链接
#multi_accept on;

#一般http 1.1协议下,浏览器默认使用两个并发链接
#如果是反向代理,nginx需要和客户端保持连接,还需要和后端服务器保持连接
#Http服务器时,设置max_client=worker_processes*worker_connections/2
#反向代理时,设置max_client=worker_processes*worker_connections/4
#==最大可用客户端数
#max_client

#==使用非阻塞模型,设置复用客户端线程的轮训方法
use epoll;
}


#http模块控制着nginx http处理的所有核心特性
http {
#打开或关闭错误页面中的nginx版本号等信息
server_tokens on;
#!server_tag on;
#!server_info on;
#==优化磁盘IO设置,指定nginx是否调用sendfile函数来输出文件,普通应用设为on,下载等磁盘IO高的应用,可设为off
sendfile on;

#缓存发送请求,启用如下两个配置,会在数据包达到一定大小后再发送数据
#这样会减少网络通信次数,降低阻塞概率,但也会影响响应的及时性
#比较适合于文件下载这类的大数据包通信场景
#tcp_nopush on;
#tcp_nodelay on;

#==设置nginx是否存储访问日志,关闭这个可以让读取磁盘IO操作更快
access_log on;
#设置nginx只记录严重错误,可减少IO压力
#error_log logs/error.log crit;

#Http1.1支持长连接
#降低每个链接的alive时间可在一定程度上提高响应连接数量
#==给客户端分配keep-alive链接超时时间
keepalive_timeout 30;

#设置用户保存各种key的共享内存的参数,5m指的是5兆
limit_conn_zone $binary_remote_addr zone=addr:5m;
#为给定的key设置最大的连接数,这里的key是addr,设定的值是100,就是说允许每一个IP地址最多同时打开100个连接
limit_conn addr 100;

#include指在当前文件中包含另一个文件内容
include mime.types;
#设置文件使用默认的mine-type
default_type text/html;
#设置默认字符集
charset UTF-8;

#==设置nginx采用gzip压缩的形式发送数据,减少发送数据量,但会增加请求处理时间及CPU处理时间,需要权衡
gzip on;
#==加vary给代理服务器使用,针对有的浏览器支持压缩,有个不支持,根据客户端的HTTP头来判断是否需要压缩
gzip_vary on;
#nginx在压缩资源之前,先查找是否有预先gzip处理过的资源
#!gzip_static on;
#为指定的客户端禁用gzip功能
gzip_disable "MSIE[1-6]\.";
#允许或禁止压缩基于请求和相应的响应流,any代表压缩所有请求
gzip_proxied any;
#==启用压缩的最少字节数,如果请求小于1024字节则不压缩,压缩过程会消耗系统资源
gzip_min_length 1024;
#==数据压缩等级,1-9之间,9最慢压缩比最大,压缩比越大对系统性能要求越高
gzip_comp_level 2;
#需要压缩的数据格式
gzip_types text/plain text/css text/xml text/javascript application/json application/x-javascript application/xml application/xml+rss;

#静态文件缓存
#==开启缓存的同时也指定了缓存文件的最大数量,20s如果文件没有被请求则删除缓存
open_file_cache max=100000 inactive=20s;
#==多长时间检查一次缓存的有效期
open_file_cache_valid 30s;
#==有效期内缓存文件最小的访问次数,只有访问超过2次的才会被缓存
open_file_cache_min_uses 2;
#当搜索一个文件时是否缓存错误信息
open_file_cache_errors on;

#==允许客户端请求的最大单文件字节数
client_max_body_size 4m;
#==客户端请求头缓冲区大小
client_header_buffer_size 4k;

#是否启用对发送给客户端的URL进行修改
proxy_redirect off;
#后端的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;
#==nginx跟后端服务器连接超时时间(代理连接超时)
proxy_connect_timeout 60;
#==连接成功后,后端服务器响应时间(代理接收超时)
proxy_read_timeout 120;
#==后端服务器数据回传时间(代理发送超时)
proxy_send_timeout 20;
#==设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffer_size 32k;
#==proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_buffers 4 128k;
#==高负荷下缓冲大小(proxy_buffers*2)
proxy_busy_buffers_size 256k;
#==设定缓存文件夹大小,大于这个值,将从upstream服务器传
proxy_temp_file_write_size 256k;
#==1G内存缓冲空间,3天不用删除,最大磁盘缓冲空间2G
proxy_cache_path /home/cache levels=1:2 keys_zone=cache_one:1024m inactive=3d max_size=2g;


#设定负载均衡服务器列表
upstream nginx.test.com{
#后端服务器访问规则
#ip_hash;
#weight参数表示权重值,权值越高被分配到的几率越大
#server 10.11.12.116:80 weight=5;
#PC_Local
server 10.11.12.116:80;
#PC_Server
server 10.11.12.112:80;
#Notebook
#server 10.11.12.106:80;
}

#server代表虚拟主机,可以理解为站点(挂载多个站点,只需要配置多个server及upstream节点即可)
server {
#监听80端口
listen 80;
#识别的域名,定义使用nginx.test.com访问
server_name nginx.test.com;
#设定本虚拟主机的访问日志
access_log logs/nginx.test.com.access.log;

#一个域名下匹配多个URI的访问,使用location进行区分,后面紧跟着的/代表匹配规则
#如动态资源访问和静态资源访问会分别指向不同的位置的应用场景
#
# 基本语法规则:location [=|~|~*|^~] /uri/ {...}
# = 开头表示精确匹配
# ^~ 开头表示uri以某个常规字符串开头,匹配成功后不再进行正则匹配
# ~ 开头表示区分大小写的正则匹配
# ~* 开头表示不区分大小写的正则匹配
# !~ 开头表示区分大小写的不匹配的正则
# !~* 开头表示不区分大小写的不匹配的正则
# / 通用匹配,任何请求都会被匹配到
#
# 理解如下:
# 有两种匹配模式:普通字符串匹配,正则匹配
# 无开头引导字符或以=开头表示普通字符串匹配
# 以~或~*开头表示正则匹配,~*表示不区分大小写
# 【多个location时,先匹配普通字符串location,再匹配正则location】
# 只识别URI部分,例如请求为“/test/1/abc.do?arg=xxx”
# (1)先查找是否有=开头的精确匹配,即“location=/test/1/abc.do {...}”
# (2)再查找普通匹配,以“最大前缀”为规则,如有以下两个location
# location /test/ {...}
# location /test/1/ {...}
# 则匹配后一项
# (3)匹配到一个普通location后,搜索并未结束,而是暂存当前结果,并继续进行正则搜索
# (4)在所有正则location中找到第一个匹配项后,以此匹配项为最终结果
# 【所以正则匹配项,匹配规则受定义前后顺序影响,但普通匹配不会】
# (5)如果未找到正则匹配项,则以(3)中缓存的结果为最终结果
# (6)如果一个匹配都没有,则返回404
# location =/ {...}与location / {...}的差别
# 前一个是精确匹配,只响应“/”的请求,所有“/xxx”形式的请求不会以“前缀匹配形式”匹配到它
# 后一个正相反,所有请求必然都是以“/”开头,所以没有其他匹配结果时一定会执行到它
# location ^~ / {...} ^~的意思是禁止正则匹配,表示匹配到此项后不再进行后续的正则搜索
# 相当于普通匹配模式匹配成功后就以此结果为最终结果,停止进行后续的正则匹配
location / {
#定义服务器的默认网站根目录位置,可以写相对路径,也可以写绝对路径
root html;
#定义首页索引文件的名称
index index.html index.htm;
#定义转发后端负载服务器组
proxy_pass http://nginx.test.com;
}

#定义错误提示页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
#静态文件,nginx自己处理
location ~ ^/(images|javascript|js|css|flash|media|static)/{
root /var/www/virtual/htdocs;
#过期时间1天
expires 1d;
#关闭媒体文件日志
access_log off;
log_not_found off;
}
#设定查看Nginx状态的地址
location /NginxStatus {
#!stub_status on; #无此关键字
access_log off;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
}
#禁止访问的文件.htxxx
location ~ /\.ht {
#deny all;禁止访问,返回403
deny all;
#allow all;允许访问
}
}
#网站较多的情况下ngxin又不会请求瓶颈可以考虑挂多个站点,并把虚拟主机配置单独放在一个文件内,引入进来
#include website.conf;
}