——前言
其实我几乎每次写文章的时候都会在前面写一小段话再开始主体部分,这篇文章只是我个人的一个学习笔记,并非经验的总结,每次在看完一本书的一个模块的时候我就习惯性的抽丝剥茧似的把我所了解到的重点或者知识点,加上我自己的理解融为一体,用我自己的描述方式记录成文章,这里主要是参考的《Nginx高性能的Web服务器详解》一书。针对Nginx的基础配置作以介绍,如果要了解Nginx在服务器端的安装可以参考《服务器搭建LNMP环境》一文。
1、Nginx基础功能配置
1.1、Nginx 功能特性
Nginx服务器的功能非常丰富,它可以作为HTTP服务器,也可以作为反向代理或者邮件服务器,并能够快速的响应页面的请求,支持FastCGI、SSL、Virtual Host、URL Rewrite、HTTP Basic Auth 、Gzip,等大量的功能,恕寡闻的我也只知道一部分功能的使用。
1.2、Nginx服务的启/停/升级控制
以下的命令都是在Linux系统下。
服务器常用指令
nginx -?,-h
//显示帮助信息
nginx -v
//打印版本号并退出
nginx -V
//打印版本号和配置并退出
nginx -t
//测试配置的正确性并退出
nginx -q
//测试配置时只显示错误
...
服务器的启动/重启
不过我用了很久还是感觉使用service nginx start
很方便直接的命令,重启也是如此service nginx restart
,个人喜好!而且还有一些别的方式启动和重启,例如指定到Nginx的目录下在跟上启动参数。
当然还有nginx的平滑重启。
服务器的停止
关于停止要单独的提出来写一下,是因为对于Nginx的停止可以使快速停止和平缓停止,分别解释一下:
快速停止:立即停止当前Nginx服务器正在处理的所有网络请求,马上丢弃链接,停止工作。
平缓停止:是指允许Nginx服务器允许当前的网络请求处理完成但不再接受新的请求,之后关闭连接,停止工作。
命令为:
./bin/nginx -g TERM | INT | QUIT
其中TERM和INT是快速停止,QUIT用于缓慢停止。
另外在推荐一条简单粗暴的停止命令service nginx stop
。即可
可以使用
ps -ef | grep nginx
命令来查看Nginx服务器的进程状态
Nginx服务器的升级
…
1.3、nginx服务器基础配置指令
默认文件为nginx.conf
文件
该文件包含几大块:全局块
、events
、http
、server
、location
其文件结构如下:
//全局块
...
//events块
events{
...
}
//http块
http{
//server块
server{
//location块
location{
...
}
//location块
location{
...
}
}
//server块
server{
//location块
location{
...
}
}
}
1.4、参数详解(nginx.conf文件完整详解)
#### 全局模块 ####
user nginx;
# 配置允许运行Nginx服务器的用户和用户组
worker_processes数 auto;
# Nginx进程生成的worker_processes数,值越大可以支持处理的并发量越大(和服务器系统和硬件挂钩)
error_log /var/log/nginx/error.log;
# 错误日志存放路径
pid /var/run/nginx.pid;
# Nginx运行时的pid存放路径和名称
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
# 配置最大连接数
}
http {
log_format main "$remote_addr - $remote_user [$time_local] "$request" "
"$status $body_bytes_sent "$http_referer" "
""$http_user_agent" "$http_x_forwarded_for"";
# 指令默认定义的日志格式字符串名称,与access_log结合使用
access_log /var/log/nginx/access.log main;
sendfile on;
# 用于开启或关闭使用sendfile传输文件,可以与sendfile_max_chunk size设置每个进程传输的最大值,0为无限制。
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
# 配置链接超时时间
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 定义MIME-Type
# server块
server {
listen 80 default_server; # 配置监听端口和主机名称
server_name xxxx.com www.xxxx.com;
index index.html index.php; # 默认首页
location / {
index index.html index.php; # 默认首页文件
root /myweb; # 根目录
}
location /admin {
autoindex on;
index index.html index.php;
proxy_pass http://127.0.0.1:801; # 正向代理到服务器本地的地址。
}
# 404默认页面,可以在location = /40x.html中配置指定页面的路径
error_page 404 /404.html;
location = /40x.html {
}
# 500 502 503 504默认页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
小结
当我们没配置一个server
的时候,Nginx相当于开启了一个新的虚拟机进程,其之间独立,但同时都依赖于全局配置及http、events两个模块的内容,所以我们可以开启多个server
进程去监听不同的端口,并通过server_name
来实现不同的域名指向同一服务器,并解析到不同的虚拟机上。同时还可以通过配置不同的location
属性来匹配不同的请求,转发到不同路径下。
关于MIME-Type在Nginx中,其用来Nginx默认可以解析的文件,也可以通过自定义的形式进行配置。
以上是一些Nginx的基础配置方式,完全可以作用于一些基础的使用,关于一些高级的功能,后续再谈… …
2、Nginx服务器高级配置
2.1、针对IPv4的内核7个参数的配置优化
1、
net.core.netdev_max_backlog
表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包最大数目。语法:net.core.netdev_max_backlog = 262144
2、
net.core.somaxconn
用于调节系统同时发起TCP连接数,一般为128,在客户端存在高并发的情况下,该默认值较小,可能导致连接超时或者重传问题,可以根据实际需求来调整此值。语法:net.core.somaxconn = 262144
3、
net.ipv4.tcp_max_orphans
用于设定系统中允许存在多个TCP套接字不被关联到任何一个用户文件句柄上,如果超过这个数字,没有与用户文件句柄关联的TCP套件字将立即被复位,同时给出警告。语法:net.ipv4.tcp_max_orphans = 262144
4、
net.ipv4.tcp_max_syn_backlog
用于记录尚未被收到客户端确认信息的链接请求最大值。语法:net.ipv4.tcp_max_syn_backlog = 261144
5、
net.ipc4.tcp_timestamps
用于设置时间戳,可以避免序列号的卷绕,当设置为0时,禁用对于TCP时间戳的支持,在默认情况下,TCP协议会让内核接收这种“异常”的数据包。建议将其关闭。语法:net.ipc4.tcp_timestamps = 0
6、
net.ipv4.tcp_synack_retries
用于设置内核放弃TCP链接之前向客户端发送的SYN-ACK包数量,为了建立对端的链接,服务器与客户端需要三次握手,第二次握手期间,内核需要发送SYN并附带一个回应前一个SYN的ACK,这个参数主要影响这个过程,一般福祉为1,语法:net.ipv4.tcp_synack_retries = 1
7、
net.ipv4.tcp_syn_retries
于上一个参数类似,语法:net.ipv4.tcp_syn_retries = 1
2.2、针对CPU的Nginx配置优化的2个命令
1、
worker_processes
用来设置Nginx的进程数,官方建议设置为1即可,赋值太多会影响系统的IO效率,降低Nginx的性能,但是为了让多核CPU能够很好的并行处理任务,可以将此值增大一些,值一般为CPU的倍数,语法:worker_processes = 4;
2、
worker_cpu_affinity
该命令的配置较为复杂,用来为每个进程分配CPU的工作内核,该值为几组二进制的值表示,其中每组代表一个进程,每组中的每位表示该进程的使用CPU情况,1代表使用,0代表不使用,注意,二进制位排列和CPU的顺序是相反的,例如0001 0100 1000 0010
这组分别代表顺序为(进程1使用CPU情况
,进程2使用CPU情况
,进程3使用CPU情况
,进程4使用CPU情况
);其中进程1中的0001
代表(进程1使用CPU3情况
,进程1使用CPU2情况
,进程1使用CPU1情况
,进程1使用CPU0情况
);以上为4核4进程的设置值,如果是四核八进程的值则为0001 0010 0100 1000 0001 0010 0100 1000
如果是八核八进程则为00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000
以上只是举例说明,具体的进程数需要通过上面的worker_processes
参数的值来确定。
3、Nginx服务器的Gzip压缩
关于Gzip的压缩我就只说说命令,不做过多的阐述,需要了解详细的请参看官方文档或其它书本,另外在使用Gzip的同时,需要注意客户端的一些信息,比如http版本等。
gzip on | off;
Gzip开关。
gzip_buffers number size;
Gzip 压缩文件使用缓存空间的大小,number制定Nginx服务器需要向系统申请缓存空间的个数,size制定每个缓存空间大小。
gzip_comp_level level;
用于设定Gzip压缩程度,1-9的级别选择,1位程度最低,压缩效率高,9程度高,压缩效率低,相对时间较长。
gzip_types mime-type...;
服务器可以根据响应页的MIME类型选择性的开启Gzip,该命令用来设置MIME类型,被设置的类型将会被压缩;例:gzip_types text/plain application/x-javascript text/css text/html applicatipn/xml;
gzip_vary on | off
用于设置在使用Gzip功能时是否发送带有Vary: Accept-Encoding
头域的响应头部,该头部信息主要是告诉接收方发送的数据是经过压缩处理,开启后的效果实在响应头部添加Accept-Encoding:gzip
这对不支持Gzip的客户端浏览器是有用的。
4、Nginx服务器的代理服务
4.1、代理的基本概念
代理服务,通常也成为正向代理服务,如果把局域网外internet想象成一个巨大的资源库,那么资源就分布在internet的各个站点上,局域网内的客户端要访问这个库里的资源必须统一通过代理服务才能对各个站点进行访问。
局域网内的机器借助代理服务访问局域网外的网站,这主要是为了增强局域网安全性,使得网外的威胁因素不容易影响到内网,这里的代理服务起到了一部分防火墙的作用,正向代理服务不支持外部对内部网络的访问请求,
与反向代理相反,如果局域网向Internet提供资源,让Internet上的其他用户可以访问局域网内的资源,也可以设置使用一个代理服务器,他提供的服务叫做反向代理服务。
正向代理服务器用来让局域网客户机接入外网以访问外网资源,反向代理服务器用来让外网的客户端接入局域网中的站点可以访问站点中的资源。理解这两个概念的关键是要明白我们当前的角色和目的是什么,在正向代理的服务器中,我们的角色是客户端,目的是要访问外网的资源,在反向代理服务器中,我们的角色是站点,目的是把站点的资源发布出去让其他客户端能够访问。
4.2、正向代理配置
在实际情况中,使用Nginx服务器代理服务功能相对少一些,主要涉及的命令如下:
1、
resolver
指令用于指定DNS服务器的IP地址,DNS服务器的主要工作是进行域名解析,将域名映射为对应的IP地址语法:resolver address...
2、
resolver_timeout
用于设置DNS服务器解析超市时间,语法:resolver_timeout time;
3、
proxy_pass
用于设置代理服务器的协议和地址,它不仅仅用于Nginx的代理服务,更主要的是应用于反向代理服务,语法:proxy_pass URL;
下面配置一段正向代理的案例:
...
server{
resolver 192.168.23.45;
listen 82;
location / {
proxy_pass http://$http_host$request_uri;
}
}
示例片段很简单,设置DNS服务器地址为192.168.23.45
,使用默认的53端口作为DNS服务器的服务端口,代理服务的监听端口为82端口,Nginx服务器接收到的所有请求都有location
块进行过滤处理。
设置Nginx服务器的代理服务器,一般是配置到一个
server
块中。注意,在该块server
中,不要出现server_name
指令,即不要设置虚拟主机的名称或IP。而resolver
指令是必须的,如果没有该指令,Nginx则无法处理接收到的请求。其次Nginx服务的正向代理不支持HTTPS站点。
4.3、反向代理配置
Nginx的反向代理是非常重要的功能之一,在实际中运用非常广泛,涉及的配置指令也很多。各类指令完成的功能也有所出入。其主要我们还是说proxy_pass
指令,其余指令将带过。
- 1、
proxy_pass
用来设置被代理服务器的地址,可以使主机名、IP加端口号等形式,语法:proxy_pass URL;
这里我们要说一下
URL
和URI
是两个不同的指代词,建议自行了解。
下面我们以一个服务器组的配置为案例:
upstream proxy_svrs{ # 配置后端的服务器组
server http://192.168.1.1:8001/uri/;
server http://192.168.1.1:8002/uri/;
server http://192.168.1.1:8003/uri/;
}
server{
...
listen 80;
server_name www.myweb.com;
location / {
proxy_pass proxy_svrs; # 使用后端服务器组
}
}
需要注意一个细节,以上案例在服务器组中指明了传输协议
http://
所以在proxy_svrs
中就不需要指明了,如果没有指明,则需要修改代理为:
proxy_svrs http://proxy_svrs;
下面说另外一个重要的配置:
...
server {
...
listen 80;
server_name www.myweb.com;
location /server/{
...
#配置1 proxy_svrs http://192.168.1.1;
#配置2 proxy_svrs http://192.168.1.1/;
}
}
其实两者的区别在于不同的配置后面加了一个/
,但是两者的意义完全不同,在该配置中。location块作用/server/
作为URI的变量的值来匹配包含/server/
的请求的URL,这时,使用配置1和配置2的专项结果就不同了,使用配置1的时候指令中的URL变量不包含URI,Nginx服务器将不改变原来的地址URI,使用配置2的时候,proxy_svrs指令中的URL变量包含URI/
,Nginx服务器会将原地址的URI替换为/
。
不如客户端请求的是http:www.myweb.com/server/index.html
,使用配置1转向的URL为:http://192.168.1.1/server/index.html
,原地址的URI,/server/
未被改变。但是在配置2中,将会转向URL:http://192.168.1.1/index.html
,可以看到,原地址的URI /server/
被替换为:/
。
相信在这个引用的过程中,注意到了一些细节的问题!