前言:
老大要求把项目迁移到公司云环境,在部署整个项目的过程中,由于自己之前并不熟悉Nginx,导致在配置Nginx衔接前后端的过程中一直是步履蹒跚,磕磕绊绊,上周整个项目顺利进入了容器时代,就在这篇公号下,分享一下这段时间自己的Nginx入门。
Nginx是什么?
Nginx (engine x) 是一款轻量级的 Web 服务器 、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。
- Tip:何为代理?
参考:https://www.javazhiyin.com/36255.html(大佬写的很通熟易懂,推荐!)说到代理,首先我们要明确一个概念,所谓代理就是一个代表、一个渠道;正向代理:1.正向代理最大的特点是客户端非常明确要访问的服务器地址;2.正向代理模式屏蔽或者隐藏了真实客户端信息。正向代理的用途:1.访问原来无法访问的资源,如Google2.可以做缓存,加速访问资源3.对客户端访问授权,上网进行认证4.代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息反向代理:1.反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。反向代理的作用:1.保证内网的安全,通常将反向代理作为公网访问地址,Web服务器是内网2.负载均衡,通过反向代理服务器来优化网站的负载
Nginx入门级配置
- 基本指令
nginx -t 检查配置文件是否有语法错误nginx -s reload 热加载,重新加载配置文件nginx -s stop 快速关闭nginx -s quit 等待工作进程处理完成后关闭
- 基本配置
user nginx;#运行用户worker_processes 1;#启动进程,通常设置成和cpu的数量相等error_log /var/log/nginx/error.log warn; #error_log 日志pid /var/run/nginx.pid; #k8s节点events { worker_connections 1024;}#设定http服务器,利用它的反向代理功能提供负载均衡支持http { include /etc/nginx/mime.types; #设定mime类型(邮件支持类型),类型由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 /var/log/nginx/access.log main; # 日志输出目录 sendfile on; #tcp_nopush on; keepalive_timeout 65; # 链接超时时间,自动断开 #gzip on; server { listen 80;#设置我们nginx监听端口为8888 server_name localhost; add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept"; add_header Access-Control-Allow-Methods "GET, POST, OPTIONS"; root /data/appdeploy; location / { if ( $request_uri = "/" ) { rewrite "/" https://skyengine.mandao.com/platform break; } } location /platform { try_files $uri $uri/ /platform/index.html last; index index.html; } location /platform/api { proxy_pass http://skyengine-platform-svc.bx-bigdata.svc.cluster.local:8080;#需要代理的服务器地址 } } include /etc/nginx/conf.d/*.conf; # 引入其他的配置文件 }
- 负载均衡
Nginx通过反向代理可以实现服务的负载均衡,避免了服务器单节点故障,把请求按照一定的策略转发到不同的服务器上,达到负载的效果。以下基于常用的负载均衡策略进行配置介绍:
1.轮询将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。upstream test { # 默认所有服务器权重为 1 server 172.20.80.81:8080 server 172.20.80.82:8080}2、加权轮询不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。upstream test { server 172.20.80.81:8080 weight=3 server 172.20.80.82:8080 # default weight=1}3、ip_hash(源地址哈希法)根据获取客户端的IP地址,通过哈希函数计算得到一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客户端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。upstream test { ip_hash; # with default weight for all (weight=1) server 172.20.80.81:8080 server 172.20.80.82:8080}4、随机通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。5、least_conn(最小连接数法)upstream test { least_conn; # with default weight for all (weight=1) server 172.20.80.81:8080 server 172.20.80.82:8080}6.fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配。upstream test { fair; server 172.20.80.81:8080 server 172.20.80.82:8080}7.url_hash(第三方)按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法upstream test { hash $request_uri; hash_method crc32; server 172.20.80.81:8080 server 172.20.80.82:8080}
禁止文件缓存
location ~* .(js|css|png|jpg|gif)$ { add_header Cache-Control no-store;}
- 根据文件类型设置过期时间nginx
location ~.*.css$ { expires 1d; break;}location ~.*.js$ { expires 1d; break;}location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ { access_log off; expires 15d; #保存15天 break;}
- 静态文件压缩
server { # 开启gzip 压缩 gzip on; # 设置gzip所需的http协议最低版本 (HTTP/1.1, HTTP/1.0) gzip_http_version 1.1; # 设置压缩级别,压缩级别越高压缩时间越长 (1-9) gzip_comp_level 4; # 设置压缩的最小字节数, 页面Content-Length获取 gzip_min_length 1000; # 设置压缩文件的类型 (text/html) gzip_types text/plain application/javascript text/css;}
禁止指定user_agent
#虚拟主机的配置文件里加入:if ($http_user_agent ~* 'baidu|360|sohu') #禁止useragent为baidu、360和sohu,~*表示不区分大小写匹配{ return 403;}
- 指定错误页面
# 根据状态码,返回对于的错误页面error_page 500 502 503 504 /50x.html;location = /50x.html { root /source/error_page;}
- 防盗链(可以防止文件被其他网站调用)
location ~* .(gif|jpg|png)$ { # 只允许 172.20.31.64 请求资源 valid_referers none blocked 172.20.31.64; if ($invalid_referer) { rewrite ^/ http://$host/logo.png; }}
总结:
Nginx 博大精深,找时间还是得好好深入的学习一下~