nginx快速入门
快速入门
1. 安装gcc 的环境 yum install gcc-c++ -y
2. 安装 Perl 库,nginx 的 http 模块使用 pcre 来解析正则表达式
yum install -y pcre pcre-devel
3. 安装zlib 库,它提供了很多种压缩和解压缩的方式
yum install -y zlib zlib-devel
4. 安装OpenSSL,它是一个强大的安全套接字层密码库
yum install -y openssl openssl-devel
5. 上传nginx源码并解压 tar zxvf nginx-1.8.0.tar.gz
6. 进入nginx源码目录 cd nginx-1.8.0 输入下面命令创建makeFile 文件
./configure --prefix=/usr/local/wulei/nginx-1.8.0
7. 编译并安装 make && make install 此时会在安装目录生成sbin文件夹。
8. 在 nginx-1.8.0 目录 mkdir logs , 它会将日志文件生成在安装目录的该文件夹下,不创建会报错。
9. 进入安装目录的sbin目录 cd /usr/local/wulei/nginx-1.8.0/sbin
启动:./nginx 查看进程:pgrep nginx 或者 ps aux|grep nginx 杀死进程: kill -9 pid
10. 测试 默认是80端口, 所以我们直接输入nignx的服务器ip就好了
静态网站部署
1. cd /usr/local/wulei/nginx-1.8.0/html
2. 把静态文件上传到该目录
走近nginx/conf/nginx.conf配置文件
#管理员(用户,用户组) #user nobody; #工作线程数量(一般为cpu总核心数(减少上下文的切换):例如2个4核, 一般就为8) worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { # 网络模型 use epoll # 最大连接数 worker_connections 1024; } #所有的http请求都会进入这里面,这些都是默认配置。 http { include mime.types; default_type application/octet-stream; #日志格式: remote_addr远程ip地址 remote_user远程用户 time_local用户时间 request请求方式get/post # status状态 body_bytes_sent请求长度 http_referer来源信息 http_user_agent用户代理 #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; # 自定义日志格式与日志打印位子 #log_format wuleiformat '$remote_addr - $remote_user [$time_local]'; #access_log logs/wulei.log wuleiformat; sendfile on; #能否发送文件 #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #超时时间 #gzip on; #一个server就是一个虚拟主机 server { listen 80; # 监听端口 server_name localhost; # 监听地址 #charset koi8-r; #access_log logs/host.access.log main; location / { # 相当于项目的WEB-INF目录 root html; # 页面根目录 index index.html index.htm; # 首页文件,如果第一个不存在就找第二个 } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } #====================== 我们这里自定义一个方向代理 ===================== server { # 监听80端口 listen 80; server_name www.wulei.com; location / {#相当于项目的WEB-INF目录 proxy_pass http://94.191.21.35:8081; } } }
动静分离
当我们请求一个网页的时候,可能会加载很多css,js,img等静态文件;一般这些文件是很久都不会变化的,所以我们为了提高页面响应速度,完全可以将这些文件缓存到浏览器中,这就叫动静分离。
1. vim nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format wuleiformat '$remote_addr - $remote_user [$time_local]';
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
# 输入ip默认访问html文件夹下的index.html文件
location / {
root html;
index index.html index.htm;
}
# 代理前端网页用 alias ,url路径一定要以/结尾
location /baby_ting{ alias '/usr/local/wulei/nginx-1.16.1/html/LOVE/'; } # 所有.png .css ...结尾的文件都直接去/html/images里面找 location ~ \.(png|jpg|js|css|gif)$ { root html/images; expires 10m; # 缓存10分钟 # s秒 m分 h时 d天 } } }
2. 修改首页index.html 让它去加载一个静态图片。
3. 重启可以看到效果(图片第一次加载花了7ms,后面再次刷新就是0ms,查看详细信息看到34分第一次缓存的,直到44分失效)。
反向代理
1. 比如现在有两个项目,url前缀分别是 /a /b
2. nginx.conf 配置网关
#user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#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;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
location /a {
proxy_pass http://127.0.0.1:8080/a/;
}
location /b {
proxy_pass http://127.0.0.1:8081/b/;
}
}
}
此时: 访问localhost/a/index 就相当于访问 127.0.0.1:8080/a/index了。
负载均衡
1: 我们把项目部署在两台服务器上,在hosts文件里面配置域名解析
2: 配置nginx服务器的负载均衡
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #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; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } #====================== 我们这里自定义负载均衡 ===================== server { # 监听80端口 listen 80; server_name www.wulei.com; location / { # 用来获取nginx的真实ip proxy_set_header X-Real_IP $remote_addr; proxy_pass http://myservers; }
# location /api {
# proxy_set_header X-Real_IP $remote_addr;
# #location 代理的url有前缀的时候 proxy_pass 的地址必须以为/结尾
# proxy_pass http://myservers/;
# }
} upstream myservers{ # ip_hash负载均衡策略: ip_hash; # 服务器地址 server 192.168.5.6:8081; server 192.168.5.5:8081; } }
测试:
常用负载均衡策略
1. ip_hash 策略:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream myservers{ ip_hash; server 192.168.5.6:8081; server 192.168.5.5:8081; }
2. 默认轮询策略:
upstream myservers{ server 192.168.5.6:8081; server 192.168.5.5:8081; }
3. 权重策略:指定轮询几率,weight和访问比率成正比
upstream myservers{ server 192.168.5.6:8081 weight=9; server 192.168.5.5:8081 weight=2; }
4. fiar策略(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream myservers{ server 192.168.5.6:8081; server 192.168.5.5:8081; fair; }
嗅探机制
如果某个应用挂了,请求不应该继续分发过去
max_fails 允许请求失败的次数,默认为1.当超过最大次数时就不会请求
fail_timeout : max_fails次失败后,暂停的时间,默认:fail_timeout为10s
默认http_404状态不被认为是失败的尝试
server { listen 80; server_name localhost; location /api { proxy_pass http://myservers/; # 将 失败 超时 500 503 404 计为失败 proxy_next_upstream error timeout http_500 http_503 http_404; } } upstream myservers{ # 60s 之内失败2次则熔断, 下一个节点再尝试分配流量 server 192.168.200.100:8080 max_fails=2 fail_timeout=60s; server 192.168.200.100:8081 max_fails=2 fail_timeout=60s; }
nginx限流
漏桶算法实现控制速率限流思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),当水流入速度过大会直接溢出(访问频率超过接口响应速率),然后就拒绝请求,可以看出漏桶算法能强行限制数据的传输速率.
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=2r/s;
server {
listen 80;
server_name localhost;
location /nacos {
#limit_req zone=myRateLimit;
#limit_req zone=myRateLimit burst=5;
limit_req zone=myRateLimit burst=5 nodelay;
proxy_pass http://127.0.0.1:8081/;
}
}
}
参数解析:
binary_remote_addr 是一种key,表示基于 remote_addr(客户端IP) 来做限流,
binary_ 的目的是压缩内存占用量。
zone:定义共享内存区来存储访问信息
myRateLimit:10m 表示一个大小为10M,名字为 myRateLimit的内存区域(名字可以自定义)。1M能存储16000 IP地址的访问信息,10M可以存储16W IP地址访 问信息。
rate 用于设置最大访问速率,rate=10r/s 表示每秒最多处理10个请求。Nginx 实际上以 毫秒为粒度来跟踪请求信息,因此 10r/s 实际上是限制:每100毫秒处理一个请求。这意味 着,自上一个请求处理完后,若后续100毫秒内又有请求到达,将拒绝处理该请求.我们这里 设置成2 方便测试。
limit_req zone=myRateLimit:标识应引用了上面的规则,每500ms可以处理一个请求。
burst:译为突发、爆发,表示在超过设定的处理速率后能额外处理的请求数,当 rate=2r/s 时,将1s拆成2份,即每500ms可处理1个请求。 此处,*burst=5 *,若同时有6个请求到达,Nginx 会处理第一个请求,剩余5个请求将放 入队列,然后每隔500ms从队列中获取一个请求进行处理。若请求数大于6,将拒绝处理 多余的请求,直接返回503.
nodelay:单独使用 burst 参数并不实用。假设 burst=50 ,rate为10r/s,排队中的50个请 求虽然每100ms会处理一个,但第50个请求却需要等待 50 * 100ms即 5s,这么长的处 理时间自然难以接受。 因此,burst 往往结合 nodelay 一起使用。处理突发5个请求的时候,没有延迟,等到完成之后,按照正常的速率处理。
跨域设置
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location /api { #代理的后台地址 proxy_pass http://192.168.200.100:8080/; # 指定允许跨域的方法,*代表所有 add_header Access-Control-Allow-Methods *; # 预检命令的缓存,如果不缓存每次会发送两次请求 add_header Access-Control-Max-Age 3600; # 带cookie请求需要加上这个字段,并设置为true add_header Access-Control-Allow-Credentials true; # 表示允许这个域跨域调用(客户端发送请求的域名和端口) # $http_origin动态获取请求客户端请求的域 不用*的原因是带cookie的请求不支持*号 add_header Access-Control-Allow-Origin $http_origin; # 表示请求头的字段 动态获取 add_header Access-Control-Allow-Headers $http_access_control_request_headers; # OPTIONS预检命令,预检命令通过时才发送请求 # 检查请求的类型是不是预检命令 if ($request_method = OPTIONS){ return 200; } } } }
。