概述
简介
Nginx是一款轻量级的Web服务器、反向代理服务器,专为性能优化而开发,使用异步非阻塞事件驱动模型
优点
1.开源软件,可以免费试用,并且可用于商业用途
2.内存消耗少,节省带宽,支持gzip压缩
3.可以高并发连接,官方测试能够支撑5万并发连接,在实际生产环境中可以支撑2到4万并发连接
4.内置的健康检查功能:如果Nginx proxy后端的某台服务器宕机了,不会影响前端访问
5.稳定性高:用于反向代理(负载均衡),宕机的概率微乎其微
6.支持热部署,在不间断服务的情况下,对软件版本升级
应用场景
HTTP服务器:部署只有静态资源的网站,可以通过异步请求接受数据
反向代理:作为代理服务器,连接网络请求并转发给内部网络的服务器
负载均衡:分摊到多个服务器上
动静分离:根据一定规则把不变的资源和经常变的资源区分开来
nginx目录详解
conf 存放配置文件
html 存放页面文件
index.html:访问Nginx时的首页
50x.html:错误提示页面
logs 存放 日志文件
刚安装完Nginx,从未启动过的话logs目录下什么都没有,只有启动Nginx后,才会出现以下三个文件
access.log:记录正常访问的服务日志(配置在http块)
error.log:错误日志(三块都可配置)
Nginx.pid:Nginx进程id(配置在全局块)
sbin 命令目录
docker安装
创建conf的挂载目录
mkdir -p /opt/nginx/conf
访问:cat /opt/nginx/conf/nginx.conf
修改:vim /opt/nginx/conf/nginx.conf
创建 html 的挂载目录
docker volume create nginx8020
访问:cd /var/lib/docker/volumes/nginx8020/_data
拉取镜像
docker pull nginx
初始化挂载目录的配置文件
docker run --rm --name nginx-short -p 8020:80 -d nginx
docker cp nginx-short:/etc/nginx/nginx.conf /opt/nginx/conf
docker stop nginx-short
创建容器
docker run --rm -d -p 8020:80 --name nginx8020 -v nginx8020:/usr/share/nginx/html -v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf nginx
修改docker中nginx的配置文件
docker exec -it nginx8024 /bin/bash
cat /etc/nginx/conf.d/default.conf
配置项
任意模块
引入配置文件
1.引入的文件要求运行Nginx进程的用户对其具有写权限
2.引入的文件要符合Nginx配置文件规定的相关语法和结构
示例:
include /etc/nginx/conf.d
全局块
配置错误日志的存放路径【全局块、http块和 server 块】
1.存放路径要求运行Nginx进程的用户对其具有写权限
示例:
error_log logs/error.log;#配置错误日志的存放路径
配置进程 PID 存放路径
#配置进程PID存放路径
pid logs/nginx.pid;
配置用户或者用户组访问Nginx进程的权限
1.不写的话所有用户都可以启动Nginx进程
示例:
#所有用户都可以启动Nginx进程
user nobody nobody;
配置Nginx进程允许生成worker process数
1.理论来说Nginx进程允许生成worker_process的值越大,可以支持的并发处理也越多
示例:
#Nginx进程允许生成worker process数为1
worker_processes 1;
#Nginx进程允许生成worker process数为1,Nginx进程将自动检测
worker_process 1 | auto;
events块
设置允许每一个worker process同时开启的最大连接数
#允许每一个worker process同时开启的最大连接数为1024
worker_connections 1024;
配置事件驱动模型
1.作用:强制Nginx服务器选择哪种事件驱动模型进行消息处理
2.事件驱动模型参数详解:
select、poll属于标准事件模型
Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃
Epoll:使用于Linux内核2.6版本及以后的系统。
/dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+
Eventport:使用于Solaris 10。为了防止出现内核崩溃的问题,有必要安装安全补丁
示例:
#使用epoll标准事件模型
use epoll;
http块
定义网络资源的媒体类型
default_type application/octet-stream;#定义网络资源的媒体类型为application/octet-stream
自定义服务日志
1.作用:记录Nginx服务器提供服务过程应答前端请求的日志,Nginx服务器支持对服务日志的格式、大小、输出等进行配置
示例:
#自定义服务日志
access_log logs/access.log main;
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 /var/log/nginx/access.log main;
配置HTTP 长连接 超时时间【server块、HTTP块、location块中】
#在服务器端保持连接的时间设置为65s
keepalive_timeout 65;
#在服务器端保持连接的时间设置为120s,发给用户端的应答报文头部中Keep-Alive域的超时时间设置为100s
keepalive_timeout 120s 100s;
开启文件高效传输模式
1.可以结合tcp_nopush或tcp_nodelay进一步优化性能,但这两个参数只能选其一
示例:
#开启文件高效传输模式
sendfile on;
#当有数据时,先不着急发送,确保数据包已经装满数据,避免网络拥塞。
tcp_nodelay on;
#只在连接传输进入到keep-alive状态,在每次只发送很少字节的业务场景中,使用该功能可以避免等待时间过长。
tcp_nopush on;
配置 Gzip 压缩
1.作用:开启Gzip压缩功能,可以使网站的css、js、xml、html文件在传输时进行压缩,提高访问速度, 进而优化Nginx性能
将响应报⽂发送⾄客户端之前可以启⽤压缩功能,这能够有效地节约带宽,并提⾼响应⾄客户端的速度
示例:
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 9;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php application/javascript application/json;
gzip_disable "MSIE [1-6]\.";
gzip_vary on;
server块
配置网络监听
1.注意:如果是IPv6的地址,需要使用中括号"["括起来,比如[fe80::1]等。
示例:
#监听80端口上的所有IP连接
listen 80;
#监听192.168.1.10:8000上的连接
listen 192.168.1.10:8000;
#监听192.168.1.10所有端口上的连接
listen 192.168.1.10;
域名
1.作用:设置了虚拟主机的名称并配置好DNS,用户就可以使用这个名称向此虚拟主机发送请求了
2.优先级:精确匹配>左侧通配>右侧通配>正则表达式匹配
示例:
server_name localhost;
server_name *.*;#匹配所有
server_name www.baidu.com;#精确匹配www.baidu.com
server_name *.baidu.com;#通配.baidu.com
server_name www.baidu.com *baidu.com;#精确匹配www.baidu.com,通配.baidu.com
实现域名跳转
#域名test.com直接跳转到域名jkw.life
rewrite ^/(.*) http://jkw.life/$1 permanent;
location块
location匹配规则
location / {...}#无限制匹配
location = /abc {...}#精确匹配,如http://baidu.com/abc?p1
location ~ ^/abc$ {...}#正则匹配,区分大小写,如http://baidu.com/abc正确,http://baidu.com/ABC错误
location ~* ^/abc$ {...}#正则匹配,不区分大小写,如http://baidu.com/abc http://baidu..com/ABC正确
location ^~ /images/ {...}#匹配到即停止搜索
配置文件资源根目录路径
1.作用:当location块接收到/index.html的请求时,将在/usr/share/nginx/html目录下找到index.html响应请求
2.root和alias指令有区别
示例:
#文件资源放在/usr/share/nginx/html中
location / {
root /usr/share/nginx/html;
}
#对应磁盘映射路径/opt/nginx/html/images/images/1.jpg
location / {
root /opt/nginx/html/images;
}
#最后面一定要加 "/",对应磁盘映射路径/opt/nginx/html/images/1.jpg
location / {
alias /opt/nginx/html/images/;
}
配置默认访问的文件
1.作用:如果用户仅输入了类似于http://example.com/这样的URL而没有具体指定文件名,
Nginx会首先尝试查找index.html文件,如果该文件不存在,就会查找index.htm文件,并将其内容返回给用户
示例:
文件资源放在/usr/share/nginx/html中,若访问/路径会默认访问index.html页面
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
重定向
1.执行return指令后,location中后序指令将不会被执行
2.重定向时必须以http或者https开头的
#重定向到http://baidu.com
return http://baidu.com;
#返回响应码和文本,文本会在body中
return 200 'your success';
#用302表示临时性重定向,访问/时跳转返回状态码302并重定向到/bbs的路径上
location / {
return 302 /bbs;
}
location /bbs {
root html;
index index.html;
}
核心指令
if【server块或locatio块】
1.false的情况:空字符串、0开头的任意字符串
2.使用=(等于)和!=(不等于)比较变量和字符串是否相等
3.字符串不需要加引号
4.~【大小写敏感】~*【大小写不敏感】!~【】
示例:
$http_user_agent的值中是否包含MSIE字符串,包含为true
if ($http_user_agent ~ MSIE) {
...
}
#判断ip地址是否为192.168.66.10如果是返回test if ok in Url /serach
location /search {
if ($remote_addr = "192.168.66.10"){
return 200 "test if ok in url search"
}
}
#不允许谷歌浏览器访问,如果时候谷歌浏览器返回500
if ($http_user_agent ~ Chrome){
return 500;
}
set 指令
1.作用:该指令用于设置一个新的变量
2.要用符号$作为变量的第一个字符,且变量不能与Nginx服务器预设的全局变量同名
3.变量的值可以是字符串、其他变量或变量的组合等
示例:
set $id $1;
break 指令
1.作用:该指令用于中断当前相同作用域中的其他Nginx配置。
示例:
location / {
if ($slow){
set $id $1; # 处于break指令之前,配置生效
break;
limit_rate 10k; #处于break指令之后,配置无效
}
}