关于Nginx,在日常工作中你可能用到的操作就这些了

简介: 关于Nginx,在日常工作中你可能用到的操作就这些了

背景


最近,全球都在制裁 NginxClickHouse 的诞生地。


计算机技术是一门实践至上、理论与工程结合的学科,无论你是做后端开发、系统架构、大数据开发还是数据分析工作,鼓捣环境的能力还是要有的。我们一般的开发人员使用 Nginx 不过是配个反向代理,基本上就足够了。 Nginx 本身是一个非常强大的工具,作为一名没用过 Nginx 的小白或者初学者,由于没有系统地学习过 Nginx ,在面临 Nginx 有关需求的时候一般是这样:我有一个需求或问题,我只想知道如何快速实现/解决,即:你就告诉我怎么做吧。

image.png

我是一名非专业的运维人员,一般作为救火队员出现。。以下列出关于 Nginx 的常见需求,搞定这些问题后,应对日常的非专业单运维工作便不在话下。


  1. Nginx静态资源服务器如何配置?
  2. Nginx如何做反向代理?
  3. Nginx反向代理后,如何获取客户端实际IP?
  4. Nginx做负载均衡怎么配置?
  5. Nginx负载均衡/负载倾斜后,客户端如何知道访问的是哪个主机/服务?
  6. Nginx如何做二级域名转发?
  7. Nginx如何配置HTTPS以及证书?
  8. Nginx如何配置HTTP2?
  9. Nginx如何开启GZIP压缩?
  10. Nginx控制台的警告怎么处理?
  11. Nginx报错:(上传文件)请求的实体过大怎么办?
  12. Nginx如何隐藏版本号?


Note: 01. 修改完配置后,可通过nginx -t测试配置是否存在语法错误或者typo; 02. 修改完配置后,记得通过nginx -s reload刷新使配置生效;


Nginx静态资源托管


如今,越来越多的前端工程师也开始使用 NginxTengineOpenResty 这类工具了。一般是将一些静态资源,或者干脆就是完整的前端项目作为静态资源服务进行部署。


  • Nginx静态资源服务器
location / {
        root  /opt/reading-notes/frontend/dist;
        index  index.html index.htm;
    }
  • Nginx配置代理跨域
location /api  {
            include  uwsgi_params;
            rewrite  ^/api/(.*)$ /$1 break;
            proxy_pass   http://localhost:8000;
    }
  • Vue打包部署后,刷新页面404
try_files $uri $uri/ /index.html;


Nginx反向代理


这里直接插播一道面试题,问:什么是反向代理,什么是正向代理?



Nginx反向代理后,如何获取客户端实际IP


当我配置了反向代理后,系统日志拿到的客户端IP全是 127.0.0.1 ,我要如何获取客户端实际IP呢?


# 转发源IP,编辑vi /etc/nginx/nginx.conf,在对应的location下增加配置
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


Nginx负载均衡


接触负载均衡,可能是你成为系统架构师(尤其是 Java 领域)的第一步。因为这个时候,便会衍生出当今计算机领域的一个核心关键词:“集群”。这跟人们的日常工作生活非常类似,一个人的力量是有限的,而一群人的智慧是无穷的。


  • 默认策略:轮询
upstream api-server {
        server 127.0.0.1:7000;
        server 127.0.0.1:8000;
    }
location /api  {
            include  uwsgi_params;
            rewrite  ^/api/(.*)$ /$1 break;
            proxy_pass   http://api-server;
    }
  • 修改策略:权重
upstream api-server {
        server 127.0.0.1:7000 weight=2;
        server 127.0.0.1:8000;
    }


Nginx负载均衡/负载倾斜后,客户端如何知道访问的是哪个主机/服务?


当我配置了负载均衡/负载倾斜后,我如何知道我访问的是哪个后端的主机/服务?

# 确定请求的响应来自于哪台主机,编辑vi /etc/nginx/nginx.conf,在对应的location下增加配置
add_header ServerIP $upstream_addr;

有了以上配置,可以在请求响应的头信息中看到 ServerIP 的信息。


Nginx二级域名转发


其实,所谓的二级域名转发,核心还是反向代理。



Nginx配置HTTPS加密传输


HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,在 HTTP 的基础上通过传输加密和身份认证保证了传输过程的安全性, HTTPS 的安全基础是 SSL 。实际中,我们一般是结合域名与 SSL 证书实现全站 HTTPS ,而且很多主流浏览器不推荐使用不安全的 HTTP 了。


Nginx配置HTTP2快速响应


HTTP/2HTTP 协议自 1999 年 HTTP 1.1 发布后的首个更新,主要基于 SPDY 协议。HTTP2的一些新特性:二进制分帧,多路复用,服务器推送,头部压缩等致力于加快请求的响应。我们实际中使用 HTTP2 结合 Undertow Web容器,实现对大量小图片的快速加载响应。


来自于《图解HTTP》中的一句话:


HTTP2的目标是改善用户在使用Web时的速度体验。


Nginx启用GZIP压缩


开始没启用 HTTP2 时,我们还采用过 GZIP 压缩来实现对较大响应体(json, js, css, text,具体多大时开始压缩可以自己配置)的压缩,这对带宽不富裕的小网站来说,是一种较好的解决方案;不过,开启 GZIP 压缩后,需要注意的是 CPU 与带宽之间的协调,因为压缩过程是要耗费 CPU 资源的,这就像我们常讲的“架构是一种权衡”类似。

# 编辑vi /etc/nginx/nginx.conf,在http下增加配置
    gzip on;
    gzip_buffers 32 4K;
    gzip_comp_level 8;
    gzip_min_length 1k;
    gzip_types application/json application/javascript text/css text/xml text/plain;
    gzip_disable "MSIE [1-6]\.";
    gzip_vary on;


Nginx控制台警告


警告虽然不影响实际服务的运行,可以忽略掉;但是对于患有强迫症的小伙伴来说,消除警告也是必要的(另外,我们有些前端同学对浏览器控制台的无效打印、警告是要求不允许出现的)。


nginx: [warn] could not build optimal proxy_headers_hash, you should increase either proxy_headers_hash_max_size: 512 or proxy_headers_hash_bucket_size: 64; ignoring proxy_headers_hash_bucket_size

# 编辑vi /etc/nginx/nginx.conf,在http下增加配置:proxy_headers_hash_bucket_size 1024;
proxy_headers_hash_bucket_size 1024;

nginx: [warn] could not build optimal types_hash, you should increase either types_hash_max_size: 2048 or types_hash_bucket_size: 64; ignoring types_hash_bucket_size

# 编辑vi /etc/nginx/nginx.conf,在http下增加配置:types_hash_bucket_size 1024;
types_hash_bucket_size 1024


请求响应报错


这主要在上传文件时出现, SpringBoot 项目限制了上传文件的大小,默认为1M,当用户上传了超过1M大小的文件时,可通过以下配置修改解决 SpringBoot 报错。


spring:
  servlet:
    multipart:
      maxFileSize: 10MB
      maxRequestSize: 30MB

SpringBoot 关于文件上传大小限制报错解决后, Nginx 又报错了:413 Request Entity Too Large,因为 Nginx 默认的 request body 也为1M。

413 Request Entity Too Large

# 编辑vi /etc/nginx/nginx.conf,在http下或者对应的反向代理location下增加配置:client_max_body_size 10m;
client_max_body_size 10m;


Nginx隐藏版本号


默认在请求的头信息中可以看到 Nginx 的版本信息。 Nginx 的有些版本有漏洞,而有些版本没有。这样直接暴露出版本号就容易成为攻击者可利用的信息。所以,从安全的角度来说,隐藏版本号会相对安全些。

image.png

# 在http部分配置:server_tokens  off;
http {
    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;
    server_tokens  off;
}

image.png



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
开发框架 小程序 Java
免费开题报告|基于SpringBoot+Vue的校内跑腿平台
免费开题报告|基于SpringBoot+Vue的校内跑腿平台
381 0
免费开题报告|基于SpringBoot+Vue的校内跑腿平台
|
机器学习/深度学习 移动开发 供应链
基于时间图神经网络多的产品需求预测:跨序列依赖性建模实战指南
本文展示了如何通过学习稀疏影响图、应用图卷积融合邻居节点信息,并结合时间卷积捕获演化模式的完整技术路径,深入分析每个步骤的机制原理和数学基础。
490 1
|
XML 网络协议 前端开发
Android国标接入终端实现GB28181实时位置(MobilePosition)上报
在实现本文提到的Android平台国标GB28181接入终端的实时位置上报之前,之前已经完成了Android终端GB28181常规功能接入,采集到实时音视频数据,编码PS打包后,按需传到GB28281服务平台,媒体流支持最新GB28181-2016的UDP和TCP被动模式,参数配置,支持注册有效期、心跳间隔、心跳间隔次数、TCP/UDP信令设置,支持RTP Sender IP地址类型、RTP Socket本地端口、SS-R-C、RTP socket 发送Buffer大小、RTP时间戳时钟频率设置,支持注册成功、注册超时、INVITE、ACK、BYE状态回调等。
571 0
|
网络安全 数据安全/隐私保护 iOS开发
push证书申请_iOS上架App Store
OS APP需要推送通知,要用到iOS推送证书,分为测试调试用的iOS推送证书和上架到App Store的ios 推送证书!
|
运维 关系型数据库 分布式数据库
阿里云与云和恩墨强强联手,正式推出zData X for PolarDB一体机
阿里云与云和恩墨的深入合作迈上新台阶!近日,双方强强联手,通过优势互补,正式联合推出高性能、高安稳、高可用的 zData X for PolarDB 一体机。这一突破性合作不仅加速了国产数据库生态建设,也为各行业客户提供了全新升级路径,助力数字化转型。
|
JavaScript 网络架构
【Vue3从零开始-实战】S14:详情页回退事件及路由参数的传递获取数据
【Vue3从零开始-实战】S14:详情页回退事件及路由参数的传递获取数据
885 0
【Vue3从零开始-实战】S14:详情页回退事件及路由参数的传递获取数据
|
机器学习/深度学习 算法 搜索推荐
Flink中的流式机器学习是什么?请解释其作用和常用算法。
Flink中的流式机器学习是什么?请解释其作用和常用算法。
673 0
|
并行计算 异构计算
cuda在windows10安装教程
首先找到这个图标,也就是nvidia控制面板
828 0
|
机器学习/深度学习 算法 大数据
机器学习入门:梯度下降算法(下)
机器学习入门:梯度下降算法(下)
|
机器学习/深度学习 算法 大数据
纯干货 | 机器学习中梯度下降法的分类及对比分析(附源码)
本文详细介绍了基于使用数据量的多少,时间复杂度以及算法准确率的不同类型的梯度下降法,并详细说明了3种梯度下降法的比较。
14936 0

热门文章

最新文章