1.nginx概念及功能
nginx是一个高性能的HTTP和反向代理Web应用服务器,同时也提供IMAP/POP3/SMTP服务
- 反向代理
- 通过配置文件可以实现集群和负载均衡
- 静态资源虚拟化
2.nginx进程和web请求处理机制
- 进程解析: nginx启动之后会开启两个进程:master进程和worker进程;主进程(只有一个),相当于一个领导者,工作进程(默认只有一个),相当于一个工作者,为master进行服务。若master进程接收外界的信号,传递给woker,由worker执行;假设信号指令已经传递给woker进程,woker会等到客户端的响应结束才会执行指令。woker进程之间相互独立,如果黑客攻击的话,可能只是攻击其中的一个进程,其他进程可以照样工作。 master会监听woker,如果worker挂了,异常退出,master可以启动新的woker
- woker的抢占机制: 多个woker进程需要去抢占accept_mutex(互斥锁,跟client对应的),哪个进程抢到互斥锁,就由哪个进程处理请求
- web请求机制: nginx不同于传统事件处理,是异步请求。woker进程 use epoll是linux的epoll模型。当一个请求阻塞woker进程时,woker可以处理其他的请求。所以理论上只要内存够大,硬件跟上是可以达到几十万几百万的并发。
3.nginx.conf配置解析
nginx的配置分一下几个模块:
#全局配置
main
#配置工作模式以及连接数
event
#http模块相关配置
http
#虚拟主机配置,可以有多个
server
#路由规则,表达式
location
#集群,内网服务器(负载均衡规则)
upstream
- main全局配置解析
#woker进程是有哪个用户运行的,woker进程可以指定哪个用户运行,默认是nobody
user nobody;
#工作进程,默认数量为1
worker_processes 1;
#指定nginx的error_log路径且指定nginx的日志级别,从低到高分别为:debug info notice warn error crit
error_log logs/error.log notice;
#指定nginx的pid路径
pid logs/nginx.pid;
- event配置解析
#在linux环境下,默认工作模式为epoll模式(多路复用),且设置设置最大连接数为1024
events {
worker_connections 1024;
}
- http配置解析
#引入文件,增加代码可阅读性
include mime.types;
#默认的类型
default_type application/octet-stream;
#设置log日志的格式显示内容
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 logs/access.log main;
#文件传输,默认是开启的
sendfile on;
默认是不开启的,搭配sendfile on使用的,如果不开启的话,是同步阻塞的机制的,必须要一个传完了,再传下一个。开启之后,是多个文件达到一定大小再一起传,提升nginx的性能。
#tcp_nopush on;
#客户端超时时间,单位为秒,默认65秒。nginx在这段响应时间里还可以处理其他请求
keepalive_timeout 65;
#文件压缩,默认不开启。客户端的js,css等文件通过压缩,文件变小,加快传输效率,减小带宽的压力。但是同时要注意的是,压缩会消耗服务器cpu的性能
#gzip on;
#虚拟主机配置
server{
#监听的端口,默认80
listen 80;
#虚拟主机Ip
server_name localhost;
#路由匹配规则
location / {
root html;
index index.html index.htm;
}
#错误页面配置
error_page 404 /404.html;
}
#集群,负载均衡规则
upstream backend {
}
- location匹配规则解析
#1.默认匹配,上面几章用的都是默认匹配
location / {
root 资源路径
index 访问的资源
}
#2.精确匹配,精确到某一个资源文件
location =/test.txt { //home目录下的test.txt文件
root /home //资源路径
}
#3.文件后缀匹配,*代表不区分大小写
location ~* \.(gif|png|bmp|jpg|jpeg){
root /home 访问home目录下的所有以上后缀文件
}
#4.^~以某个字符路径开头请求,只能访问/home/test下的路径下的资源
location ^~ /test{
root /home
}
- upstream集群配置解析
- 负载均衡之轮询
轮询是负载均衡的默认配置,使用场景:每台的服务器硬件配置相同
upstream server_name{
server 192.168.1.181:8080
server 192.168.1.182:8080
}
- 负载均衡之权重
使用场景:服务器硬件配置的不同,按照一定比例来访问服务器节点
upstream server_name{
server 192.168.1.181:8080 weight=1;
server 192.168.1.182:8080 weight=2;
}
- 负载均衡之ip_hash
hash算法:hash(ip)(ip哈希的值)%node_count(节点数)=index(所要访问的服务器节点)
hash算法只会根据ip的前三个字段值(即192.168.1)做哈希,所以在同一网段的ip_hash访问的是一样的服务器节点
upstream server_name{
ip_hash;
server 192.168.1.181:8080
server 192.168.1.182:8080
}
- 负载均衡之url_hash
hash算法:hash(url)(ip哈希的值)%node_count(节点数)=index(所要访问的服务器节点)
upstream server_name{
hash $request_uri;
server 192.168.1.181:8080
server 192.168.1.182:8080
}
- 指令参数之least_conn
访问连接数最少的那个服务器节点
upstream server_name{
least_conn;
server 192.168.1.181:8080
server 192.168.1.182:8080
}
- 指令参数之max_conns
使用场景:max_conns用于限制服务器的最大连接数,默认值是0,不做任何限制,相当于限流的作用, 使用的时候要注意使用多个工作进程时,会涉及到共享内存,连接数可能会多于max_conns
upstream server_name{
server 192.168.1.181:8080 max_conns=2;
server 192.168.1.182:8080 max_conns=2;
}
- 指令参数之slow_start
该指令参数配置只适用于商业版,普通版不支持。
使服务器缓慢的启动,慢慢地加入到集群中,不会有流量很快地进来。便于运维人员启动监控软件,更好的监控流量从少到多的过程,达到更好的监控效果
该配置不支持hash和随机的负载均衡,该配置比较适合于权重的负载均衡 该配置不适合于单个服务器,在upstream中至少要有两个或两个以上的服务器
upstream server_name{
server 192.168.1.181:8080 weight=1 slow_start=60s;
server 192.168.1.182:8080 weight=2 slow_start=60s;
}
- 指令参数之down与backup
标识服务器的状态:down为不可用 标识服务器是备用机:backup
upstream server_name{
server 192.168.1.181:8080 down;
server 192.168.1.182:8080 backup;
}
- 指令参数之max_fails与fail_timeout
max_fails和fail_timeout是搭配使用的,max_fails默认值为1,fail_timeout默认值为10s
max_fails:最大的连接失败次数,当连接失败次数达到一定配置数之后,nginx认为该服务器宕机,不会访问到该服务器 fail_timeout:连接失败的时间段
upstream server_name{
server 192.168.1.181:8080 max_fails=2 fail_timeout=1s;
server 192.168.1.182:8080 max_fails=2 fail_timeout=1s;;
}
- 使用Keepalived提高吞吐量
keepalive 32,指的是保持32个连接,而keepalive的作用就是将其中的连接为长连接,大大减少了连接的创建, 维护和关闭的损耗;
proxy_http_version默认为1.0,1.1为长连接版本号;proxy_set_header配置是将connection清空。
upstream server_name{
server 192.168.1.181:8080
server 192.168.1.182:8080
keepalive 32;
}
server{
listen 80;
server_name server_name;
location / {
proxy_pass http://server_name;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
4.nginx之妙用
- 用nginx解决跨域问题
添加相关的跨域配置
server{
#监听的端口,默认80
listen 80;
#虚拟主机Ip
server_name localhost;
#配置跨域
#允许跨域请求,*代表所有
add_header Access-Control-Allow-Origin *;
#允许带上cookie请求
add_header 'Access-Control-Allow-Credentials' 'true';
#允许请求的方法,比如 GET/POST/PUT/DELETE
add_header Access-Control-Allow-Methods *;
#允许请求的header
add_header Access-Control-Allow-Headers *;
#路由匹配规则
location / {
root html;
index index.html index.htm;
}
}
- Nginx中配置静态资源防盗链
server{
#监听的端口,默认80
listen 80;
#虚拟主机Ip
server_name localhost;
#配置防盗链
#对源站点验证
valid_referers 192.168.1.181;
#非法引入进入下方判断
if ($invalid_referer){
#或者具体的防盗图片路径
return 404;
}
#路由匹配规则
location / {
root html;
index index.html index.htm;
}
}
- Nginx控制浏览器缓存
nginx通过设置未设置expire缓存浏览器资源。 若浏览器访问的是缓存过的资源,则状态是304状态;若静态资源被更改过,再访问静态资源,则被认为重新访问,才会重新被缓存
#缓存10s
location / static{
alias /home/imooc;
expires 10s;
}
expire命令解析
#缓存10s
expires 10s;
#到下午10点30分,缓存过期
expire @22h30m
#不设置缓存,缓存过期时间为1970
expires epoch
#nginx的默认设置,缓存关闭
expires off
#最大缓存时间(不过期),Expires值为31 December2037 23:59:59GMT
expires max
- Nginx的反向代理缓存
upstream服务器也会有静态资源文件通过Nginx被用户请求访问,也会有带宽的损耗和降用的。通过设置反向代理的缓存,可以更快访问静态资源文件,加速体验
server{
listen 80;
server_name www.yzw.com;
#设置缓存的相关配置
proxy_cache_path /usr/local/nginx/upstream_cache keys_zone=mycache:5m max_size=1g inactive=8h use_temp_path=off;
location / {
proxy_pass http://www.yzw.com;
#代表开始并使用mycache的缓存,其中mycache是在keys_zone配置的名称
proxy_cache mycache
#针对200和304状态码的缓存设置过期时间
proxy_cache_valid 200 304 8h
}
}