[toc]
介绍
Nginx 是介于客户端与服务端的
特点: 1. 稳定性极强, 7*24小时不间断运行 2. 丰富的配置示例 3. 占用内存小,并发能力强(50000以上并发)
tomcat 150个并发
安装
windows 安装:
- 下载,解压到任意目录,进入包含
Nginx.exe
的目录,打开命令窗口,进入到该目录,运行start nginx
如果启动失败 可以进入 logs 文件夹中的 error.log 文件产看是否有错误原因
启动成功后在任务管理器可以看到 nginx 的进程
- 浏览器访问
http://127.0.0.1/
或locahost
其它的一些操作
nginx -s stop 立即停止nginx,不保存相关信息
nginx -s quit 正常退出nginx,并保存相关信息
nginx -s reload 重启: 改变了配置等
第一次安装 service nginx start 启动一下
在安装目录下执行 ./nignx -v
安装
centeOS
默认安装地址 /etc/nginx
- 安装
yum -y install nginx
- 卸载
yum remove nginx
开启和停止等 查看 systemctl 命令
Ubuntu
sudo apt install nginx
nginx -t 显示信息 配置文件地址 进入配置文件后查看引入的文件 即可找到对应的默认配置
- 开了端口后 需要开防火墙
root 与 alias 的区别:
主要在于怎么解释 location 后面的 url
root的处理结果是:root路径+location路径
alias的处理结果是:使用alias路径替换location路径 (注意alias后面视情况是否要用 '/' 结束)
示例: 假设访问地址是 /t/x.html
location /t/ {
root http://www.xx.xx/
# 映射为 http://www.xx.xx/t/x.html
alias http://www.xx.xx/
# 映射为 http://www.xx.xx/x.html
}
一个 server 块中可以有多个 location
更多默认配置和查看新安装的 Nginx 的 nginx.conf 文件
http 缓存
- 强制缓存 (浏览器不会向服务器发送任何请求,直接从本地缓存中读取缓存数据并返回 200 (disk cache | memory cache) 状态码)
两种方式: (https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Cache-Control)
Expires:Wed, 22 Oct 2018 08:41:00 GMT 该时间后过期 (Header上设置, 是 HTTP1.0 中的内容),该值是有服务端生成,而客户端的时间和服务端的时间有可能不一致,导致存在一定误差
Cache-Control (Header上设置, HTTP/1.1 优先级高于Expire)
# 可缓存性
public # 表明响应可以被任何对象(包括:发送请求的客户端,代理服务器,等等)缓存,允许cdn缓存
private # 表明响应只能被单个用户缓存,不能作为共享缓存(即代理服务器不能缓存它)。私有缓存可以缓存响应内容,比如:用户的本地浏览器,禁止cdn缓存
no-cache # 浏览器会缓存资源,但每次都会向服务器确认资源是否发生改变,进行验证 (协商缓存验证)。
no-store # 不使用任何缓存
# 过期相关
max-age=30 # 30s后过期
s-maxage=<seconds> # 设置共享缓存。cdn缓存时长 会覆盖max-age和expires,私有缓存会忽略它
max-stale=秒数 # 客户端愿意接收一个已经过期的资源
min-fresh=秒数 # 客户端希望在指定的时间内获取最新的响应
# 重新验证和加载
must-revalidate # 一旦资源过期(比如已经超过max-age),向服务器获取新资源
proxy-revalidate
- 其它请求头
Pragma no-cache # 用来向后兼容只支持 HTTP/1.0 协议的缓存服务器,它的行为与 Cache-Control: no-cache 一致
Last-modified Date # 资源上次修改时间
Etag string # 资源的标识,一般为md5或者hash值
协商缓存 协商缓存会先向服务器发送一个请求,服务器会根据这个请求的 request header 的一些参数来判断是否命中协商缓存,如果命中,则返回 304 状态码并带上新的 response header 通知浏览器从缓存中读取资源。
使用 HTTP / 2.0
预加载
配置html不缓存示例
location / {
root html;
index index.html index.htm;
# ~* 指定正则表达式返回 true 判断匹配不区分大小写
# 控制 html 不缓存
if ($request_filename ~* ^.*?.html$) {
add_header Cache-Control "private, no-store";
}
# 处理其它文件
if ( $request_uri ~* /((.*)\.html?)?$ ) {
add_header Cache-Control no-cache;
}
if ( $request_uri ~* /.*\.(js|css)$ ) {
add_header Cache-Control max-age=86400;
}
}
配置 点击劫持
location / {
root html;
index index.html index.htm;
add_header X-Frame-Options DENY always;
# 如果指定了 always 参数 (1.7.5),则无论响应代码如何,都将添加标头字段。
}
#user nobody;
worker_processes 1;
#pid logs/nginx.pid;
# 以上为全局块
# worker_processes 数值越大,Nginx 并发能力越强
# error_log 错误日志存放的位置
# pid 一般不用关注 Nginx 运行的标志
events {
worker_connections 1024;
}
# events块
# worker_connections 数值越大,Nginx 并发能力越强(这里的数据值一般是运维人员根据服务器来配置, worker_processes 也是如此)
# 以下为http块
# include 引入一个外部的文件 mime.types 里面放着大量的媒体类型
http {
include mime.types;
# 这里是默认使用的媒体类型
default_type application/octet-stream;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
gzip on;
# 动态压缩: 对每个请求先压缩再输出
# 静态压缩: 使用现成的名为 .gz 的压缩文件
# gzip_static on;
# 返回头中会出现 Content-Encoding: gzip
# 读取预先压缩的gz文件
# gzip_vary on;
# 如果代理服务器不使用 Vary,纯粹只是根据 请求URL和请求方法 来判断是否缓存命中,那不支持解压功能的 客户端 就可能会错误拿到代理服务器中的被压缩过的 # 数据;所以多加一层判断
# 返回响应头增加 Vary: Accept-Encoding ;客户端请求头 一般会携带支持的类型 Accept-Encoding:gzip, deflate, br
# gzip_proxied any;
# 禁止IE使用gzip 以免假死
gzip_disable "MSIE [1-6].";
# 不压缩小于256字节的文件
gzip_min_length 256;
# gzip_proxied any;
# gzip压缩比,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输快但比较消耗cpu)
gzip_comp_level 2;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# 表示压缩的文件类型
# gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
# server块
# 这里的server块也可以通过 include 方式加载,可将server块独立开来,因为后期主要修改几乎为server块
# 引入的文件内容格式
# server {
# }
server {
# Nginx 监听的端口号
listen 80;
# 监听 ipv6的地址
# listen [::]:80
# Nginx接收请求的的域名
server_name localhost;
# location块
location / {
# 重定向到指定地址
# proxy_pass http://localhost:2500/page/one;
# 将接收到的请求,根据 html 这个地址去查找静态资源
# 默认 /usr/share/nginx/html 或者 /var/www/html(当前是默认的这个) 具体的看配置文件,一般是 include 进来
root html;
# 默认去上面的路径中查找 index.html 或者 index.htm
index index.html index.htm;
}
}
}
关于 location 的路径映射
优先级:
(location = ) > (location /xxx/xx/x) > (location ^~) > (location ~, ~*) > (location /起始路劲) > (location /)
=
匹配
location = / {
# 精准匹配 主机域名后面不能带任何的字符串
}
- 通用匹配
location /xxx {
# 匹配所有以 /xxx 开头的路径
}
- 正则匹配
location ~/xxx {
# 匹配所有以 /xxx 开头的路径
}
- 匹配开头路径
location ^~/xxx {
# 匹配所有以 /xxx 开头的路径
}
- 匹配结尾
location ~* \.(gif|jpg)$ {
# 匹配所有以 .gif 或 .jpg 结尾的路径
}
反向代理
正向代理:
- 代理服务器是由客户端设立的
- 客户端了解代理服务器和目标服务器是谁
- 帮助实现突破访问权限、提高访问速度、对目标服务器隐藏客户端的ip
反向代理:
- 反向代理服务器放在服务端
- 客户端不知道访问的是哪一台服务器
- 达到负载均衡,并且可以隐藏服务器的真正ip
负载均衡
根据相应的算法决定请求是发给哪个服务器
处理策略:
- 轮询 轮流给每一个服务器派发 客户端的请求,平均分配
upstream myServer {
# server ip:port;
server localhost:2500;
server localhost:1112;
}
server {
location / {
proxy_pass http://myServer;
}
}
- 权重 根据具体的服务器的处理能力,派发客户端的请求
只需加上 weight
upstream myServer {
server localhost:2500 weight=10;
server localhost:1112 weight=2;
}
- ip_hash 对请求ip 进行相关的处理,然后请求指定的服务器,如果ip 不变,请求的服务器将一直不变
upstream myServer {
ip_hash;
# 下面是否加权重与 ip_hash无关
server localhost:2500 weight=10;
server localhost:1112 weight=2;
}
动静分离
动态资源 静态资源 分离
动态资源交给服务器,静态资源自己处理
Nginx 并发能力公式: worker_processes * worker_connections / (4 | 2)
= 最终并发能力
动态资源除以4(因为多了请求服务器数据和接收服务器数据),静态资源除以2
- 动态资源代理
location / {
proxy_pass url;
}
- 静态资源代理
location / {
root 静态资源路径;
index 默认访问路径下的什么资源;
autoindex on; # 表示展示静态资源全部内容 以列表的形式
}
# 存在目录 /static/static 和 /static/image
# 以下配置生效
location /static {
root static;
index index.html;
}
location /image {
root static;
autoindex on;
}
集群
搭建集群后,使用Nginx做反向代理服务器
# For more information on configuration, see:
# * Official English Documentation: http://nginx.org/en/docs/
# * Official Russian Documentation: http://nginx.org/ru/docs/
user root;
worker_processes 2;
error_log /root/software/nginx/nginx-1.18.0/logs/error.log;
pid /root/software/nginx/nginx-1.18.0/run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
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 /root/software/nginx/nginx-1.18.0/logs/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /root/software/nginx/nginx-1.18.0/conf/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /root/software/nginx/nginx-1.18.0/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
index index.html index.htm;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}