1. Nginx的简介
相关内容,可以查看 【Nginx 负载均衡】,这是我之前的一篇文章,这里就懒得再说明一次了。
2. Nginx监听端口
-
基本语法: listen address:port
-
默认:listen 80;
-
作用: listen参数决定Nginx服务器如何监听端口。在listen后可以加IP地址,端口和主机名,非常灵活。
-
例如:
listen 127.0.0.1:8000;
listen 127.0.0.1;/默认80端口
listen 8000; / / listen *:8000; / / listen localhost:8000;
- 例子
worker_processes auto;
pid /run/nginx.pid; #指定了进程号,如果报错就注释掉吧,不然nginx -t 会提示失败
events {
#use epoll; # 仅用于linux2.6以上内核,如果报错就注释掉吧
worker_connections 65535;
}
http {
server {
listen 80; #监听80端口
location / {
default_type text/html;
return 200 "Hello, Nginx! Here the port is 80! \n";
}
}
server {
listen 8080; #监听8080端口
location / {
default_type text/html;
return 200 "Hello, Nginx! Here the port is 8080! \n";
}
}
}
- 扩展语法:
listen address:port [default(deprecated in in 0.8.21)|default_server|[backlog=num|rcvbuf=size|sndbuf=size|accept_filter=filter|deferred|bind|ipv6only=[on[off]|ssl]];
listen可用参数的意义
3. Nginx虚拟主机
Nginx虚拟主机- 例子
worker_processes auto;
pid /run/nginx.pid; #指定了进程号,如果报错就注释掉吧,不然nginx -t 会提示失败
events {
#use epoll; # 仅用于linux2.6以上内核,如果报错就注释掉吧
worker_connections 65535;
}
http {
upstream origin.lazyfennec.cn {
server 127.0.0.1:8080;
}
server {
listen 80; #监听80端口
server_name test.lazyfennec.cn;
location / {
proxy_pass http://origin.lazyfennec.cn;
}
}
#实际的处理业务服务
server {
listen 8080; #监听8080端口
location / {
default_type text/html;
return 200 "Hello, Nginx! Here the port is 8080! \n";
}
}
}
以上内容如果在本机测试,记得修改hosts文件,在单独的一行(为了避免可能被覆盖的情况,建议放到最后),添加以下内容(请按照自己的需求进行修改)
127.0.0.1 test.lazyfennec.cn
测试结果
4. 重点 之 Nginx配置location
语法: location [=*I^l@]/uri/{…}
配置块:server
详情: location会尝试根据用户请求中的uri来匹配上面的uri表达式,如果可以匹配,就选择lcoation块中的配置来处理用户请求。当然,匹配方式是多样的。
- = /uri表示完全匹配。
- ~/uri表示匹配URI时时大小写敏感的。
(注意,如果系统本身就是大小写不敏感的,那么这里的大小写敏感将不会生效,也就是说,如果要使用大小写敏感,请不要使用Windows系统作为nginx的运行服务器)- ~*/uri表示匹配URI时忽略大小写。
- ^~/uri表示匹配URI时只需要其前半部分匹配即可。
- /uri不带任何修饰符,也表示前缀匹配,但是在正则匹配之后。
- /通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default。
注意:location是有顺序的,如果一个请求有可能被多个location匹配,实际上这个请求会被第一个与之匹配的location处理。
最后location /{会处理所有的请求}
- 例子
worker_processes auto;
pid /run/nginx.pid; #指定了进程号,如果报错就注释掉吧,不然nginx -t 会提示失败
events {
#use epoll; # 仅用于linux2.6以上内核,如果报错就注释掉吧
worker_connections 65535;
}
http {
server {
listen 80; #监听80端口
location / {
default_type text/html;
return 200 "local /: I am default location!\n";
}
location = /goodjob {
default_type text/html;
return 200 "location = /goodjob\n";
}
# 大小写敏感
location ~ /Goodjob {
default_type text/html;
return 200 "location ~ /Goodjob\n";
}
# 大小写不敏感
location ~* /goodjob {
default_type text/html;
return 200 "location ~* /goodjob\n";
}
# 前缀匹配
location ^~ /goodjob {
default_type text/html;
return 200 "location ^~ /goodjob \n";
}
}
}
5. Nginx 常规配置
-
定义环境变量
语法:evn VAR|VAR=VALUE
作用: 用户可以直接设置操作系统上的环境变量
举例:evn TESTPATH=/tmp;
-
嵌入其他配置文件
语法:include /path/file;
作用: 可以把其他配置文件引进来,,路径可以使用绝对路径也可以是相对路径,还可以含有通配符*。 -
pid文件
语法:pid path/file;
默认:pid logs/nginx.pid;
作用: 保存master进程ID的pid文件存放路径。 -
Nginx worker进程运行的用户和用户组
语法:user username [groupname];
默认:user nobody nobody;
作用: master进程fork出的进程在哪个用户和用户组下。 -
指定Nginx worker进程可以打开的最大句柄描述符个数
语法:worker_rlimit_nofile limit;
作用:设置一个worker可以打开的最大句柄数。
-
限制信号队列
语法:worker_rlimit_sigpending limit;
作用: 设置每个用户发往Nginx的信号队列的大小。也就是说,当某个用户的信号队列满了,这个用户再发送的信号量就会被丢掉。
6. Nginx 高性能配置
-
Nginx worker进程个数
语法:worker_processes number;
默认:worker_processes 1;
作用: 在master_worker运行方式下,定义worker进程的个数。worker进程的数量会直接影响性能。每个worker都是单线程的进程,他会调用各个模块来实现各种功能。如果确定这些模块不会出现堵塞式调用,那么进程数可以和CPU核心数一样;反之,则稍少一些。可以使用 auto 来指定与当前主机核心数一致。 -
绑定Nginx worker进程到指定的CPU内核
语法:worker_cpu_affinity cpumask [cpumask…]
作用∶假设每个worker都是很繁忙的,如果多个进程都在抢同一个CPU,那么就会出现同步问题。反之,如果每个worker进程独享一个CPU,就实现了完全的并发。
举例:
worker_processes 4;
worker_cpu_affinity 1000 0100 0010 0001;
-
SSL硬件加速
语法:ssl_engine device;
作用: 如果服务器上有SSL硬件加速设备,那么就可以进行配置以加快SSL协议的处理速度。用户可以用OpenSSL提供的命令来查看是否有SSL硬件加速设备:openssl engine -t
-
Nginx worker进程优先级设置
语法:worker_priority nice;
默认:worker_priority 0;
作用: 在Linux和Unix中,当许多进程都处于可执行状态时,按照优先级来决定本次内核选择哪一个进程执行。进程分配的CPU时间片大小也与优先级有关,优先级越高,时间片越长(例如,在默认情况下,最小时间片是5ms,最大则有800ms)。优先级由静态优先级和内核根据进程的执行情况所做的动态调整(目前只有+-5的调整)共同决定。nice是进程的优先级,他的取值范围是-20~+19,-20是最高优先级,+19是最低优先级。不建议把nice的值设为比内核进程(t通常为-5)还要小。
7. Nginx 事件配置
-
是否打开accept锁
语法:accept_mutex [on|off];
默认:accept_mutex on;
作用: accept_mutex是Nginx的负载均衡锁。这把锁可以让多个worker进程轮流的,序列化的与新的客户端建立TCP连接。accept锁默认是打开的,如果关闭它,那么建立TCP连接的耗时会更短,但不利于负载均衡,因此不建议关闭。 -
使用accept锁后到真正建立连接之间的延迟时间
语法:accept_mutex_delay Nms;
默认:accept_mutex_delay 500ms;
作用: 在使用accept锁后,同一时间只有一个worker进程能够取到accept锁。这个accept锁不是堵塞锁,如果取不到会立刻返回。如果只有一个worker进程试图取锁而没有取到,他至少要等待accept_mutex_delay定义的时间才能再次试图取锁。 -
批量建立新连接
语法:multi_accept [on|off];
默认:multi_accept off;
作用: 当事件模型有新连接时,尽可能的对本次调度中客户端发起的所有TCP请求都建立连接。 -
选择事件模型
语法:use [kqueue|rtsig|epoll|/dev/poll|select|poll|eventport];
默认: Nginx会选出最合适的时间模型
作用: 对于Linux系统,可供选择的事件驱动模型有: poll,select,epoll三种,一般来说,epoll是性能最高的。 -
每个worker的最大连接数
语法:worker_connections number;
作用: 定义每个worker进程可以同时处理的最大连接数。
8. Nginx事件模型
epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
- 优点:
- 支持一个进程打开大数目的socket描述符。
- IO效率不随FD(File descriptor)数目增加而线性下降。
- 使用mmap加速内核与用户空间的消息传递。
9. Nginx配置实例
- user: 进程运行的用户和用户组。
- worker_connections: 每个worker最大连接数。
- pid: 保存master进程ID的pid文件存放路径。
- use: 选择事件模型。
- upstream: 配置负载均衡。
- ip_hash: 基于IP_HASH的负载均衡。
- listen:监听端口。
- server_name: 配置虚拟主机名。
- location: 匹配用户请求。
-
proxy_pass: 配置反向代理。
如果觉得有收获,欢迎评论、点赞和转发,更多知识,请点击关注查看我的主页信息哦~
网友评论