跳到主要内容

2、nginx使用

Nginx使用

目录

[toc]

简介

Nginx 是非常重要的负载均衡中间件,被广泛应用于大型网站架构,下面我就全面来详解 。

Nginx 是一款轻量级的高性能的 Web 服务器和反向代理服务器,是由俄罗斯的程序设计师 Igor Sysoev 所开发。

Nginx 处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数


Nginx 是一个很牛的高性能Web和反向代理服务器, 它具有有很多非常优越的特性;

在高连接并发的情况下,Nginx是Apache服务器不错的替代品,目前Web服务器调查显示Apache下降Ngnix攀升,linux下更多的服务商选择了Ngnix放弃了Apache;

Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一. 能够支持高达 50,000 个并发连接数的响应, 感谢Nginx为我们选择了 epoll and kqueue作为开发模型.

目前中国大陆使用nginx网站用户有:新浪、网易、 腾讯,另外知名的微网志Plurk也使用nginx。

而Nginx专门为性能优化而开发,性能是最重要的考量,非常注重效率,Nginx能够支持高达50000个并发连接响应数。

特点

由于以下这几点,所以使用 Nginx 非常火,在互联网项目中广泛应用。

  • 相较于 Apache 具有占有内存少、稳定性高、并发能力强等优势;

  • Nginx 使用基于事件驱动架构,使得其可以支持**数以百万级别的 TCP 连接**;

  • 高度的模块化、扩展性好、和自由软件许可证、使得第三方模块层出不穷;

  • Nginx 是一个跨平台服务器,可以运行在 Linux、Windows、Mac OS 等操作系统上。

功能应用

1. 正向代理

正向代理最大的特点是:客户端非常明确要访问的服务器地址,服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端,正向代理模式屏蔽或者隐藏了真实客户端信息。

例如:在大陆访问 www.google.com,我们需要一个代理服务器,我们通过代理服务器去访问谷歌,这个过程就是正向代理。

来看个示意图:

我们可以通过这种方式,访问原来无法访问的资源,比如:Google。

2. 反向代理

反向代理,客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器。

来看个示意图:

由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。

3. 负载均衡

单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上。

来个示意图:

将用户访问的请求,根据负载均衡算法,分发到集群中的一台处理服务器,这就是我们说的负载均衡。

4. 动静分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。

来个示意图:

下载

1.Nginx 官网下载

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

image-20240603122545546

2. 下载稳定版

如下图所示:

然后再把 Nginx 的下载包,上传 Linux 服务器。

命令

Nginx 常用命令:

nginx -s stop       快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。
nginx -s quit 平稳关闭Nginx,保存相关信息,有安排的结束web服务。

nginx -s reload #因改变了Nginx相关配置,需要重新加载配置而重载。

nginx -s reopen 重新打开日志文件。
nginx -c filename 为 Nginx 指定一个配置文件,来代替缺省的。

nginx -t #不运行,仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。

nginx -v #显示 nginx 的版本。

service nginx restart #重启 Nginx 服务

nginx -V 显示 nginx 的版本,编译器版本和配置参数。

Nginx 配置 🐱‍👓

目录结构

目录Nginx 配置文件所在位置:nginx/conf/nginx.conf

目录结构

├── conf                             ## Nginx所有配置文件的目录
│ ├── fastcgi.conf ## fastcgi相关参数的配置文件
│ ├── fastcgi.conf.default ## fastcgi.conf的原始备份文件
│ ├── fastcgi_params ## fastcgi的参数文件
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types ## 媒体类型
│ ├── mime.types.default
│ ├── nginx.conf ## Nginx主配置文件 (常用)
│ ├── nginx.conf.default
│ ├── scgi_params ## scgi相关参数文件
│ ├── scgi_params.default
│ ├── uwsgi_params ## uwsgi相关参数文件
│ ├── uwsgi_params.default
│ └── win-utf
├── fastcgi_temp ## fastcgi临时数据目录
├── html ## Nginx默认站点目录
│ ├── 50x.html ## 错误页面优雅替代显示文件,例如当出现502错误时会调用此页面
│ └── index.html ## 默认的首页文件 (常用)
├── logs ## Nginx日志目录
│ ├── access.log ## 访问日志文件
│ ├── error.log ## 错误日志文件
│ └── nginx.pid ## pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
├── proxy_temp ## 临时目录
├── sbin ## Nginx命令目录
│ └── nginx ## Nginx的启动命令
├── scgi_temp ## 临时目录
└── uwsgi_temp ## 临时目录

Nginx 配置结构

main        ## 全局配置,对全局生效
├── events ## 配置影响 nginx 服务器或与用户的网络连接
├── http ## 配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置
│ ├── upstream ## 配置后端服务器具体地址,负载均衡配置不可或缺的部分
│ ├── server ## 配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块
│ ├── server
│ │ ├── location ## server 块可以包含多个 location 块,location 指令用于匹配 uri
│ │ ├── location
│ │ └── ...
│ └── ...
└── ...

Nginx 配置含义

  • **全局块 main:**nginx 的全局配置,对全局生效;

  • **events:**配置影响 nginx 服务器或与用户的网络连接;

  • **http:**可以嵌套多个 server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;

  • **server:**配置虚拟主机的相关参数,一个 http 中可以有多个 server;

  • **location:**配置请求的路由,以及各种页面的处理情况;

  • **upstream:**配置后端服务器具体地址,负载均衡配置不可或缺的部分。

Nginx 配置文件

worker_processes  1## worker进程的数量
events { ## 事件区块开始
worker_connections 1024## 每个worker进程支持的最大连接数
} ## 事件区块结束

http { ## HTTP区块开始
include mime.types;## Nginx支持的媒体类型库文件
default_type application/octet-stream;## 默认的媒体类型
sendfile on;## 开启高效传输模式
keepalive_timeout 65## 连接超时

server { ## 第一个Server区块开始,表示一个独立的虚拟主机站点
listen 80## 提供服务的端口,默认80
server_name localhost;## 提供服务的域名主机名
location / { ## 第一个location区块开始
root html;## 站点的根目录,相当于Nginx的安装目录
index index.html index.htm;## 默认的首页文件,多个用空格分开
}
## 第一个location区块结束


error_page 500502503504 /50x.html;## 出现对应的http状态码时,使用50x.html回应客户
location = /50x.html { ## location区块开始,访问50x.html
root html;## 指定对应的站点目录为html
}

}

案例:如何强制http跳转https(2种方式)(已解决)

方法1:return语句**(推荐)**

如果只是简单的HTTP到HTTPS的重定向,可以使用 return 指令代替 rewrite,例如:

server {
listen 80;
server_name test.com;

# http强制跳转到https
return 301 https://$server_name$request_uri;
}

return 指令在这种简单重定向场景下更为直观和高效。

方法2:rewrite语法

server {
listen 80;
server_name test.com;

# http强制跳转到https
rewrite ^(.*)$ https://$server_name$1 permanent;
}

rewrite语法

rewrite指令是Nginx中用于重写URL的强大工具,可以用于实现URL重定向、URL重写等操作。你提到的这条语句用于将所有HTTP请求强制重定向到HTTPS。下面详细介绍这条rewrite语句的语法及其各个部分的含义。

rewrite指令在serverlocation、和if块中都可以使用。

==1、语法结构==

rewrite regex replacement [flag];
  • regex: 正则表达式,用于匹配请求的URI。
  • replacement: 替换字符串,用于生成新的URI。
  • flag: 可选参数,指定重写的行为,比如permanentredirectbreak等。

其他常用的flag:

  • last: 停止处理当前的rewrite指令,并重新搜索配置块内的其他指令。
  • break: 停止处理当前的rewrite指令,但不重新搜索配置块内的其他指令。
  • redirect: 返回HTTP 302(临时重定向)状态码。
  • permanent: 返回HTTP 301(永久重定向)状态码。

==2、示例==

结合你提供的配置,完整的Nginx配置段如下:

server {
listen 80;
server_name test.com;

# http强制跳转到https
rewrite ^(.*)$ https://$server_name$1 permanent;
}

这段配置的作用是:

  1. 监听80端口,即HTTP请求。
  2. 匹配服务器名称为 test.com 的请求。
  3. 使用 rewrite 指令将所有HTTP请求重定向到相应的HTTPS地址,并返回HTTP 301状态码。

说明:

示例语句分析

rewrite ^(.*)$ https://$server_name$1 permanent;
  1. ^(.*)$
  • ^: 表示匹配字符串的开头。

  • (.*):

    • . 表示匹配任意一个字符(除换行符外)。
    • * 表示匹配前面的字符任意次(包括0次)。
    • 括号 () 是一个捕获组,用于捕获匹配到的内容。
  • $: 表示匹配字符串的结尾。

因此,^(.*)$ 表示匹配整个字符串,并将其捕获到第一个捕获组中。

  1. https://$server_name$1
  • https://: 表示重定向后的协议是HTTPS。
  • $server_name: Nginx变量,表示当前请求的服务器名称(即配置中的server_name)。
  • $1: 捕获组引用,引用前面正则表达式中第一个捕获组的内容(即整个URI)。

这部分合在一起表示,重定向到的URL为 https:// 加上服务器名称以及请求的URI。

  1. permanent
  • permanent: 表示HTTP 301永久重定向。这告诉浏览器和搜索引擎,这个重定向是永久性的,应更新其记录。

完整语句的含义

rewrite ^(.*)$ https://$server_name$1 permanent;

这条语句的作用是将所有匹配 ^(.*)$ 正则表达式的请求(即所有请求)重定向到 HTTPS 协议,并保持请求的URI不变,同时返回 HTTP 301(永久重定向)状态码。

案例:配置nginx反向代理(已解决)

这个方法是亲测有效的!

确保Nginx的配置正确,尤其是反向代理部分。以下是一个基本的Nginx反向代理配置示例:

server {
listen 80;
server_name your_domain_or_ip;

location / {
proxy_pass http://localhost:你的应用端口;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

请确保 your_domain_or_ip 替换为你的域名或IP地址,你的应用端口 替换为Docker容器中运行的应用端口。

案例:配置301重定向(已解决)

测试成功。

#vim /etc/nginx/nginx.conf
……
location /halo {
return 301 http://47.100.215.163:8090;
}

#相册
location /photo {
return 301 http://47.100.215.163:8080;
}

image-20240611123218288


测试效果:

访问https://onedayxyy.cn/halo链接时,就直接被重定向到了如下链接:

http://47.100.215.163:8090/

image-20240611123335180

实战:在Nginx服务器安装SSL证书并配置强制跳转https-2023.10.16(测试成功)

image-20231016095643548

原文链接

https://help.aliyun.com/zh/ssl-certificate/user-guide/install-ssl-certificates-on-nginx-servers-or-tengine-servers?spm=a2c4g.11186623.0.0.7ab93cb39AuLXF

image-20231016074122660

更新时间:2023-10-12 11:54:24

产品详情

相关技术圈

我的收藏

您可以在Nginx或Tengine服务器上安装SSL证书,实现通过HTTPS安全访问Web服务器。本文介绍如何为Nginx或Tengine服务器安装SSL证书。

重要

本文以CentOS 8.0 64位操作系统、Nginx 1.14.2为例介绍。不同版本的操作系统或Web服务器,部署操作可能有所差异,如有问题,请联系产品技术专家进行咨询,详情请参见专家一对一服务

如果您使用的是阿里云云服务器ECS(Elastic Compute Service),必须在ECS管理控制台安全组页面,放行80端口和443端口,否则网站访问可能出现异常。关于如何配置安全组,请参见添加安全组规则

本文中出现证书文件名称的地方,统一使用cert-file-name进行描述。例如,本文中用到的证书文件为cert-file-name.pem,证书私钥文件为cert-file-name.key。在实际操作过程中,您必须使用正确的证书文件名称替换示例代码中的cert-file-name

本次自己的环境是:centos7.9 阿里云轻量应用服务器。

前提条件

  • 已通过数字证书管理服务控制台签发证书。具体操作,请参见购买SSL证书提交证书申请
  • SSL证书绑定的域名已完成DNS解析,即您的域名与主机IP地址相互映射。您可以通过DNS验证证书工具,检测域名DNS解析是否生效。具体操作,请参见DNS验证

🍀

免费证书领取规则

每个经过实名认证的阿里云账号(主账号),在每一个自然年内,可以通过数字证书管理服务的免费证书购买页,免费获取20个DV单域名证书【免费试用】

自然年是每年的01月01日~12月31日。免费领取的证书资源包在每个自然年末将未申请的额度清零(每年12月31日24:00:00),您需要等到第二年的1月1日00:00:00后申请领取当年的免费证书资源包。

步骤一:下载SSL证书

注意:

阿里云/腾讯云等都是可以免费下载ssl证书的。

image-20231016105310979

image-20231016105359988

  1. 登录数字证书管理服务控制台

  2. 在左侧导航栏,单击SSL 证书

  3. SSL 证书页面,定位到目标证书,在操作列,单击下载

  4. 服务器类型为Nginx的操作列,单击下载

  5. 解压缩已下载的SSL证书压缩包。

    根据您在提交证书申请时选择的CSR生成方式,解压缩获得的文件不同,具体如下表所示。CSR

    CSR生成方式证书压缩包包含的文件
    系统生成选择已有的CSR证书文件(PEM格式):默认以证书ID_证书绑定域名命名。PEM格式的证书文件是采用Base64编码的文本文件。私钥文件(KEY格式):默认以证书绑定域名命名。
    手动填写如果您填写的是通过数字证书管理服务控制台创建的CSR,下载后包含的证书文件与系统生成的一致。如果您填写的不是通过数字证书管理服务控制台创建的CSR,下载后只包括证书文件(PEM格式),不包含证书密码或私钥文件。您可以通过证书工具,将证书文件和您持有的证书密码或私钥文件转换成所需格式。转换证书格式的具体操作,请参见证书格式转换

个人已经下载好的证书如下:

image-20231016105500080

步骤二:在Nginx服务器安装证书

1.在Nginx服务器安装证书

在Nginx独立服务器、Nginx虚拟主机上安装证书的操作不同,请根据您的实际环境,选择对应的安装步骤。

这里在Nginx独立服务器上安装证书:

  1. 执行以下命令,在Nginx的conf目录下创建一个用于存放证书的目录。

    cd /usr/local/nginx/conf  #进入Nginx默认配置文件目录。该目录为手动编译安装Nginx时的默认目录,如果您修改过默认安装目录或使用其他方式安装,请根据实际配置调整。
    mkdir cert #创建证书目录,命名为cert。

    自己本次的nginx安装目录为默认目录:

    cd /etc/nginx/
    mkdir cert
  2. 将证书文件和私钥文件上传到Nginx服务器的证书目录(/usr/local/nginx/conf/cert)。

    说明

    您可以使用远程登录工具附带的本地文件上传功能,上传文件。例如PuTTy、Xshell或WindSCP等。如果您使用的阿里云云服务器 ECS,上传文件具体操作,请参见本地Windows主机使用MSTSC上传文件到Windows云服务器上传文件到Linux云服务器

    自己本次创建的目录及证书文件如下:

    [root@hexo-blog cert]# ll -h
    total 16K
    -rw-r--r-- 1 root root 4.1K Oct 16 07:40 11010099_www.onedayxyy.cn_nginx.zip
    -rw-r--r-- 1 root root 1.7K Oct 16 07:40 www.onedayxyy.cn.key
    -rw-r--r-- 1 root root 3.8K Oct 16 07:40 www.onedayxyy.cn.pem
  3. 编辑Nginx配置文件nginx.conf,修改与证书相关的配置。

    1. 执行以下命令,打开配置文件。

      vim /usr/local/nginx/conf/nginx.conf

      #自己本次Nginx配置文件位置:
      vim /etc/nginx/nginx.conf

      重要

      nginx.conf默认保存在/usr/local/nginx/conf目录下。如果您修改过nginx.conf的位置,可以执行nginx -t,查看nginx的配置文件路径,并将/usr/local/nginx/conf/nginx.conf进行替换。

    2. i键进入编辑模式。

    3. 在nginx.conf中定位到server属性配置。

    4. 删除行首注释符号#,并根据如下内容进行修改。

      server {
      #HTTPS的默认访问端口443。
      #如果未在此处配置HTTPS的默认访问端口,可能会造成Nginx无法启动。
      listen 443 ssl;

      #填写证书绑定的域名
      server_name <yourdomain>;

      #填写证书文件名称
      ssl_certificate cert/<cert-file-name>.pem;
      #填写证书私钥文件名称
      ssl_certificate_key cert/<cert-file-name>.key;

      ssl_session_cache shared:SSL:1m;
      ssl_session_timeout 5m;

      #自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
      #TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差。
      ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
      ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

      #表示优先使用服务端加密套件。默认开启
      ssl_prefer_server_ciphers on;


      location / {
      root html;
      index index.html index.htm;
      }
      }

      image-20231016102745841

    5. 执行以下命令,重启Nginx服务。

      cd /usr/local/nginx/sbin  #进入Nginx服务的可执行目录。
      ./nginx -s reload #重新载入配置文件。

🚩说明

报错`the "ssl" parameter requires ngx_http_ssl_module`:您需要重新编译Nginx并在编译安装的时候加上`--with-http_ssl_module`配置。

- 报错`"/cert/3970497_demo.aliyundoc.com.pem":BIO_new_file() failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/cert/3970497_demo.aliyundoc.com.pem','r') error:2006D080:BIO routines:BIO_new_file:no such file)`:您需要去掉证书相对路径最前面的`/`。例如,您需要去掉`/cert/cert-file-name.pem`最前面的`/`,使用正确的相对路径`cert/cert-file-name.pem`

🚩 在Nginx虚拟主机上安装证书

在不同的虚拟主机上安装证书,您需要执行不同的操作步骤。如果您使用的是阿里云的云虚拟主机,具体操作,请参见开启HTTPS加密访问。如果您使用的是其他品牌的虚拟主机,请参考对应的虚拟主机安装证书的操作指南。

2.可选:==设置HTTP请求自动跳转HTTPS。==

如果您希望所有的HTTP访问自动跳转到HTTPS页面,则可以在需要跳转的HTTP站点下添加rewrite语句。

重要

以下代码片段需要放置在nginx.conf文件中server {}代码段后面,即设置HTTP请求自动跳转HTTPS后,nginx.conf文件中会存在两个server {}代码段。

server {
listen 80;
#填写证书绑定的域名
server_name <yourdomain>;
#将所有HTTP请求通过rewrite指令重定向到HTTPS。
rewrite ^(.*)$ https://$host$1;
location / {
index index.html index.htm;
}
}


#自己配置如下:
server {
listen 80;
#填写证书绑定的域名
server_name www.onedayxyy.cn;
root /root/rsync/public;
#将所有HTTP请求通过rewrite指令重定向到HTTPS。
rewrite ^(.*)$ https://$host$1;
location / {
index index.html index.htm;
}
}

配置效果如下图所示:

image-20231016102446940

完整配置如下:

[root@hexo-blog ~]# cat  /etc/nginx/nginx.conf
# 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 auto;
error_log /var/log/nginx/error.log;
pid /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 /var/log/nginx/access.log main;

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;

include /etc/nginx/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;
# listen [::]:80;
# server_name onedayxyy.cn;
# #root /usr/share/nginx/html;
# root /root/rsync/public;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# error_page 404 /404.html;
# location = /404.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
#
# #将所有HTTP请求通过rewrite指令重定向到HTTPS。
# rewrite ^(.*)$ https://$host$1;
# location / {
# index index.html index.htm;
# }
#
# }

# Settings for a TLS enabled server.
#
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.onedayxyy.cn;
root /root/rsync/public;

ssl_certificate "cert/www.onedayxyy.cn.pem";
ssl_certificate_key "cert/www.onedayxyy.cn.key";

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
#ssl_ciphers HIGH:!aNULL:!MD5;
#自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
#TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

ssl_prefer_server_ciphers on;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}


}

server {
listen 80;
#填写证书绑定的域名
server_name www.onedayxyy.cn;
root /root/rsync/public;
#将所有HTTP请求通过rewrite指令重定向到HTTPS。
rewrite ^(.*)$ https://$host$1;
location / {
index index.html index.htm;
}
}


}

[root@hexo-blog ~]#

修改完成后,按Esc键、输入**:wq并按Enter**键,保存修改后的配置文件并退出编辑模式。

执行以下命令,重启Nginx服务。

cd /usr/local/nginx/sbin  #进入Nginx服务的可执行目录。
./nginx -s reload #重新载入配置文件。

步骤三:验证SSL证书是否安装成功

证书安装完成后,您可通过访问证书的绑定域名验证该证书是否安装成功。

https://yourdomain   #需要将yourdomain替换成证书绑定的域名。

这里输入:

www.onedayxyy.cn或者http://www.onedayxyy.cn或者https://www.onedayxyy.cn都可以正常访问我的网站。

如果网页地址栏出现小锁标志,表示证书已经安装成功。

image..png

image-20231016095549411

案例:1台服务器上的nginx代理多个静态站点内容==(测试成功)==

🍀 gpt提问

2023年11月10日

1台服务器上的nginx可以代理多个静态站点内容,我们然后通过1个域名的多个子链接分别连到不同的网页嘛?

是的,你可以在一台服务器上使用Nginx来代理多个静态站点的内容,并通过一个域名的多个子链接来访问不同的网页。

例如,假设你有两个静态站点,分别是site1和site2,并且你有一个域名example.com。你可以在Nginx的配置文件中设置如下:

server {
listen 80;
server_name example.com;

location /site1 {
alias /path/to/site1/;
index index.html;
}

location /site2 {
alias /path/to/site2/;
index index.html;
}
}

在上面的配置中,我们设置了一个Nginx服务器块,它监听80端口,并将域名example.com与这个服务器块关联起来。

然后,我们使用location指令来定义不同的路径(/site1和/site2)与不同的静态站点关联。alias指令用于指定每个路径对应的静态站点文件夹的位置。

最后,我们使用index指令来指定默认的首页文件(通常是index.html)。

现在,当你访问http://example.com/site1时,Nginx会将请求代理到/path/to/site1/目录下,并返回相应的静态内容。同样,访问http://example.com/site2时,Nginx会将请求代理到/path/to/site2/目录下。

这样,你可以在一台服务器上托管多个静态站点,并通过不同的子链接访问它们。


自己实现效果:

[root@hexo-blog ~]# cat /etc/nginx/nginx.conf
#[root@hexo-blog ~]# cat /etc/nginx/nginx.conf
# 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 auto;
error_log /var/log/nginx/error.log;
pid /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 /var/log/nginx/access.log main;

sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;

include /etc/nginx/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;
# listen [::]:80;
# server_name onedayxyy.cn;
# #root /usr/share/nginx/html;
# root /root/rsync/public;
#
# # Load configuration files for the default server block.
# include /etc/nginx/default.d/*.conf;
#
# error_page 404 /404.html;
# location = /404.html {
# }
#
# error_page 500 502 503 504 /50x.html;
# location = /50x.html {
# }
#
# #将所有HTTP请求通过rewrite指令重定向到HTTPS。
# rewrite ^(.*)$ https://$host$1;
# location / {
# index index.html index.htm;
# }
#
# }

# Settings for a TLS enabled server.
#
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.onedayxyy.cn;
root /root/rsync-wiki/build;

ssl_certificate "cert/www.onedayxyy.cn.pem";
ssl_certificate_key "cert/www.onedayxyy.cn.key";

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
#ssl_ciphers HIGH:!aNULL:!MD5;
#自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
#TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

ssl_prefer_server_ciphers on;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}


}

server {
listen 80;
#填写证书绑定的域名
server_name www.onedayxyy.cn;
root /root/rsync-wiki/build;
#将所有HTTP请求通过rewrite指令重定向到HTTPS。
#rewrite ^(.*)$ https://$host$1;

location / {
index index.html index.htm;
}

location /blog {
alias /root/rsync/public;
index index.html;
}



}


}

[root@hexo-blog ~]#

image-20231119170042270

image-20231119170112965

案例:nginx配置某个目录提供服务方法==(测试成功)==

2023年12月10日09测试

nginx如何共享一个目录,这个目录里面存放的是大量照片,想让别人能公开访问这些照片,类似于一个相册的功能?

在 Nginx 中配置共享一个目录,以提供类似相册的公开访问功能,可以通过以下步骤完成。以下是一个简单的示例:

假设你的照片目录路径为 /path/to/your/photos

  1. 安装 Nginx: 如果尚未安装 Nginx,请先安装它。具体步骤取决于你使用的操作系统,但一般来说,你可以使用包管理器(例如,apt、yum、brew)进行安装。

  2. 创建 Nginx 配置文件: 在 Nginx 的配置目录中创建一个新的配置文件,比如 /etc/nginx/sites-available/photos

    server {
    listen 80;
    server_name yourdomain.com; # 替换成你的域名或 IP 地址

    location / {
    autoindex on; # 启用目录索引
    root /path/to/your/photos;
    index index.html; # 默认显示index.html文件,如果没有则列出目录内容
    }
    }

    注意替换 yourdomain.com 为你的域名或 IP 地址,/path/to/your/photos 为你存放照片的目录路径。

  3. 启用站点配置: 创建一个符号链接将配置文件链接到 sites-enabled 目录:

    sudo ln -s /etc/nginx/sites-available/photos /etc/nginx/sites-enabled/
  4. 测试配置: 使用以下命令检查 Nginx 配置是否有语法错误:

    sudo nginx -t

    如果一切正常,重新加载 Nginx 以应用新的配置:

    sudo service nginx reload
  5. 访问相册: 打开浏览器,访问 http://yourdomain.com 或服务器的 IP 地址,应该能够看到照片目录的内容。

请注意,上述配置是一个简单的例子,你可能需要根据具体需求进行更复杂的配置,例如添加访问控制、使用域名、添加 SSL 支持等。确保 Nginx 有足够的权限来读取照片目录中的文件,以便能够正常提供服务。


自己配置过程:

  • 配置nginx.conf
[root@ecs-docusaurus-wiki ~]# vim /etc/nginx/nginx.conf
……
location /photos {
autoindex on; # 启用目录索引
alias /photos;
index index.html; # 默认显示index.html文件,如果没有则列出目录内容
}
……

重启nginx服务。

  • 创建测试目录
[root@ecs-docusaurus-wiki ~]# tree /photos/
/photos/
├── test1
│   ├── 2.png
│   ├── 3.jpg
│   ├── beauty.jpg
│   ├── image-20211125160712620.png
│   └── img-16168908375660dd648385e62a648f8261c9f65fe8218.jpg
└── test2

2 directories, 5 files
[root@ecs-docusaurus-wiki ~]#
  • 测试效果

还是不符合自己预期,没有缩略图,体验很差;--丢弃。

案例:nginx能否对每个反向代理的服务单独配置一个nginx.conf配置文件呢?-2024.8.4(反向代理)(子域名配配置)(已解决)

gpt

是的,Nginx 可以对每个反向代理的服务单独配置一个 nginx.conf 配置文件。这样做的好处是可以将配置文件模块化,便于管理和维护。以下是如何实现这一目标的步骤:

  1. 创建单独的配置文件: 为每个反向代理的服务创建一个单独的配置文件。例如,假设你有两个服务 service1service2,你可以创建两个配置文件 service1.confservice2.conf

  2. 将配置文件放置在适当的目录: 将这些单独的配置文件放置在 Nginx 的配置目录中,例如 /etc/nginx/conf.d//etc/nginx/sites-available/

  3. 在主配置文件中包含这些配置文件: 在 Nginx 的主配置文件(通常是 /etc/nginx/nginx.conf)中,使用 include 指令来包含这些单独的配置文件。例如:

    http {
    include /etc/nginx/conf.d/*.conf;
    }

    这样,Nginx 在启动或重新加载配置时会读取并应用这些单独的配置文件。

  4. 配置单独的反向代理服务: 在每个单独的配置文件中,配置相应的反向代理服务。例如,service1.conf 可能包含以下内容:

    server {
    listen 80;
    server_name service1.example.com;

    location / {
    proxy_pass http://backend1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
    }

    service2.conf 可能包含以下内容:

    server {
    listen 80;
    server_name service2.example.com;

    location / {
    proxy_pass http://backend2;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
    }
  5. 测试和重新加载配置: 在修改配置文件后,使用以下命令测试配置文件的语法是否正确:

    sudo nginx -t

    如果测试通过,使用以下命令重新加载 Nginx 配置:

    sudo systemctl reload nginx

通过这种方式,你可以为每个反向代理的服务单独配置一个 nginx.conf 配置文件,从而实现配置的模块化和易于管理。

亲自测试(自己nginx配置)

这里我贴一下自己ecs里的nginx配置:

以下nginx.conf配置是生产力可用的配置,亲测有效!2024年8月4日

自己ecs已安装好nginx服务:

nginx.conf配置文件:

cat /etc/nginx/nginx.conf

user root;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
worker_connections 1024;
}

http {
gzip on; # 启用 gzip 压缩
gzip_vary on; # 根据请求中的 `Accept-Encoding` 响应头决定是否启用 gzip
gzip_proxied any; # 在所有代理请求中启用压缩
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 指定哪些类型的响应需要压缩
gzip_comp_level 5; # 压缩等级(范围是 1-9,高级别意味着更好的压缩但会消耗更多 CPU 资源)
gzip_min_length 256; # 只对超过给定长度的响应启用压缩
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;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;

include /etc/nginx/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;
charset utf-8;

# Settings for a TLS enabled server.

}

ssl证书位置:

[root@docusaurus-wiki cert]#pwd
/etc/nginx/cert
[root@docusaurus-wiki cert]#ll
total 8
-rw-rw-rw- 1 root root 2855 Aug 3 10:00 fullchain1.pem
-rw-rw-rw- 1 root root 241 Aug 3 10:00 privkey1.pem
[root@docusaurus-wiki cert]#

conf.d目录下:

[root@docusaurus-wiki conf.d]#pwd
/etc/nginx/conf.d
[root@docusaurus-wiki conf.d]#ll
total 28
-rw-r--r-- 1 root root 5252 Aug 3 14:57 blog.conf
-rw-r--r-- 1 root root 2498 Aug 3 14:15 home.conf
-rw-r--r-- 1 root root 1749 Aug 3 10:27 moments.conf
-rw-r--r-- 1 root root 1370 Aug 3 10:26 music.conf
-rw-r--r-- 1 root root 1745 Aug 3 10:23 photo.conf
-rw-r--r-- 1 root root 1404 Aug 3 09:11 wiki.conf
[root@docusaurus-wiki conf.d]#

主域名配置文件:

[root@docusaurus-wiki conf.d]#cat home.conf 
server {
listen 80;
server_name onedayxyy.cn www.onedayxyy.cn;

#配置https重定向
return 301 https://$host$request_uri;
}


server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name onedayxyy.cn www.onedayxyy.cn;

root /root/home3.0;

location / {
index index.html index.htm;
}

# ……删除部分敏感信息
ssl_certificate "cert/fullchain1.pem";
ssl_certificate_key "cert/privkey1.pem";

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
#ssl_ciphers HIGH:!aNULL:!MD5;
#自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
#TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

ssl_prefer_server_ciphers on;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

wiki配置文件:

[root@docusaurus-wiki conf.d]#cat wiki.conf 
server {
listen 80;
server_name wiki.onedayxyy.cn;
#配置https重定向
return 301 https://$host$request_uri;
}


server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name wiki.onedayxyy.cn;

root /root/rsync/rsync-docusaurus/build;

location / {
index index.html index.htm;
}

ssl_certificate "cert/fullchain1.pem";
ssl_certificate_key "cert/privkey1.pem";

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
#ssl_ciphers HIGH:!aNULL:!MD5;
#自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
#TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

ssl_prefer_server_ciphers on;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

相册配置文件:

[root@docusaurus-wiki conf.d]#cat photo.conf 
server {
listen 80;
server_name photo.onedayxyy.cn;

#配置https重定向
return 301 https://$host$request_uri;
}


server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name photo.onedayxyy.cn;

#root /root/home3.0;

#location / {
# index index.html index.htm;
#}


location / {
proxy_pass http://47.100.215.163:8082/; # 实际的后台路径
client_max_body_size 100M;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

ssl_certificate "cert/fullchain1.pem";
ssl_certificate_key "cert/privkey1.pem";

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
#ssl_ciphers HIGH:!aNULL:!MD5;
#自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
#TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

ssl_prefer_server_ciphers on;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

案例:nginx配置文件拆分-https-子域名(反向代理)-cdn配置汇总-2024.8.10(已解决)

nginx配置

自己ecs已安装好nginx服务:

nginx.conf配置文件:

cat /etc/nginx/nginx.conf

user root;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
worker_connections 1024;
}

http {
gzip on; # 启用 gzip 压缩
gzip_vary on; # 根据请求中的 `Accept-Encoding` 响应头决定是否启用 gzip
gzip_proxied any; # 在所有代理请求中启用压缩
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; # 指定哪些类型的响应需要压缩
gzip_comp_level 5; # 压缩等级(范围是 1-9,高级别意味着更好的压缩但会消耗更多 CPU 资源)
gzip_min_length 256; # 只对超过给定长度的响应启用压缩
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;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;

include /etc/nginx/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;
charset utf-8;

# Settings for a TLS enabled server.

}

ssl证书位置:

[root@docusaurus-wiki cert]#pwd
/etc/nginx/cert
[root@docusaurus-wiki cert]#ll
total 8
-rw-rw-rw- 1 root root 2855 Aug 3 10:00 fullchain1.pem
-rw-rw-rw- 1 root root 241 Aug 3 10:00 privkey1.pem
[root@docusaurus-wiki cert]#

conf.d目录下:

[root@docusaurus-wiki conf.d]#pwd
/etc/nginx/conf.d
[root@docusaurus-wiki conf.d]#ll
total 28
-rw-r--r-- 1 root root 5252 Aug 3 14:57 blog.conf
-rw-r--r-- 1 root root 2498 Aug 3 14:15 home.conf
-rw-r--r-- 1 root root 1749 Aug 3 10:27 moments.conf
-rw-r--r-- 1 root root 1370 Aug 3 10:26 music.conf
-rw-r--r-- 1 root root 1745 Aug 3 10:23 photo.conf
-rw-r--r-- 1 root root 1404 Aug 3 09:11 wiki.conf
[root@docusaurus-wiki conf.d]#

主域名配置文件:

[root@docusaurus-wiki conf.d]#cat home.conf 
server {
listen 80;
server_name onedayxyy.cn www.onedayxyy.cn;

#配置https重定向
return 301 https://$host$request_uri;
}


server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name onedayxyy.cn www.onedayxyy.cn;

root /root/home3.0;

location / {
index index.html index.htm;
}

# ……删除部分敏感信息
ssl_certificate "cert/fullchain1.pem";
ssl_certificate_key "cert/privkey1.pem";

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
#ssl_ciphers HIGH:!aNULL:!MD5;
#自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
#TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

ssl_prefer_server_ciphers on;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

wiki配置文件:

[root@docusaurus-wiki conf.d]#cat wiki.conf 
server {
listen 80;
server_name wiki.onedayxyy.cn;
#配置https重定向
return 301 https://$host$request_uri;
}


server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name wiki.onedayxyy.cn;

root /root/rsync/rsync-docusaurus/build;

location / {
index index.html index.htm;
}

ssl_certificate "cert/fullchain1.pem";
ssl_certificate_key "cert/privkey1.pem";

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
#ssl_ciphers HIGH:!aNULL:!MD5;
#自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
#TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

ssl_prefer_server_ciphers on;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

相册配置文件:

[root@docusaurus-wiki conf.d]#cat photo.conf 
server {
listen 80;
server_name photo.onedayxyy.cn;

#配置https重定向
return 301 https://$host$request_uri;
}


server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name photo.onedayxyy.cn;

#root /root/home3.0;

#location / {
# index index.html index.htm;
#}


location / {
proxy_pass http://47.100.215.163:8082/; # 实际的后台路径
client_max_body_size 100M;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

ssl_certificate "cert/fullchain1.pem";
ssl_certificate_key "cert/privkey1.pem";

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
#ssl_ciphers HIGH:!aNULL:!MD5;
#自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
#TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;

ssl_prefer_server_ciphers on;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

cdn配置

image-20240810073258613

image-20240810073323712

image-20240810073352183

image-20240810073404806

dns配置

image-20240804093218325

对应我当前的信息如下:

主域名:
起始页:onedayxyy.cn

子域名:
知识库:wiki.onedayxyy.cn
博客:blog.onedayxyy.cn
博客后台:blogadmin.onedayxyy.cn
博客存储:minio.onedayxyy.cn
相册:photo.onedayxyy.cn
音乐:music.onedayxyy.cn
说说:moments.onedayxyy.cn

效果

起始页:

https://onedayxyy.cn/

image-20240804094001561

知识库:

https://wiki.onedayxyy.cn/

image-20240804094027266

博客:

https://blog.onedayxyy.cn/

image-20240804094049959

相册:

https://photo.onedayxyy.cn/

image-20240804094127219

音乐:

https://music.onedayxyy.cn/

image-20240804094148521

说说:

https://moments.onedayxyy.cn/

image-20240804094220242

nginx日志

nginx统计自己网站当天有多少ip访问?

要统计 Nginx 服务器上当天有多少个独立 IP 访问你的网站,你可以使用日志文件和一些命令行工具。以下是一般步骤:

1、查看 Nginx 访问日志

Nginx 访问日志文件通常在 /var/log/nginx/access.log 或类似的位置。你可以使用以下命令查看日志文件: cat /var/log/nginx/access.log

[root@hexo-blog ~]# cat /var/log/nginx/access.log |wc -l
6048


45.9.149.142 - - [05/Dec/2023:03:12:38 +0800] "GET /doc/page/login.asp HTTP/1.1" 302 145 "-" "Googlebot-News" "-"
52.167.144.218 - - [05/Dec/2023:03:13:32 +0800] "GET /docs/%E5%85%B3%E4%BA%8E%E6%9C%AC%E7%AB%99/0%E3%80%81%E5%85%B3%E4%BA%8E%E7%BD%91%E7%AB%99 HTTP/2.0" 404
10845 "-" "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) Chrome/116.0.1938.76 Safari/537.36"
"-"
66.249.79.232 - - [05/Dec/2023:03:15:05 +0800] "GET /medias/social/hg-wecaht.png HTTP/1.1" 404 10845 "-" "Googlebot-Image/1.0" "-"
20.26.80.129 - - [05/Dec/2023:03:15:27 +0800] "GET /docs/%E5%85%B3%E4%BA%8E%E6%9C%AC%E7%AB%99/0%E3%80%81%E5%85%B3%E4%BA%8E%E7%BD%91%E7%AB%99 HTTP/1.1" 404 10
845 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36 Edge/96.0.1054.34" "-"
40.77.167.17 - - [05/Dec/2023:03:24:07 +0800] "GET /blog/ HTTP/1.1" 302 145 "-" "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; bingbot/2.0;
+http://www.bing.com/bingbot.htm) Chrome/116.0.1938.76 Safari/537.36" "-"
40.77.167.17 - - [05/Dec/2023:03:24:08 +0800] "GET /blog/ HTTP/2.0" 404 10845 "-" "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; bingbot/2.0
; +http://www.bing.com/bingbot.htm) Chrome/116.0.1938.76 Safari/537.36" "-"
71.6.232.26 - - [05/Dec/2023:03:36:55 +0800] "GET / HTTP/1.1" 200 76637 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/74.0.3729.131 Safari/537.36" "-"
52.167.144.138 - - [05/Dec/2023:03:39:42 +0800] "GET /docs/%E5%85%B4%E8%B6%A3%E7%88%B1%E5%A5%BD/3%E3%80%81%E5%BD%B1%E8%A7%86/%E5%BD%B1%E8%A7%86 HTTP/2.0" 404
10845 "-" "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) Chrome/116.0.1938.76 Safari/537.36"
"-"
81.29.135.16 - - [05/Dec/2023:03:41:43 +0800] "GET / HTTP/1.1" 302 145 "-" "Mozilla/5.0 zgrab/0.x" "-"

2、过滤并统计当天的访问

使用 grep 和 awk 命令来过滤并统计当天的访问。假设你的日志文件中的时间戳格式是 [dd/mm/yyyy:HH:MM:SS +0000],你可以使用以下命令:

grep "$(date +'%d/%b/%Y')" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr

这个命令的作用是: 5.使用 grep 过滤出包含当天日期的日志行。 6.使用 awk 提取出 IP 地址列。 7.使用 sort 对 IP 地址进行排序。 8.使用 uniq -c 统计每个 IP 的访问次数。 9.使用 sort -nr 对访问次数进行逆序排序。 如果你的日志时间戳格式不同,需要相应地调整命令。

  • 测试过程:
[root@docusaurus-wiki ~]# grep "$(date +'%d/%b/%Y')" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr
650 47.97.48.237
375 114.84.18.202
284 36.113.64.56
4 180.163.29.217
4 180.163.28.114
4 167.94.146.60
……
1 113.140.24.74
[root@docusaurus-wiki ~]#

3、只显示 IP 地址而不显示访问次数

如果你希望只显示 IP 地址而不显示访问次数,你可以使用以下命令

 grep "$(date +'%d/%b/%Y')" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq
  • 测试过程
[root@docusaurus-wiki ~]#  grep "$(date +'%d/%b/%Y')" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq
101.90.46.49
101.90.49.18
111.18.40.116
……
80.82.78.133
[root@docusaurus-wiki ~]#

4、想要输出更简洁的结果

如果你想要输出更简洁的结果,你还可以使用 sed 删除 IP 地址前面的 0,如下所示:

grep "$(date +'%d/%b/%Y')" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq | sed 's/^0*//'

请注意,这些命令的效果可能因你的 Nginx 日志格式和时间戳格式而有所不同。你需要根据实际情况调整命令。

  • 测试过程:
[root@docusaurus-wiki ~]# grep "$(date +'%d/%b/%Y')" /var/log/nginx/access.log | awk '{print $1}' | sort | uniq | sed 's/^0*//'
101.90.46.49
101.90.49.18
111.18.40.116
113.140.24.74
113.56.181.3
114.84.18.202
116.179.32.164
116.179.32.241
116.179.32.41
……
80.82.78.133
[root@docusaurus-wiki ~]#

5、最终结果(已解决

  • 配置方法
[root@docusaurus-wiki ~]# cat monitor.sh 
#!/bin/bash
daily_visits=$(grep "$(date +'%d/%b/%Y')" /var/log/nginx/access.log | wc -l)
echo "截止 $(date +%F_%T),网站访问量次数:$daily_visits 次";echo -e
[root@docusaurus-wiki ~]#
  • 效果
[root@docusaurus-wiki ~]# sh monitor.sh 
截止 2023-12-20_16:14:06,网站访问量次数:4197 次

[root@docusaurus-wiki ~]#

日志切割脚本

  • 自动切割 Nginx 访问日志,以避免单个日志文件过大。可以使用 logrotate 工具,但你也可以创建一个简单的 Shell 脚本执行切割。
#!/bin/bash
mv /var/log/nginx/access.log /var/log/nginx/access_$(date +\%Y\%m\%d).log
nginx -s reload

备份 Nginx 配置文件

  • 定期备份 Nginx 配置文件,以防发生意外。
#!/bin/bash
cp /etc/nginx/nginx.conf /path/to/backup/nginx_$(date +\%Y\%m\%d).conf

查看当前连接数

  • 监控 Nginx 当前连接数。
#!/bin/bash
netstat -an | grep :80 | wc -l

自动更新 SSL 证书

  • 使用 Certbot 自动更新 Let's Encrypt SSL 证书。
#!/bin/bash
certbot renew --nginx

监控 Nginx 进程

  • 定期检查 Nginx 进程是否在运行,并在需要时启动。
#!/bin/bash
if ! pgrep -x "nginx" > /dev/null
then
service nginx start
fi

问题:NGINX被大量攻击流量打满的情况有什么应对措施和预防策略?

2023年12月13日记录

提出问题

gpt

NGINX被大量攻击流量打满的情况有什么应对措施和预防策略?

当面对大量攻击流量导致 NGINX 服务器过载的情况时,下面是一些应对措施和预防策略:

  1. 使用防火墙: 在服务器上配置防火墙,如 iptables,可以通过过滤和限制流量来减轻攻击负载。
  2. 限制连接数: 在 NGINX 配置中限制并发连接数,以防止超过服务器处理能力的连接。
  3. 应用负载均衡: 使用负载均衡器(如 NGINX 反向代理)将流量分散到多个后端服务器上,以分担服务器负载和防止单个服务器过载。
  4. 使用缓存和CDN: 使用缓存和内容分发网络(CDN)可以减轻服务器负载,提高响应速度,同时阻挡一些简单的攻击。
  5. 限制请求速率: 在 NGINX 配置中设置请求速率限制,以防止用户频繁发送请求,从而减轻压力和防范 DDoS 攻击。
  6. 启用限制模块: NGINX 提供一些模块(如 ngx_http_limit_conn_module 和 ngx_http_limit_req_module)可以帮助限制连接数和请求速率
  7. 使用CDN和WAF服务 将流量通过内容分发网络(CDN)和 Web 应用程序防火墙(WAF)服务引导,这样可以在流量到达服务器之前进行过滤和防护。
  8. 日志分析和监控: 使用日志分析工具和监控系统监视服务器流量和性能,以及检测异常流量模式和攻击。
  9. 紧急扩容: 在遭受大规模攻击时,可能需要及时扩展服务器资源,增加带宽或升级服务器配置以应对攻击流量。
  10. 及时更新和安全审查: 确保 NGINX 和相关组件的及时更新,修复已知漏洞,并进行安全审查以提高整体安全性。

以上措施都能帮助减轻大量攻击流量给 NGINX 服务器带来的负载和风险。每个场景的需求可能有所不同,建议根据自己的具体情况选择适用的策略,并结合网络安全最佳实践来保护 NGINX 服务器。

方法:买高防包

方法:lua脚本

  • 限制频率也容易误封

  • 黑名单加起来确实 不是很灵光

方法:CDN+WAF

  • 加钱,CDN+waf,抗住再说

  • +1

  • 案例

B站上有陶辉老师讲的 nginx+lua, openresty 做 waf,而且告诉你 xss,sql注入,csrf, 都可以学习一下,讲的非常好的。

@固定资产 https://www.bilibili.com/video/BV17h411f79U/?spm_id_from=333.999.0.0

  • 案例

我们自己测下来,openresty 大流量不行,最后用apisix了

方法:shell脚本

  • 案例

如果知道什么什么爬虫,他遵循robots.txt 也可以加上robots.txt去限制的。

  • 案例

结论

  • nginx 拦截比较麻烦

  • 案例

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码

x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号

《云原生架构师实战》

image-20230107215126971

个人主页:

https://onedayxyy.cn

image-20240602215559566

image-20240602215749897

知识库:

https://onedayxyy.cn/docusaurus/

image-20240602215648594

博客:

http://47.100.215.163:8090/

image-20240602215637124

image-20240602215720712

🍀 csdn

https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

image-20230107215149885

🍀 知乎

https://www.zhihu.com/people/foryouone

image-20230107215203185

最后

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!


0%