Nginx宝典

一.概念

1.什么是Nginx?

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、php等。但是不支持 java。Java 程序只能通过与 tomcat 配合完成。Nginx 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。
其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。

2.Nginx有什么作用?


正向代理:需要在客户端配置代理服务器进行指定网站访问

反向代理:暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
在这里插入图片描述

负载均衡:增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash。
在这里插入图片描述

动静分离:在我们的软件开发中,有些请求是需要后台处理的,有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件),这些不需要经过后台处理的文件称为静态文件。让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作。提高资源响应的速度。
在这里插入图片描述

启动Nginx:
cd /usr/local/nginx/sbin
./nginx



二.nginx常用命令

首先进入 nginx 目录中:cd /usr/local/nginx/sbin

1.查看nginx的版本号

./nginx -v
在这里插入图片描述

2.启动nginx

./nginx
在这里插入图片描述

3.关闭nginx

./nginx -s stop
在这里插入图片描述

4.重新加载nginx

./nginx -s reload
在这里插入图片描述



三.Nginx的配置文件

1.nginx配置文件的位置

cd /usr/local/nginx/conf/nginx.conf
在这里插入图片描述

2.目录结构

[root@localhost ~]# tree /usr/local/nginx
/usr/local/nginx
├── client_body_temp                 # POST 大文件暂存目录
├── 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                       # 临时目录

3.Nginx正则表达式

常见的Nginx正则表达式

^ :匹配输入字符串的起始位置
$ :匹配输入字符串的结束位置
* :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+ :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
? :匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}. :匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式
\ :将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$”
\d :匹配纯数字
{n} :重复 n 次
{n,} :重复 n 次或更多次
{n,m} :重复 n 到 m 次
[] :定义匹配的字符范围
[c] :匹配单个字符 c
[a-z] :匹配 a-z 小写字母的任意一个
[a-zA-Z0-9] :匹配所有大小写字母或数字
() :表达式的开始和结束位置
| :或运算符  //例(js|img|css)

location正则

^ :匹配输入字符串的起始位置
$ :匹配输入字符串的结束位置
* :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+ :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
? :匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}. :匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式
\ :将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$”
\d :匹配纯数字
{n} :重复 n 次
{n,} :重复 n 次或更多次
{n,m} :重复 n 到 m 次
[] :定义匹配的字符范围
[c] :匹配单个字符 c
[a-z] :匹配 a-z 小写字母的任意一个
[a-zA-Z0-9] :匹配所有大小写字母或数字
() :表达式的开始和结束位置
| :或运算符  //例(js|img|css)

4.配置文件中的内容

包含三部分内容

(1)全局块: 从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
比如 worker_processes 1;处理并发数的配置,worker_processes 值越大,可以支持的并发处理量也越多,但是
会受到硬件、软件等设备的制约

(2)events 块:events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。
比如 worker_connections 1024; 支持的最大连接数为 1024

(3)http 块:这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
还包含两部分:http 全局块,server 块


配置server_name
客户端通过域名访问服务器时会将域名与被解析的ip一同放在请求中。当请求到了nginx中时。nginx会先去匹配ip,如果listen中没有找到对应的ip,就会通过域名进行匹配,匹配成功以后,再匹配端口。当这三步完成,就会找到对应的server的location对应的资源。
主要用于配置基于名称的虚拟主机,server_name指令在接到请求后,将按照下面1,2,3,4的匹配顺序对server name进行匹配,只有有一项匹配以后就会停止搜索,所以我们在使用这个指令的时候一定要分清楚它的匹配顺序(类似于location指令)。

  • 准确的server_name匹配
server {
     listen       80;
     server_name  domain.com  www.domain.com;
     ...
}
  • 以*通配符的字符串:
server {
     listen       80;
     server_name  *.domain.com;     ...
}
  • 匹配正则表达式:
server {
     listen       80;
     server_name  ~^(?.+)\.domain\.com$;     ...
}

server_name指令一项很实用的功能便是可以在使用正则表达式的捕获功能,这样可以尽量精简配置文件,毕竟太长的配置文件日常维护也很不方便。下面是2个具体的应用:

  • 在一个server块中配置多个站点:
server
   {
     listen       80;
     server_name  ~^(www\.)?(.+)$;
     index index.php index.html;
     root  /data/wwwsite/$2;
   }

站点的主目录应该类似于这样的结构:

/data/wwwsite/domain.com
/data/wwwsite/nginx.org
/data/wwwsite/baidu.com
/data/wwwsite/google.com
  • 在一个server块中为一个站点配置多个二级域名

实际网站目录结构中我们通常会为站点的二级域名独立创建一个目录,同样我们可以使用正则的捕获来实现在一个server块中配置多个二级域名:
对于域名 “www.example.com”,“.com” 依然是顶级域名,“example” 是二级域名,“www” 是三级域名。

server
   {
     listen       80;
     server_name  ~^(.+)?\.domain\.com$;
     index index.html;
     if ($host = domain.com){
         rewrite ^ http://www.domain.com permanent;
     }
     root  /data/wwwsite/domain.com/$1/;
   }

站点的目录结构应该如下:

/data/wwwsite/domain.com/www/
/data/wwwsite/domain
.com/nginx/

这样访问www.domain.com时root目录为/data/wwwsite/domain.com/www/,nginx.domain.com时为/data/wwwsite/domain.com/nginx/,以此类推。

后面if语句的作用是将domain.com的方位重定向到www.domain.com,这样既解决了网站的主目录访问,又可以增加seo中对www.domain.com的域名权重。

nginx.conf:

user administrator administrators;  //配置用户或者组,默认为nobody
worker_processes auto; //允许生成的进程数,默认为1
pid  /var/run/nginx.pid; //指定nginx进程运行文件存放地址
error_log  /var/log/nginx/error.log warn; //制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg

include modules.conf.d/*.conf; //引入模块,将其他配置文件的内容包含到当前配置文件中。通过 include 指令,可以将一个大的配置文件拆分成多个小的文件,以便于管理和维护。

load_module "/etc/nginx/modules/ngx_http_xslt_filter_module.so";//加载一个动态模块; Nginx支持多种模块化扩展,常用模块有ngx_http_rewrite_module:提供了 URL 重写和重定向功能,可以通过自定义的规则将 URL 重写或重定向到其他 URL。ngx_http_ssl_module,ngx_http_proxy_module等

events {
    use epoll;  //事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections 102400; //最大连接数,默认为512
}




http {

 // main 格式用于访问日志记录 : 包含了客户端的 IP 地址、用户名、请求时间戳、请求方法和 URL、响应状态码、响应体大小、请求来源 URL、客户端 User-Agent 和反向代理 IP 等信息
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';
   
   // json 日志格式 : 日志格式与 main 格式基本相同,但使用了 JSON 格式来记录信息, 通常用于与 ELK等日志收集和分析工具配合使用,以便进行日志分析和可视化等工作。
   log_format  json  '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';
   
   //这个日志格式也使用 JSON 格式来记录信息,但包含了更多的字段,比如请求的 URI、请求体、服务器名称等信息。这个日志格式通常用于记录详细的访问日志,以便进行排错和故障排查等工作。
   log_format json-bk escape=json '{"@timestamp":"$time_iso8601",'
                      '"@source":"$server_addr",'
                      '"@nginx_fields":{'
                      '"remote_addr":"$remote_addr",'
                      '"remote_user":"$remote_user",'
                      '"body_bytes_sent":"$body_bytes_sent",'
                      '"request_time":"$request_time",'
                      '"status":"$status",'
                      '"host":"$host",'
                      '"uri":"$uri",'
                      '"server":"$server_name",'
                      '"port":"$server_port",'
                      '"protocol":"$server_protocol",'
                      '"request_uri":"$request_uri",'
                      '"request_body":"$request_body",'
                      '"request_method":"$request_method",'
                      '"http_referrer":"$http_referer",'
                      '"body_bytes_sent":"$body_bytes_sent",'
                      '"http_x_forwarded_for":"$http_x_forwarded_for",'
                      '"http_user_agent":"$http_user_agent",'
                      '"upstream_response_time":"$upstream_response_time",'
                      '"upstream_addr":"$upstream_addr"}}';

    access_log  /var/log/nginx/access.log  main; //日志格式的默认值,以及存放位置
    error_log   /var/log/nginx/error.log; //指定错误日志的记录位置和格式

   //允许请求头中包含下划线字符    控制是否允许 HTTP 请求头中包含下划线(_)字符。默认情况下,Nginx 不允许请求头中包含下划线字符,如果请求头中包含下划线字符,则 Nginx 会将其替换为破折号(-)字符。
    underscores_in_headers on;   

    client_max_body_size 300m;  //客户端请求体的最大大小。Nginx 默认情况下只允许客户端请求体最大为 1MB,如果超过了这个大小,Nginx 会返回 413 请求实体过大错误
    client_body_buffer_size 128k; //设置客户端请求体缓冲区大小。Nginx 将客户端请求体缓存在内存中,如果请求体过大,可能会导致内存不足。
    client_header_buffer_size 64k; //设置客户端请求头缓冲区大小。Nginx 将客户端请求头缓存在内存中,如果请求头过大,可能会导致内存不足。
    large_client_header_buffers 4 128k; //设置客户端请求头缓冲区的数量和大小。如果客户端请求头过长,会被分成多个缓冲块存储。通过设置 large_client_header_buffers 可以指定缓冲块的数量和大小。例如,large_client_header_buffers 4 128k; 表示使用 4 个缓冲块,每个缓冲块大小为 128KB。

    server_names_hash_max_size 1024; //设置服务器名哈希表的最大大小。Nginx 将服务器名存储在哈希表中,通过哈希表可以实现快速查找。通过设置 server_names_hash_max_size 可以增加哈希表的大小。
    server_names_hash_bucket_size 128; //设置服务器名哈希桶的大小。Nginx 将服务器名存储在哈希表中的桶中,通过哈希桶可以实现快速查找。通过设置 server_names_hash_bucket_size 可以增加哈希桶的大小。

   more_set_headers 'X-Frame-Options: SAMEORIGIN'; //用于添加或修改HTTP响应头   例如,more_set_headers 'X-Frame-Options: SAMEORIGIN'; 表示添加或修改 X-Frame-Options 响应头,值为 SAMEORIGIN。
   //X-Frame-Options 是一个 HTTP 响应头,用于控制网页是否可以在 iframe 中加载。它的取值可以是以下三种:1. DENY:表示该页面不允许在任何 iframe 中显示。 2. SAMEORIGIN:表示该页面可以在同源域名下的 iframe 中显示。 3. ALLOW-FROM uri:表示该页面可以在指定的 URI 指定的 iframe 中显示。但该选项已经不被现代浏览器支持。
	
   more_clear_headers 'Access-Control-Allow-Origin'; //用于清除指定的HTTP响应头   
   //Access-Control-Allow-Origin 是一个 CORS(跨域资源共享)相关的响应头,用于控制哪些来源可以访问资源。如果服务器端不希望对某个资源开放跨域访问,可以使用 more_clear_headers 指令清除 Access-Control-Allow-Origin 响应头,从而禁止跨域访问。
  //需要注意的是,如果服务器端希望对某个资源开放跨域访问,清除 Access-Control-Allow-Origin 响应头是不合适的。在这种情况下,应该设置 Access-Control-Allow-Origin 响应头为允许访问的来源。

  proxy_hide_header X-Powered-By; //用于隐藏 HTTP 响应头中指定的头信息 
  //X-Powered-By 是一个常见的 HTTP 响应头,用于标识服务器使用的技术平台或框架。这个信息可能会被攻击者利用,帮助他们发现服务器的漏洞,因此隐藏 X-Powered-By 响应头可以提高服务器的安全性。

  server_tokens  off; //控制是否在 HTTP 响应头中显示 Nginx 版本信息
  sendfile  on; //是否启用sendfile 系统调用,该调用可以在服务器和客户端之间直接传输文件,而无需将文件内容从磁盘读取到用户空间,从而提高文件传输的效率。用户请求的数据不用再加载到nginx的内存中,而是直接发送
  tcp_nopush  on; //当一个响应比较小的时候,Nginx 可以尝试将整个响应一次性发送给客户端,从而减少发送数据的次数,提高网络传输效率。该指令启用了 TCP_NOPUSH 套接字选项,使得 Nginx 可以通过在发送端口缓冲区中积累足够的数据后再发送数据,从而提高传输效率。
  tcp_nodelay  on; //禁用 Nagle 算法,该算法会将多个小数据包合并成一个大的数据包再发送,从而提高网络传输效率,但是会增加延迟。禁用 Nagle 算法可以减少延迟,提高传输效率。
  keepalive_timeout   65; //指定 HTTP keep-alive 连接的超时时间。如果客户端通过 keep-alive 连接请求多个资源,那么在一段时间内保持该连接是有利于提高性能和减少网络开销的。该指令指定了 keep-alive 连接的超时时间为 65 秒。
  types_hash_max_size 2048; //用于指定 Mime-Type 映射表的最大大小,可以加快 Mime-Type 查找速度。将该值设置得越大,可以支持越多的 Mime-Type,但是也会占用更多的内存。

  limit_req_zone $binary_remote_addr zone=allips:1024m rate=500r/m;  //定义一个限制请求速率的区域,并指定该区域的限制规则
 //key 是指定限制规则的键名,通常使用 $binary_remote_addr,表示客户端的 IP 地址。name 是限制区域的名称,可以是任意字符串。size 是限制区域的大小,以字节为单位。rate 是请求速率限制,以每秒请求数(r/s)或每分钟请求数(r/m)为单位。

  default_type        application/json; //用于设置默认的MIME类型   mime-type是默认的MIME类型,例如,default_type application/json; 表示将默认的MIME类型设置为application/json。
  ssl_session_timeout 10m;  //用于设置 SSL/TLS 会话的超时时间  
  //SSL/TLS 会话是在客户端和服务器之间建立的安全连接,用于加密数据传输和验证身份。SSL/TLS 会话通常包含一组加密密钥和证书,用于保护数据的隐私和完整性。为了减少服务器负担和提高安全性,SSL/TLS 会话通常具有一定的超时时间,在超时之后会自动关闭。
  //通过设置 ssl_session_timeout 指令,可以控制 SSL/TLS 会话的超时时间。如果 SSL/TLS 会话的超时时间过短,将会频繁地重新建立 SSL/TLS 会话,增加服务器负担;如果 SSL/TLS 会话的超时时间过长,将会增加安全风险和资源占用


    //引入其他配置文件
    include fastcgi.conf;  //用于设置 FastCGI 参数,将请求的相关信息传递给 FastCGI 后端处理程序。这些参数在 FastCGI 环境中可以被后端程序使用。
 【// fastcgi.conf文件内容
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;
fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;
    】



    include proxy_pass.conf;  //用于配置反向代理服务器的代理设置
【
#作为反向代理时可以使用
proxy_intercept_errors on;
proxy_connect_timeout 600;              #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 600;                         #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 600;                         #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 256k;                         #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 256 256k;                         #proxy_buffers缓冲区,网页平均在32k以下的设置
proxy_busy_buffers_size 256k;           #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 256k;                #设定缓存文件夹大小,大于这个值,将从upstream服务器传
】


    include proxy_cache.conf;  //用于配置反向代理服务器的缓存设置
【
proxy_temp_path /tmp/nginx_proxy_temp;   ##用于配置反向代理服务器的临时文件路径,它指定了Nginx在处理请求时使用的临时文件路径。这些临时文件通常用于存储请求正文、响应正文和请求头等信息
proxy_cache_path  /tmp/nginx_proxy_cache levels=1:2 keys_zone=proxy_cache:32m inactive=1d max_size=200m;  ##配置反向代理服务器的缓存路径,它指定了Nginx在处理请求时使用的缓存路径。这些缓存文件通常用于存储后端服务器的响应结果,以便在后续请求中直接使用而无需再次向后端服务器发出请求。
//levels参数将缓存文件分成两级子目录以提高性能,keys_zone参数指定了一个名为proxy_cache的共享内存区域,用于存储缓存键和元数据信息,inactive参数定义了缓存项在多长时间内没有被访问后被认为是过期的,max_size参数指定了缓存的最大大小。
】

    include file_cache.conf; //用于提供文件缓存功能
【
open_file_cache max=65536 inactive=20s;  ##用于配置Nginx的文件缓存。它指定了Nginx在打开文件时使用的缓存大小、缓存项的过期时间和缓存区的名称。max参数指定了缓存中最多可以存储的文件描述符数量,inactive参数定义了缓存项在多长时间内没有被使用后被认为是过期的。
open_file_cache_min_uses 1; ## 用于配置缓存项的最小使用次数。如果一个缓存项的使用次数不足open_file_cache_min_uses次,那么这个缓存项将不会被缓存,直接从磁盘中读取。1表示每个缓存项至少被使用一次才会被缓存。
open_file_cache_valid 10s; ##配置缓存项的有效时间。如果一个缓存项在open_file_cache_valid时间内没有被使用,那么这个缓存项将被认为是过期的。在上面的例子中,10s表示缓存项的有效时间为10秒。
】
   

   include common-block-ip.conf; //屏蔽指定的IP地址。
【
deny 170.192.35.23; ##可以在Nginx配置文件的任何位置使用deny指令。如果在http块中使用它,则会应用于整个服务器。如果在server块或location块中使用它,则仅应用于特定的虚拟主机或URL。
deny 315.194.33.22;
】
    include /etc/nginx/conf.d/*.conf;  //包含多个配置文件,每个配置文件代表一个域名
【
baidu.cn.conf
sise.com等
每个文件具体内容在下面
】


  ssl_session_cache off;  //用于关闭 SSL/TLS 会话缓存,可以避免因 SSL/TLS 会话缓存导致的安全问题。但是关闭 SSL/TLS 会话缓存会增加 SSL/TLS 握手的开销,因此在高并发场景下可能会影响性能,需要根据实际情况进行权衡
  ssl_protocols TLSv1.1 TLSv1.2;  //用于指定允许使用的 SSL/TLS 协议版本,这里指定了只允许使用 TLSv1.1 和 TLSv1.2
  ssl_ciphers GGFN-SFSFSFSFS128-GCM-SSFSF45:VXVSE-RSA-AES128-GCF-S55556:E   //用于指定允许使用的 SSL/TLS 加密套件,这里指定了一组安全性较高的加密套件。具体来说,这里指定了使用 ECDHE(基于椭圆曲线的密钥交换算法)和 AES-GCM(高级加密标准,用于数据加密)算法等来保护 SSL/TLS 连接。
  ssl_prefer_server_ciphers on;  //用于指定使用服务器端优先的加密套件。当客户端发送支持的加密套件列表时,服务器将选择其中最安全的加密套件,以保证加密连接的安全性。
  ssl_session_tickets off;  //用于关闭 SSL/TLS 会话票据机制。会话票据机制可以在客户端和服务器之间传输 SSL/TLS 会话数据,以避免重新建立 SSL/TLS 会话所需的握手开销。但是会话票据机制也会增加 SSL/TLS 握手的复杂性和安全风险,因此在一些安全性要求较高的场景下,可能需要关闭会话票据机制。

  //通过这个 upstream 块,Nginx 可以根据一定的负载均衡策略,将location请求分配到这三个后端服务器上
  upstream proxy-activity{
        keepalive 1024; //用于设置与后端服务器之间的连接池大小。具体来说,这里的 keepalive 1024 表示 Nginx 会维护一个最大为 1024 个连接的连接池,以减少与后端服务器的握手开销,提高性能。
        server 120.106.0.09:7979; //
        server 120.106.0.10:7979; //
    }

    upstream proxy-product{
        server 120.18.0.59:8112;
    }

  
        map $http_origin $allow_origin {
    default "";
    "~^(https?://.*.sisegroup.cn(:[0-9]+)?)" $1;
    "~^(https?://.*.sise.cn(:[0-9]+)?)" $1;
    "~^(https?://app.gov.sise.cn(:[0-9]+)?)" $1;
    "~^(https?://.*.sise.cn(:[0-9]+)?)" $1;
    "~^(https?://.*.sise.com(:[0-9]+)?)" $1;
    "~^(https?://datav.aliyuncs.com(:[0-9]+)?)" $1;
    "~^(https?://scplugins.oss-sise.aliyuncs.com(:[0-9]+)?)" $1;
    "~^(https?://*.oss-cn-shenzhen.aliyuncs.com(:[0-9]+)?)" $1;
    #"~^(https?://([\w]+.)?[\w]+.sise.cn)" $1;  #允许一级和二级域名
    "~^(http://101.21.292.47:27338)" $1;
    }
  // map 指令,用于根据客户端请求中的 Origin 头部信息,将合法的跨域来源设置到 $allow_origin 变量中。具体来说,这个 map 指令会将 $http_origin 变量的值作为 map 指令的输入,然后根据一系列的正则表达式进行匹配,将匹配到的值设置到 $allow_origin 变量中。
 //在这个 map 指令中,正则表达式用于匹配各种合法的跨域来源,包括一些域名、IP 地址和阿里云的一些服务地址等。这些合法的跨域来源将会被设置到 $allow_origin 变量中,用于设置 Access-Control-Allow-Origin 头部信息,以允许客户端进行跨域访问。

   
   server {
        location ~ ^/hello {
                default_type application/json;
                return 200 '{"status":"success","result":"nginx json"}';
        }
    }




    stream {
    log_format proxy '$remote_addr - [$time_local] '
                 '$protocol $status $bytes_sent $bytes_received '
                 '$session_time "$upstream_addr" '
                 '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time" '
                 '$remote_addr $remote_port $server_addr $server_port';
    

    include tcp/*.conf;
//其中一个文件
【
# 1078 video history
upstream jt1078_video_history_tcp{
    hash $remote_addr consistent;  //hash算法将请求的remote_addr哈希到一个服务器上,consistent参数表示使用一致性哈希算法,这样可以确保在添加或删除服务器时,尽可能少地重新分配请求。
    server 211.82.1.24:2234;
}

server{
    #长连接保持 
    listen 2234 so_keepalive=on;
    access_log /var/log/nginx/stream/jt1078_video_history.tcp-access.log proxy;
    error_log /var/log/nginx/stream/jt1078_video_history.tcp-error.log;
    proxy_pass jt1078_video_history_tcp;
}#将java连接tcp转发
    server {
        listen 1244;
        proxy_pass 192.168.1.128:1244;
    }
  //stream 块,用于配置 TCP 或 UDP 协议的代理服务
//这个 stream 块中包含一个 log_format 指令,用于定义 TCP 或 UDP 代理服务的日志格式。然后使用 include 指令引入一个目录中的所有配置文件,这些配置文件用于定义不同的 TCP 或 UDP 代理服务。
//最后,这个 stream 块中还定义了一个 TCP 代理服务,用于将来自客户端的 TCP 连接请求转发到一个后端服务器上。使用 listen 指令指定监听的端口号,使用 proxy_pass 指令将客户端的连接请求转发到一个后端服务器上

}



}


域名配置

server {   //该server块 用于处理 HTTP(端口 80)请求
    listen       80;
    include /etc/nginx/common-location.conf; //重定向配置文件
【
location ~ /service-file/file/index {
        return 404;
}
location ~ /wechat/wxuserinfo/index {
        return 404;
}

location ~ /service-sms {
        return 404;
}
】


    include /etc/nginx/common-resp-header.conf;
【
add_header Strict-Transport-Security "max-age=3030220; includeSubDomains; preload";     //这条指令添加了Strict-Transport-Security(STS)头。它告诉浏览器使用HTTPS与服务器建立安全连接,并在未来一年内都使用HTTPS。includeSubDomains指令告诉浏览器将STS应用于所有子域名。preload指令指示浏览器将网站添加到预加载列表中,以进一步增强安全性。
add_header X-Content-Type-Options nosniff;  //这条指令添加了X-Content-Type-Options头,设置为nosniff。它告诉浏览器在解析响应内容类型时不要执行嗅探(sniffing),从而防止浏览器对响应的内容类型进行猜测,减少潜在的安全风险。
add_header Access-Control-Allow-Origin $allow_origin;  //这条指令设置了Access-Control-Allow-Origin头,允许来自$allow_origin变量值的跨域请求访问资源。这个变量可以是特定的域名,也可以是通配符*,表示允许所有域名的请求访问资源。
add_header Set-Cookie "httponly; secure; SameSite=Strict";  //这条指令设置了Set-Cookie头,指定了一些安全选项。httponly选项告诉浏览器不允许通过JavaScript访问该Cookie,以增加防御跨站脚本攻击(XSS)的能力。secure选项要求Cookie只能通过HTTPS传输,以保护传输过程中的数据安全。SameSite=Strict选项指示浏览器仅在请求与原始网站相同的情况下发送Cookie,以减少跨站请求伪造(CSRF)攻击的风险。
】


    include /etc/nginx/shencom-index-location.conf;  
【
location ~ ^/index.html$ {  //该配置片段定义了针对 /index.html 路径的请求的处理方式
    rewrite /(.*) /plugins/sise/web/$1 break;  //重写请求路径,将 /index.html 路径重写为 /plugins/sise/web/index.html。这意味着当访问 /index.html 时,实际会请求 /plugins/sise/web/index.html
    proxy_set_header referer "$scheme://$host/";  //设置代理请求的 Referer 头部为 $scheme://$host/。这将在代理请求中包含原始请求的来源信息。
    proxy_pass https://scplugins.oss-cn-shenzhen.aliyuncs.com;  //将请求代理到 https://scplugins.oss-cn-shenzhen.aliyuncs.com
}
】


    server_name baidu.sise.cn;  //指定了服务器名为 baidu.sise.cn,即该配置将应用于该域名的请求
    root        /data/htdocs/gov.sise.cn/8380/public/html/admin;   //指定网站的根目录,即该目录下的文件将作为网站的内容
    index       index.html;
    charset utf-8;
    access_log  /var/log/nginx/http/baidu.sise.cn.access.log  main;  //日志位置
    error_log   /var/log/nginx/http/baidu.sise.cn.error.log;

    return 301 https://$host$request_uri; //重定向 :使用 return 指令,将所有的 HTTP 请求重定向到相应的 HTTPS 地址。$host$request_uri 是 Nginx 内置的变量,用于获取客户端请求的主机和 URI
}

server {  //该server块 用于处理 HTTPS 请求(端口 443)请求
    listen 443 ssl; 
    server_name baidu.sise.cn;   //指定了服务器名为 csgj.shencom.cn,即该配置将应用于该域名的请求
    root    /data/htdocs/gov.sise.cn/public/html/admin;
    index  index.html;
    include /etc/nginx/common-location.conf;
    include /etc/nginx/common-resp-header.conf;
    include /etc/nginx/sise-index-location.conf;
    include /etc/nginx/file-rewrite-location.conf;
【
location ~ ^/x0/(.*?)/(.*) {  //用于匹配以 /x0/ 开头的路径,并捕获两个组:$1 表示第一个组,$2 表示第二个组。
   resolver 122.0.2.1;  //指定了一个DNS解析器的IP地址(122.0.2.1),用于解析变量$bucket中的域名。
   set $bucket $1;  //将第一个捕获的组(即$1)的值赋给变量$bucket
   set $object $2;
   proxy_pass https://$bucket.oss-cn-shenzhen.aliyuncs.com/$object$is_args$args;  //使用变量$bucket$object构建代理请求的URL,并将请求转发到对应的目标地址。
}
location /x1/ {  //直接匹配以 /x1/ 开头的路径
        proxy_pass http://proxy-x1-file/;
}
】

        ssl_certificate         ssl/sise.cn.com.pem;  //指定SSL证书的路径和文件名
        ssl_certificate_key     ssl/sise.cn.com.key.pem;  //指定SSL证书的私钥文件的路径和文件名。
        ssl_ciphers  HIGH:!aNULL:!MD5;  //定义支持的SSL密码套件。HIGH:!aNULL:!MD5 表示只允许使用高强度的密码套件,且不包括空密码套件和MD5算法
        ssl_prefer_server_ciphers  on;  //表示服务器将优先选择使用服务器端定义的密码套件,而不是客户端的优先顺序。

    charset utf-8;
    access_log  /var/log/nginx/http/tstpro.sise.cn.com.access.log  main;
    error_log   /var/log/nginx/http/tstpro.sise.cn.com.error.log;

    location / {
        include /etc/nginx/common-resp-header.conf;
        if ($request_method = OPTIONS) {  //如果请求方法是 OPTIONS,表示浏览器发送的预检请求(preflight request),则执行以下语句块中的逻辑。
            add_header Access-Control-Allow-Headers *;  //允许客户端发送的自定义请求头。
            add_header Access-Control-Allow-Origin *;  //允许所有来源的请求访问资源。
            add_header Access-Control-Allow-Methods *; //允许客户端发送的所有请求方法
            add_header Access-Control-Allow-Credentials true; //允许客户端发送凭据(如 Cookie、Authorization 等)
            return 200;
        }
        if ( $request_uri = "/" ) {  //重写根路径 / 为 https://$host/index.html,并终止后续的请求处理。
            rewrite "/" https://$host/index.html break;
        }

       try_files $uri $uri/ @proxypass;  //尝试根据请求的 URI 匹配静态文件或目录,如果匹配成功则直接返回文件内容,否则将请求转发到 @proxypass 命名的位置。
       client_max_body_size    1024m;  //设置客户端请求的最大请求体大小为 1024MB。
   }



   location /api/activity/ {
        rewrite /api/activity/(.*) /api/activity/$1 break;    //对请求路径进行重写,将 /api/activity/ 后面的部分捕获为 $1,然后重写为 /api/activity/$1。这里使用了正则表达式捕获,可以将请求路径中的动态部分保留,并在重写后的路径中使用。
        proxy_set_header Host actv.sise.cn;  //设置代理请求的目标主机为 actv.sise.cn。在发送代理请求时,会将目标主机的地址设置为该值。
        proxy_set_header X-Real-IP $remote_addr;  //设置代理请求的 X-Real-IP 请求头,将客户端的真实 IP 地址传递给后端服务。
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  //设置代理请求的 X-Forwarded-For 请求头,将客户端的IP地址和代理服务器的 IP 地址传递给后端服务。如果请求已经经过了一层代理,会将已有的 X-Forwarded-For 头追加上当前代理服务器的 IP 地址。
        proxy_set_header X-Forwarded-Proto $scheme;  //设置代理请求的 X-Forwarded-Proto 请求头,将客户端请求的协议(HTTP 或 HTTPS)传递给后端服务。
        proxy_pass http://192.10.3.105:80;  //将请求转发到指定的后端服务地址
   }

   location @proxy_activity {  //定义了一个名为 @proxy_activity 的位置标记,并配置了一系列指令来处理代理请求
        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;
        proxy_set_header upload-origin $scheme://$host;  //指定上传文件的原始协议和主机。
        #buffer
        proxy_buffering off;  //禁用代理缓冲,将代理请求的响应直接转发给客户端,而不进行缓冲。
        set $args "$args&sise-service=out";    //在请求的参数中添加一个名为 sise-service 的查询参数,值为 out。这样在代理请求时,会将这个查询参数添加到目标 URL 中。
        #设置代理
        proxy_pass http://proxy-sise-activity;  
   }


    location ~ ^/(rtsp\.html|demo\.css)$ {  //处理了以 /rtsp.html 或 /demo.css 开头的请求路径
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Real-Port $remote_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;  

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade; //设置代理请求的 Upgrade 请求头,用于升级到其他协议,例如 WebSocket。
        proxy_set_header Connection $connection_upgrade;  //设置代理请求的 Connection 请求头,用于指示与后端服务器的连接是否需要升级。
        #buffer
        #proxy_buffering off;
        #设置代理
        proxy_pass http://172.18.0.115:5080;
    }


   location ~ ^(?!(/x0/|/x1/)).*\.(png|jpg|gif|svg|css|js)$ {   //配置定义了一个正则表达式匹配的位置,用于处理以 .png、.jpg、.gif、.svg、.css 或 .js 结尾的路径,并且不以 /x0/ 或 /x1/ 开头的路径
        rewrite /(.*) https://oss.sise.cn/plugins/pro/web/$1 break;  //对匹配的路径进行重写,将路径重写为 https://oss.sise.cn/plugins/pro/web/ 加上原始路径的部分。这样通过浏览器访问这些资源时,将使用 https://oss.sise.cn 域名下的路径进行访问。
   }


   location /manage-system/cms/api/admin/index { //针对某一个接口直接返回200
        return 200;
   }

   error_page   500 502 503 504  /50x.html;   //定义了当发生 500/502/503或504 错误时,将请求重定向到 /50x.html 页面,  该页面内容从/usr/share/nginx/html 目录下获取
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}

四.Nginx 配置反向代理实例

1.虚拟主机原理

虚拟主机是为了在同一台物理机器上运行多个不同的网站,提高资源利用率引入的技术。

一般的web服务器一个ip地址的80端口只能正确对应一个网站。web服务器在不使用多个ip地址和端口的情况下,如果需要支持多个相对独立的网站就需要一种机制来分辨同一个ip地址上的不同网站的请求,这就出现了主机头绑定的方法。简单的说就是,将不同的网站空间对应不同的域名,以连接请求中的域名字段来分发和应答正确的对应空间的文件执行结果。举个例子来说,一台服务器ip地址为192.168.8.101,有两个域名和对应的空间在这台服务器上,使用的都是192.168.8.101的80端口来提供服务。如果只是简单的将两个域名A和B的域名记录解析到这个ip地址,那么web服务器在收到任何请求时反馈的都会是同一个网站的信息,这显然达不到要求。接下来我们使用主机头绑定域名A和B到他们对应的空间文件夹C和D。当含有域名A的web请求信息到达192.168.8.101时,web服务器将执行它对应的空间C中的首页文件,并返回给客户端,含有域名B的web请求信息同理,web服务器将执行它对应的空间D中的首页文件,并返回给客户端,所以在使用主机头绑定功能后就不能使用ip地址访问其上的任何网站了,因为请求信息中不存在域名信息,所以会出错。

2.URLRewrite

rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到repacement,结尾是flag标记。

在这里插入图片描述
作用:

  • 地址跳转: 用户访问old.com时,将其跳转到oldboy.com。
  • 协议跳转:将用户通过http的请求协议重新跳转至https协议(实现https主要手段)。
  • URL静态化: 将动态URL地址显示为静态URL的一种技术,能提高搜索引擎抓取,并且能减少动态URL对外暴露过多的参数

在这里插入图片描述

URLRewrite的优缺点

  • 优点:掩藏真实的url以及url中可能暴露的参数,以及隐藏web使用的编程语言,提高安全性便于搜索引擎收录
  • 缺点:降低效率,影响性能。如果项目是内网使用,比如公司内部软件,则没有必要配置。

EG:

  • 当访问以test开头后面是"/"任何东西的URI时,我们重写URI为,/yy/index.html
        location /test {
             rewrite ^/test/.*$ /yy/index.html break ;
        }
  • 当访问以bbs开头后面是"/"任何东西的URI时,重写URL为https://gitee.com/explore
location /bbs{
            rewrite ^/bbs/(.*)$ https://gitee.com/explore/bbs break;
        }
  • 要写两个location,因为第一个匹配到了之后就不会被同一个location下的其他rewrite所匹配到
		location /test {
             rewrite ^/test/.*$ /yy/index.html last ;
        }
        location /yy {
            rewrite ^/yy/.*$ http://www.baidu.com break;
        }

访问的是192.168.174.168/test/,自动跳转到了www.baidu.com页面。

3.防盗链

防盗链是一种常见的安全措施,用于限制资源只能被特定来源(合法的网站或域名)访问,防止资源被未授权的第三方盗用。在 Nginx 中,可以通过配置 valid_referers 指令来实现防盗链。

server {
    listen 80;
    server_name yourdomain.com;

    location /protected {
        # 设置防盗链规则,允许来自白名单的来源
        valid_referers none || blocked || yourdomain.com || ~\.google\. ~\.bing\.;

        # 配置防盗链返回的错误页面
        if ($invalid_referer) {
            return 403;
        }

        # 设置防盗链返回的错误页面(可选方式)
        # error_page 403 /403.html;

        # 其他处理逻辑
        # ...
    }

    # 其他配置
    # ...
}
#在上述配置中,我们假设要防盗链的资源在 /protected 目录下。valid_referers 指令用于指定允许访问资源的来源列表。在这个例子中,我们设置了 valid_referers 为 none blocked yourdomain.com,其中:
none:表示不允许任何来源访问资源。
blocked:表示允许来自黑名单的来源访问资源(Nginx 黑名单模块需要在编译时启用)。
yourdomain.com:表示允许来自 yourdomain.com 域名的请求访问资源。

为了模拟盗链,在这里让101为网站服务站点,102为网关服务器,103访问101进行盗链。

101Nginx配置:

worker_processes  1; #允许进程数量,建议设置为cpu核心数或者auto自动检测,注意Windows服务器上虽然可以启动多个processes,但是实际只会用其中一个

events {
    #单个进程最大连接数(最大连接数=连接数*进程数)
    #根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。
    worker_connections  1024;
}


http {
    #文件扩展名与文件类型映射表(是conf目录下的一个文件)
    include       mime.types;
    #默认文件类型,如果mime.types预先定义的类型没匹配上,默认使用二进制流的方式传输
    default_type  application/octet-stream;

    #sendfile指令指定nginx是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度。
    sendfile        on;
    
     #长连接超时时间,单位是秒
    keepalive_timeout  65;

#定义一组服务器
upstream httpds{
    server 192.168.8.102 weight=10;
    server 192.168.8.103 weight=1;
}

 #虚拟主机的配置
    server {
    #监听端口
        listen       80;
        #域名,可以有多个,用空格隔开
        server_name  test80.xzj520520.cn;

	#配置根目录以及默认页面
        location / {
            proxy_pass http://httpds;
            # root   /www/test80;
            # index  index.html index.htm;
        }

	#出错页面配置
        error_page   500 502 503 504  /50x.html;
        #/50x.html文件所在位置
        location = /50x.html {
            root   html;
        }
        
    }

}

102的nginx.cfg

worker_processes  1;



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 / {
            proxy_pass http://192.168.8.101:8080;
        }
        
        
        location ^~/images/ {
            root   /www/resources;
        }
       
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

}

103的nginx.cfg

worker_processes  1;



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 / {
            proxy_pass http://192.168.8.102;
        }
         
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

}

访问http://192.168.8.103/:通过访问103,转发到102,完成盗链
在这里插入图片描述
如果不想被盗链,可以对网关服务器102做如下配置:
102nginx.cfg:

worker_processes  1;



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 / {
            proxy_pass http://192.168.8.101:8080;
        }
        
        
        
        location ^~/images/ {
            valid_referers 192.168.8.102;  #valid_referers 指令,配置是否允许 referer 头部以及允许哪些 referer 访问。192.168.8.102不是ip而是域名(去掉http:// 前缀)
            if ($invalid_referer) {  # 注意这里if后要加空格
                return 403; ## 返回错误码
            }
            
            root   /www/resources;
        }
        

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

    }
}

在这里插入图片描述

4.反向代理

实际网站使用中,至少有三个匹配规则定义:

  • 直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。这里是直接转发给后端应用服务器了,也可以是一个静态首页
location = / {
    proxy_pass http://127.0.0.1:8080/; 
}
  • 处理静态文件请求,这是nginx作为http服务器的强项,有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
    root /webroot/static/;
}

location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}
  • 通用规则,用来转发动态请求到后端应用服务器
location /api/ {
    proxy_pass http://127.0.0.1:3000/api/
}

在这里插入图片描述

1.启动tomcat
cd apache-tomcat-7.0.70/bin
./startup.sh

2.在 windows 系统的 host 文件进行域名和 ip 对应关系的配置
在这里插入图片描述
在这里插入图片描述


实例1:打开浏览器,在浏览器地址栏输入地址 www.123.com,跳转到 liunx 系统 tomcat 主页面中

修改配置文件:访问192.168.253.130相当于访问http://127.0.0.1:8080
在这里插入图片描述
效果
在这里插入图片描述


实例2:使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中
nginx 监听端口为 9001
访问 http://192.168.253.130:9001/edu/ 直接跳转到 127.0.0.1:8080
访问 http://192.168.253.130:9001/vod/ 直接跳转到 127.0.0.1:8081

准备两个 tomcat 服务器,一个 8080 端口,一个 8081 端口并创建文件夹和测试页面

找到 nginx 配置文件,进行反向代理配置
在这里插入图片描述
效果
在这里插入图片描述
在这里插入图片描述


5.Keepalived和高可用

Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。所以,Keepalived 一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可实现系统网络服务的高可用功能。

keepalived服务的三个重要功能:

  • 管理LVS负载均衡软件
  • 实现LVS集群节点的健康检查中
  • 作为系统网络服务的高可用性(failover)

安装keepalived

yum install -y keepalived

keepalived的配置文件在如下位置:
在这里插入图片描述

在该实战中,101为主nginx,102为备用机,首先需要修改101和102的keepalived.conf配置

101的keepalived.conf配置

! Configuration File for keepalived

global_defs {
   router_id LB_102
}

vrrp_instance VI_102 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.8.200
    }
}

使用systemctl start keepalived启动keepalived,查看ip发现多了虚拟ip192.168.8.200:
在这里插入图片描述
interface ens33这里的ens33需要和以下位置对应:
在这里插入图片描述

102的keepalived.conf配置

! Configuration File for keepalived

global_defs {
   router_id LB_101
}

vrrp_instance VI_102 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.8.200
    }
}

使用systemctl start keepalived启动keepalived
在这里插入图片描述
访问 162.168.8.200:
在这里插入图片描述
关闭102,再次访问192.168.8.200:
在这里插入图片描述
由于图片资源存放在102上,通过192.168.8.200访问到的主机是102,所以背景是空白,没有访问到静态资源,keepalived配置成功。

6.SSL证书并配置https访问

购买完成后在如下位置创建证书并申请证书:
在这里插入图片描述
填写验证信息

在这里插入图片描述
在这里插入图片描述
证书签发后,选择下载:
在这里插入图片描述
在这里插入图片描述

接下来需要将这两个文件上传到nginx目录下的conf目录下:
在这里插入图片描述
nginx配置证书:

server {
	listen 443 ssl;
	server_name localhost;  # 接收所有访问443端口的请求
	ssl_certificate 7706851_www.xzj520520.cn.pem;
	ssl_certificate_key 7706851_www.xzj520520.cn.key;
}

配置完之后,重启nginx:
由于http协议默认的端口是80,而https默认的端口是443,如果想让http的访问跳转到https的访问,可以做如下配置:

server {
	listen 80;
	server_name www.xzj520520.cn xzj520520.cn; # 换成自己的域名
	...
	return 301 https://$server_name$request_uri;	
}

五.Nginx配置负载均衡实例

浏览器地址栏输入地址 http://192.168.17.129/edu/a.html,负载均衡效果,平均 分配8080和 8081 端口中

准备工作:准备两台 tomcat 服务器,一台 8080,一台 8081并在两台 tomcat 里面 webapps 目录中,创建名称是 edu 文件夹,在 edu 文件夹中创建页面 a.html

修改配置文件
在这里插入图片描述
效果
在这里插入图片描述
在这里插入图片描述


六.nginx 分配服务器策略

Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash。扩展策略,就天马行空,只有你想不到的没有他做不到的。

1.轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。

2.weight

weight 代表权重默认为 1,权重越高被分配的客户端越多
在这里插入图片描述

3.ip_hash

每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器
在这里插入图片描述

4.fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

在这里插入图片描述


七.Nginx配置动静分离实例

通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。
在这里插入图片描述

1.准备工作:
在 liunx 系统中准备静态资源,用于进行访问
在这里插入图片描述
2.在 nginx 配置文件中进行配置
在这里插入图片描述
3.效果
在这里插入图片描述
在这里插入图片描述



八.Nginx 配置高可用的集群

1、什么是 nginx 高可用

在这里插入图片描述

2.完成高可用配置(主从配置)

修改/etc/keepalived/keepalivec.conf 配置文件

global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.17.129
smtp_connect_timeout 30
router_id LVS_DEVEL
}

vrrp_script chk_http_port {
script “/usr/local/src/nginx_check.sh”
interval 2            #(检测脚本执行的间隔)
weight 2
}


vrrp_instance VI_1 {
state BACKUP             # 备份服务器上将 MASTER 改为 BACKUP
interface ens33            //网卡
virtual_router_id 51      # 主、备机的 virtual_router_id 必须相同
priority 90  # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.17.50      //VRRP H 虚拟地址
}
}


在/usr/local/src 添加检测脚本

在这里插入图片描述
把两台服务器上 nginx 和 keepalived 启动
启动 nginx:./nginx
启动 keepalived:systemctl start keepalived.service

3.效果

在浏览器地址栏输入 虚拟 ip 地址 192.168.17.50
在这里插入图片描述
在这里插入图片描述
把主服务器(192.168.17.129)nginx 和 keepalived 停止,再输入 192.168.17.50
在这里插入图片描述
在这里插入图片描述


九.Nginx 的原理

1、mater 和 worker

在这里插入图片描述
在这里插入图片描述

2、worker 如何进行工作的

在这里插入图片描述

3、一个 master 和多个 woker 有好处

(1)可以使用 nginx –s reload 热部署,利用 nginx 进行热部署操作
(2)每个 woker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker 独立的,继续进行争抢,实现请求过程,不会造成服务中断

4、设置多少个 woker 合适

worker 数和服务器的 cpu 数相等是最为适宜的

5、连接数 worker_connection

第一个:发送请求,占用了 woker 的几个连接数?
答案:2 或者 4 个

第二个:nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的最大并发数是多少?
             普通的静态访问最大并发数是: worker_connections * worker_processes /2,
             而如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections *worker_processes/4。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值