Nginx 基础知识及实例解析

一、简介

Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强,目前使用最多的就是负载均衡。Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、php等。但是不支持 java。Java 程序只能通过与 tomcat 配合完成。Nginx 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验。

二、Nginx 安装

2.1. 下载 Nginx

官网下载地址:https://nginx.org/en/download.html

注意:同时还需安装 openssl 和 zlib 组件。 

2.2. 启动 Nginx

cd /usr/local/nginx/sbin/  # 根据实际安装目录
./nginx

三、基本使用

3.1. 常用命令

cd /usr/local/nginx/sbin/  # 根据实际安装目录
nginx -t         # 检查语法
nginx            # 启动
nginx -s reload  # 重启
nginx -s stop    # 关闭进程
nginx -s quit    # 平滑关闭nginx
nginx -V         # 查看nginx的安装状态

3.2. 简单代理

location / {
  proxy_pass http://127.0.0.1:3000;
  proxy_redirect      off;
  proxy_set_header    Host $host;
}

3.3. 全局变量

变量描述
$args这个变量等于请求行中的参数,同 $query_string
$remote_port客户端的端口
$content_length请求头中的 Content-length 字段
$remote_user已经经过 Auth Basic Module 验证的用户名
$content_type请求头中的 Content-Type 字段
$request_filename当前请求的文件路径,由 root 或alias指令与URI请求生成
$document_root当前请求在 root 指令中指定的值
$schemeHTTP方法(如http,https)
$host请求主机头字段,否则为服务器名称
$hostname主机名
$http_user_agent客户端agent信息
$http_cookie客户端cookie信息
$server_protocol请求使用的协议,通常是HTTP/1.0或HTTP/1.1
$server_addr服务器地址,在完成一次系统调用后可以确定这个值
$server_name服务器名称
$server_port请求到达服务器的端口号
$limit_rate这个变量可以限制连接速率
$request_method客户端请求的动作,如 GET/POST
$request_uri包含请求参数的原始URI,不包含主机名,如:/foo/bar.php?arg=baz
$remote_addr客户端的IP地址
$uri不带请求参数的当前URI,$uri不包含主机名,如 /foo/bar.html
$document_uri与 $uri 相同
$nginx_versionnginx 版本

详见:https://nginx.org/en/docs/varindex.html 

3.4. 监听端口

server {
  listen 80;             # 标准 HTTP 协议
  listen 443 ssl;        # 标准 HTTPS 协议
  listen 443 ssl http2;  # 对于 http2
  listen [::]:80;        # 使用 IPv6 在 80 上收听
  # 仅监听使用 IPv6
  listen [::]:80 ipv6only=on;
}

3.5. 监听域名

server {
  # 监听 example.com
  server_name example.com;
  # 监听多个域
  server_name example.com www.example.com;
  # 监听所有子域
  server_name *.example.com;
  # 监听所有顶级域
  server_name example.*;
  # 监听未指定的主机名(监听 IP 地址本身)
  server_name "";
}

3.6. 负载均衡

upstream test {
  server 127.0.0.1:83 weight=9; # 权重
  server 127.0.0.1:83 weight=1; # 权重
  # 失败超时时间
  server 127.0.0.1:83 max_fails=3;
  server 127.0.0.1:83 weight=3 down;
}

server 可选参数:

  1. weight:访问权重数值越高,收到请求越多
  2. fail_timeout:指定的时间内必须提供响应
  3. max_fails:尝试失败服务器连接的最大次数
  4. down:标记一个服务器不再接受任何请求
  5. backup:有服务器宕机,标记的机器接收请求

按访问url的hash结果来分配请求:

upstream backend {
  hash $request_uri;
  hash_method crc32;
  server localhost:8080;
  server localhost:8081;
}

响应时间短的优先分配:

upstream backend {
  fair;
  server localhost:8080;
  server localhost:8081;
}

按访问IP的hash结果来分配请求:

upstream test {
  ip_hash;
  server localhost:8080;
  server localhost:8081;
}

3.7. 子文件夹中的代理

location /folder/ { # / 很重要!
  proxy_pass http://127.0.0.1:3000/; # / 很重要!
  proxy_redirect      off;
  proxy_set_header    Host            $host;
  proxy_set_header    X-Real-IP       $remote_addr;
  proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
}

3.8. 静态资源

server {
  listen 80;
  server_name example.com;
  root /path/to/website;
  # root /www/data/ 示例,如果里面没有'root',它将寻找 /www/data/index.html
  location / {
  }
  location /images/ { # 如果里面没有“root”,它将寻找 /www/data/images/index.html
  }
  location /videos/ { # 由于里面有“root”,它会寻找 /www/media/videos/index.html
      root /www/media;
  }
}

3.9. HTTPS 协议

server {
  listen 443 ssl http2;
  server_name example.com;
  ssl on;

  ssl_certificate /path/to/cert.pem;
  ssl_certificate_key /path/to/privkey.pem;

  ssl_stapling on;
  ssl_stapling_verify on;
  ssl_trusted_certificate /path/to/fullchain.pem;

  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_session_timeout 1d;
  ssl_session_cache shared:SSL:50m;
  add_header Strict-Transport-Security max-age=15768000;
}

3.10. 反向代理

server {
  listen 80;
  server_name example.com;
  
  location / {
    proxy_pass http://0.0.0.0:3000;
    # 其中 0.0.0.0:3000 是绑定在 
    # 0.0.0.0端口3000 列表上的 Node.js 服务器
  }
}

upstream: 

upstream node_js {
  server 0.0.0.0:3000;
  # 其中 0.0.0.0:3000 是绑定在 
  # 0.0.0.0端口3000 列表上的 Node.js 服务器
}

server {
  listen 80;
  server_name example.com;
  
  location / {
    proxy_pass http://node_js;
  }
}

支持 WebSockets 的应用程序:

upstream node_js {
  server 0.0.0.0:3000;
}

server {
  listen 80;
  server_name example.com;
  
  location / {
    proxy_pass http://node_js;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
 
  }
}

3.11. 重定向(301永久)

将 www.example.com 重定向到 example.com:

server {
  listen 80;
  server_name www.example.com;
  return 301 http://example.com$request_uri;
}

3.12. 重定向(302临时)

server {
  listen 80;
  server_name mydomain.com;
  return 302 http://otherdomain.com;
}

3.13. 将 http 重定向到 https

server {
  listen 80;
  server_name yourdomain.com;
  return 301 https://$host$request_uri;
}

3.14. HTTP 请求端真实的IP

location / {
  proxy_set_header X-Forwarded-For $remote_addr;
}

3.15. 重定向参数

  • permanent:永久性重定向。日志中的状态码为 301。
  • redirect:临时重定向。日志中的状态码为 302。

四、示例

4.1. websocket 的代理 keepalive

upstream backend {
    server 127.0.0.1:3000;
    keepalive 5;
}
# HTTP Server
server {
  server_name my_hostname.com;
  error_log /var/log/nginx/mynginx.access.log;
  location / {
      proxy_pass http://backend;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forward-Proto http;
      proxy_set_header X-Nginx-Proxy true;
      proxy_redirect off;
  }
}

4.2. Apache 的反向代理

server {
  server_name domain.tld;

  access_log /log/domain.tld.access.log;
  error_log /log/domain.tld.error.log;
  root /var/www/domain.tld/htdocs;

  # 将请求传递给 Apache 后端
  location / {
      proxy_pass http://backend;
  }
  # 使用后备处理静态文件
  location ~* \.(ogg|ogv|svg|svgz|eot|otf|woff|woff2|ttf|m4a|mp4|ttf|rss|atom|jpe?g|gif|cur|heic|png|tiff|ico|zip|webm|mp3|aac|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf|swf|webp)$ {
      add_header "Access-Control-Allow-Origin" "*";
      access_log off;
      log_not_found off;
      expires max;
      try_files $uri @fallback;
  }
  # 如果找不到文件,则回退以将请求传递给 Apache
  location @fallback {
      proxy_pass http://backend;
  }
}

4.3. Gitlab 的反向代理

server {
  #侦听的80端口
  listen       80;
  server_name  git.example.cn;
  location / {
    proxy_pass   http://localhost:3000;
    # 以下是一些反向代理的配置可删除
    proxy_redirect             off;
    # 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
    proxy_set_header           Host $host;
    client_max_body_size       10m;  # 允许客户端请求的最大单文件字节数
    client_body_buffer_size    128k; # 缓冲区代理缓冲用户端请求的最大字节数
    proxy_connect_timeout      300;  # nginx跟后端服务器连接超时时间(代理连接超时)
    proxy_send_timeout         300;  # 后端服务器数据回传时间(代理发送超时)
    proxy_read_timeout         300;  # 连接成功后,后端服务器响应时间(代理接收超时)
    # 设置代理服务器(nginx)保存用户头信息的缓冲区大小
    proxy_buffer_size          4k;
    # proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
    proxy_buffers              4 32k;
    # 高负荷下缓冲大小(proxy_buffers*2)
    proxy_busy_buffers_size    64k;
  }
}

4.4. 重定向整个网站

server {
  server_name old-site.com;
  return 301 $scheme://new-site.com$request_uri;
}

4.5. 重定向单页

server {
  location = /oldpage.html {
    return 301 http://example.org/newpage.html;
  }
}

4.6. 重定向整个子路径

location /old-site {
  rewrite ^/old-site/(.*) http://example.org/new-site/$1 permanent;
}

4.7. 负载均衡

upstream example {
  ip_hash;
  # upstream的负载均衡,weight是权重,可以根据机器配置定义权重。
  # weigth参数表示权值,权值越高被分配到的几率越大。
  server 192.168.10.11:8081 ;
  server 127.0.0.1:82 weight=3;
  server 127.0.0.1:83 weight=3 down;
  server 127.0.0.1:84 weight=3; max_fails=3  fail_timeout=20s;
  server 127.0.0.1:85 weight=4;;
  keepalive 32;
}
server {
  #侦听的80端口
  listen       80;
  server_name  git.example.cn;
  location / {
    # 在这里设置一个代理,和 upstream 的名字一样
    proxy_pass   http://example;
  }
}

4.8. 内容缓存

允许浏览器基本上永久地缓存静态内容:

location /static {
    root /data;
    expires max;
}

如果要求浏览器永远不会缓存响应,请使用 -1:

location = /mynginx.png {
    mynginx_png;
    expires -1;
}

4.9. 跨域问题

server {
  listen 80;
  server_name api.xxx.com;
    
  add_header 'Access-Control-Allow-Origin' '*';
  add_header 'Access-Control-Allow-Credentials' 'true';
  add_header 'Access-Control-Allow-Methods' 'GET,POST,HEAD';

  location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host  $http_host;    
  } 
}

4.10. 代理转发

upstream server-api {
  # api 代理服务地址
  server 127.0.0.1:3110;    
}
upstream server-resource {
  # 静态资源 代理服务地址
  server 127.0.0.1:3120;
}
server {
  listen       3111;
  server_name  localhost; # 这里指定域名
  root /home/www/server-statics;
  # 匹配 api 路由的反向代理到API服务
  location ^~/api/ {
      rewrite ^/(.*)$ /$1 break;
      proxy_pass http://server-api;
  }
  # 假设这里验证码也在API服务中
  location ^~/captcha {
      rewrite ^/(.*)$ /$1 break;
      proxy_pass http://server-api;
  }
  # 假设你的图片资源全部在另外一个服务上面
  location ^~/img/ {
      rewrite ^/(.*)$ /$1 break;
      proxy_pass http://server-resource;
  }
  # 路由在前端,后端没有真实路由,
  # 路由不存在的 404 状态的页面返回 /index.html
  # 使用场景,用在 React/Vue项目没有真实路由
  location / {
    try_files $uri $uri/ /index.html =404;
    #                      空格很重要 ^
  }
}

4.11. 屏蔽 IP

include blockip.conf;
# 在 blockip.conf 里面输入内容,如:
deny 192.168.10.12;

deny IP;             # 屏蔽单个 ip 访问
allow IP;            # 允许单个 ip 访问
deny all;            # 屏蔽所有 ip 访问
allow all;           # 允许所有 ip 访问
deny 123.0.0.0/8;    # 屏蔽整个段即从 123.0.0.1 到 123.255.255.254 访问的命令
deny 124.45.0.0/16;  # 屏蔽IP段即从 123.45.0.1 到 123.45.255.254 访问的命令
deny 123.45.6.0/24;  # 屏蔽IP段即从 123.45.6.1 到 123.45.6.254 访问的命令

# 如果你想实现这样的应用,除了几个IP外,其他全部拒绝
allow 1.1.1.1; 
allow 1.1.1.2;
deny all; 

4.12. 强制将 http 重定向到 https

server {
  listen       80;
  server_name  example.com;
  rewrite ^ https://$http_host$request_uri? permanent; # 强制将 http 重定向到 https
  # 在错误页面和“服务器”响应头字段中启用或禁用发射nginx版本。 防止黑客利用版本漏洞攻击
  server_tokens off;
}

4.13. 爬虫 User-Agent 过滤

location / {
  if ($http_user_agent ~* "python|curl|java|wget|httpclient|okhttp") {
      return 503;
  }
  # 正常处理
  # ...
}

4.14. 图片防盗链

location ~* \.(gif|jpg|png|swf|flv)$ {
  root html;

  valid_referers none blocked *.nginx.com;

  if ($invalid_referer) {
    rewrite ^/ www.nginx.cn;
    # return 404;
  }
}

4.15. 虚拟目录配置

location /img/ {
  alias /var/www/image/;
}
# 访问 /img/ 目录里面的文件时,
# 会自动去 /var/www/image/ 目录找文件
location /img/ {
  root /var/www/image;
}
# 访问 /img/ 目录下的文件时,
# 会去 /var/www/image/img/ 目录下找文件

4.16. 屏蔽文件目录

# 通用备份和归档文件
location ~* "\.(old|orig|original|php#|php~|php_bak|save|swo|aspx?|tpl|sh|bash|bak?|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rdf)$" {
    deny all;
}

# 拒绝访问 .git 和 .svn 目录
location ~ (.git|.svn) {
    deny all;
}

# 拒绝访问隐藏文件和目录
location ~ /\.(?!well-known\/) {
    deny all;
}

4.17. 使网站不可索引

add_header X-Robots-Tag "noindex";

location = /robots.txt {
  return 200 "User-agent: *\nDisallow: /\n";
}

4.18. Gzip 配置

gzip  on;
gzip_buffers 16 8k;
gzip_comp_level 6;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
gzip_types
    text/xml application/xml application/atom+xml application/rss+xml application/xhtml+xml image/svg+xml
    text/javascript application/javascript application/x-javascript
    text/x-json application/json application/x-web-app-manifest+json
    text/css text/plain text/x-component
    font/opentype application/x-font-ttf application/vnd.ms-fontobject
    image/x-icon;
gzip_disable  "msie6";

注意:使用 SSL/TLS 协议时,压缩响应可能会受到 BREACH 攻击。最合适压缩的,还是普通的文本类型的响应,比如纯文本文件、html/css/js响应、xml、JSON数据等等。这个是比较消耗CPU资源的哦。

 


参考资料:https://nginx.org/en/docs/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/441954.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索考古文字场景,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建文本考古场景下的甲骨文字符图像检测识别系统

甲骨文是一种非常历史悠久的古老文字,在前面我们基本上很少有涉及这块的内容,最近正好在做文字相关的项目开发研究,就想着基于甲骨文的场景来开发对应的检测识别系统,在前文中我们基于YOLOv7开发构建了在仿真数据实验场景下的目标…

Mamba-minimal Mamba的最小限度实现 (一)

文章目录 参数和数据尺寸约定class MambaBlockdef forwarddef __ int__def ssmdef selective_scan johnma2006/mamba-minimal: Simple, minimal implementation of the Mamba SSM in one file of PyTorch. (github.com) manba的简单最小限度实现,和原始论文实现stat…

智能音箱技术解析

目录 前言智能音箱执行步骤解析1.1 探测唤醒词或触发词1.2 语音识别1.3 意图识别1.4 执行指令 2 典型的智能音箱2.1 百度小度音响2.2 小米小爱同学2.3 苹果 HomePod 3 功能应用举例3.1 设置计时器3.2 播放音乐 结语 前言 智能音箱已经成为日常生活中不可或缺的一部分&#xff…

亚信安慧AntDB:为数据安全和稳定而生

AntDB充分考虑了用户的需求,将用户体验置于优先位置,通过深入分析用户的使用情况,对数据库的性能和功能进行了全方位的优化。无论是对于小规模应用还是大规模企业级系统,AntDB都能够提供稳定高效的数据库服务,满足不同…

[BUG] docker运行Java程序时配置代理-Dhttp.proxyHost后启动报错

[BUG] docker运行Java程序时配置代理-Dhttp.proxyHost后启动报错 bug现象描述 版本:2.0.4(客户端和服务端都是) 环境:私有云环境,只有少量跳板机器可以访问公网,其他机器均通过配置代理方式访问公网 bug现…

新一代 Git 工具,AI 赋能!深度集成、简化操作 | 开源日报 No.194

gitbutlerapp/gitbutler Stars: 7.2k License: NOASSERTION gitbutler 是一个基于 Git 的版本控制客户端。旨在为现代工作流程构建一个全新的 Git 分支管理工具。 虚拟分支:可以同时在多个分支上工作,而无需不断切换分支简化提交管理:通过拖…

码垛【FB块】

转载&#xff1a; FUNCTION BLOCK 码垛 VAR INPUT 当前数:INT; 点l:Point; 点2:Point; X行数:REAL; Y列数:REAL; 2层数:REAL; END VAR VAR OUTPUT 目标点:Point; 点数量:INT; END VAR VAR // X差值:点2.x-点1.x; IF X行数>1 AND X差值<>0 THEN X间隔:X差值/(X行数-1)…

07.axios封装实例

一.简易axios封装-获取省份列表 1. 需求&#xff1a;基于 Promise 和 XHR 封装 myAxios 函数&#xff0c;获取省份列表展示到页面 2. 核心语法&#xff1a; function myAxios(config) {return new Promise((resolve, reject) > {// XHR 请求// 调用成功/失败的处理程序}) …

偶极子和环形天线的辐射机理仿真分析

目录 0 引言 1 偶极子天线的辐射因素分析 1.1 偶极子天线模型设计 1.2 谐振点的出现规律 1.3 天线尺寸对辐射的影响 1.4 天线角度对辐射的影响

c++ primer plus 第十五章笔记 友元,异常和其他

友元类&#xff1a; 两个类不存在继承和包含的关系&#xff0c;但是我想通过一个类的成员函数来修改另一个类的私有成员和保护成员的时候&#xff0c;可以使用友元类。 class A {private:int num;//私有成员//...public: //...friend class B;//声明一个友元类 }class…

ChatGPT Plus 自动扣费失败,如何续订

ChatGPT Plus 自动扣费失败&#xff0c;如何续订 如果您的 ChatGPT Plus 订阅过期或扣费失败&#xff0c;本教程将指导您如何重新订阅。 本周更新 ChatGPT Plus 是一种每月20美元的订阅服务。扣费会自动进行&#xff0c;如果您的账户余额不足&#xff0c;OpenAI 将在一次扣费…

css 背景图片居中显示

background 简写 background: #ffffff url(https://profile-avatar.csdnimg.cn/b9abdd57de464582860bf8ade52373b6_misnice.jpg) center center / 100% no-repeat;效果如图&#xff1a;

git - 笔记

为什么要学习Git 为什么要学习Git软件 为什么学习 因为在主流开发中&#xff0c;基于互联网软件开发的项目都会使用Git软件来进行项目开发过程中的资源管理 比如人力资源 代码资源 比如前端资源 .html .java等代码资源 文档资源 像项目开发中涉及到的需求文档等 这种项目中管理…

CRM术语速览:掌握这十个专业名词,成为CRM专家

无论您是销售人员还是采购经理&#xff0c;熟悉CRM管理系统专业术语都是一门必修课。擅于运用CRM专业术语帮助您理解CRM管理系统的功能、更好的开展业务。本文与您分享不得不知道的十大CRM专业术语&#xff0c;CRM常用术语合集。常见的CRM术语包括MQL、SQL、SDR、销售漏斗等等。…

带摄像头的 AirPods,苹果会怎么做出来?

苹果对智能产品的设计&#xff0c;正在放飞自我。 根爆料&#xff0c;苹果在「未来设备」的规划里&#xff0c;有两个大胆的想法&#xff1a; 一是带有屏幕的 HomePod 正在研发中&#xff0c;当中将集成 Apple TV、FaceTime 等重多功能&#xff1b;二是配备摄像头的 AirPod…

【ARM Trace32(劳特巴赫) 高级篇 21 -- SystemTrace ITM 使用介绍】

文章目录 SystemTrace ITMSystemTrace ITM 常用命令Trace Data AnalysisSystemTrace ITM CoreSight ITM (Instrumentation Trace Macrocell) provides the following information: Address, data value and instruction address for selected data cyclesInterrupt event info…

201909青少年软件编程(Scratch)等级考试试卷(三级)

青少年软件编程&#xff08;Scratch&#xff09;等级考试试卷&#xff08;三级&#xff09;2019年9月 第1题&#xff1a;【 单选题】 执行下面的脚本后&#xff0c;变量“分数”的值是多少&#xff1f;&#xff08;&#xff09; A:5 B:6 C:10 D:25 【正确答案】: C 【试题…

【Java网络编程】TCP核心特性(下)

1. 拥塞控制 拥塞控制&#xff1a;是基于滑动窗口机制下的一大特性&#xff0c;与流量控制类似都是用来限制发送方的传送速率的 区别就在于&#xff1a;"流量控制"是从接收方的角度出发&#xff0c;根据接收方剩余接收缓冲区大小来动态调整发送窗口的&#xff1b;而…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑多能互补灵活性和用户低碳意愿的区域综合能源系统鲁棒优化调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

STM32 SDRAM知识点

1.SDRAM和SRAM的区别 SRAM不需要刷新电路即能保存它内部存储的数据。而SDRAM&#xff08;Dynamic Random Access Memory&#xff09;每隔一段时间&#xff0c;要刷新充电一次&#xff0c;否则内部的数据即会消失&#xff0c;因此SRAM具有较高的性能&#xff0c;但是SRAM也有它…