Nginx

# frps.board Nginx配置示例
server
{
    listen 80;
    server_name frps.com;
    index index.html index.htm default.htm default.html;
    root /www/wwwroot/frps-board;

   
    # HTTP反向代理相关配置开始 >>>
    location / {
        proxy_pass http://127.0.0.1:65457;
        proxy_set_header Host $Host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
        add_header X-Cache $upstream_cache_status;
        proxy_set_header X-Host $host:$server_port;
        proxy_set_header X-Scheme $scheme;
        proxy_connect_timeout 30s;
        proxy_read_timeout 86400s;
        proxy_send_timeout 30s;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
    
   
    # ERROR-PAGE-START  错误页相关配置,可以注释、删除或修改
    # error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = 50x.html {
        root html;
    }


    #日志配置
    access_log  /www/logs/frps-board.log;
    error_log  /www/logs/frps-board.error.log;
}

Nginx简介

高性能(响应快、高并发)HTTP和反向代理Web服务器,同时提供 IMAP/POP3/STMP 服务

代理

HTTP代理、反向代理,Web服务器最常用的功能之一,尤其是反向代理

正向代理

VPN

forwardProxy.png

⭐反向代理

reverseProxy.png

负载均衡

Nginx提供的负载均衡策略有两种:内置策略和扩展策略

内置策略:轮询,加权轮询,IP Hash

扩展策略:

内置策略

轮询
依次循环

poll.png

http {
    upstream backend {    # 在server列表进行轮询
        server 127.0.0.1:8080;
        server 127.0.0.1:8081;
    }
}
加权轮询

weightedPolling.png

http {
    upstream backend {
        server 127.0.0.1:8080 weight=3; # 加权(权重比例)
        server 127.0.0.1:8081 weight=1;
    }
    
    server {
        listen 80;
        server_name localhost;
        
        location / {
            root ./html;
            index index.html index.htm;
            
            proxy_pass http://backend;    # 将请求反向代理到server列表进行加权轮询
        }
    }
    
    access_log logs/access.log;
    error_log logs/errorl.log;
}
IP Hash

IP Hash对客户端请求的IP进行Hash操作,然后根据Hash结果将同一个客户端IP的请求分发给同一台服务器进行处理

可以解决Session不共享的问题

IPHash.png

Session 问题

会话保存在 Tomcat

启动了N台服务器,就会有N个不同Session的Tomcat

IP Hash 通过对IP进行Hash操作,将某一个客户端的请求固定打到某一台服务器上

Redis

动静分离

将不需要后台处理的静态文件(如 html、css、js、jpg 等),与需要后台处理的动态资源区分开

Dynamic&Static.png

让动态网站里的动态网页根据一定规则,把不变的资源和经常变动的资源区分开来,

动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,提高资源的响应速度。

没有后端鉴权,安全问题。

Nginx常用命令

Linux

默认Server端口 80

cd /usr/local/nginx/sbin  # 切换到nginx安装目录
./nginx  # 启动
#环境变量没问题可以直接 nginx 启动
nginx -s stop  # 停止
nginx -s quit  # 安全退出
nginx -s reload  # 重新加载配置文件 ⭐
ps aux | grep nginx  # 查看nginx进程

Nginx文件结构

/etc/nginx/nginx.conf

使用宝塔面板安装的目录在 /www/server/nginx/conf/nginx.conf

...              # 全局配置块

events {         # events配置块
   ...
}

http {      # http配置块
    
    ...   # http全局块
        
    upstream xx {    # 负载均衡配置块
        
    }
        
    server {        # server配置块
        
        ...       # server全局配置块
            
        location [PATTERN] {   # location配置块
            ...
        }
        location [PATTERN] {
            ...
        }
    }
    
    server {
      ...
    }
    ...     #http全局块
}
  • 1、全局块:配置影响nginx全局的指令

    一般有运行nginx服务器的 用户 组,nginx 进程 pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等
  • 2、events块:配置影响nginx服务器或与用户的网络连接

    有每个进程的 最大连接数 ,选取哪种 事件 驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等
  • 3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置

    如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等
  • 4、server块:配置虚拟主机的相关参数

    一个http中可以有多个server
  • 5、location块:配置请求的路由,以及各种页面的处理情况。

Nginx配置

样例释义:
########### 每个指令必须有分号结束。#################

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

events {
    accept_mutex on;   # 设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;   # 设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;        # 事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    # 最大连接数,默认为512
}

http {
    upstream mysvr {   
        server 127.0.0.1:7878;
        server 192.168.10.121:3333 backup;  #热备
    }
    
    include        mime.types;   # 文件扩展名与文件类型映射表
    default_type    application/octet-stream; # 默认文件类型,默认为text/plain
    
    log_format    myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; # 自定义格式
    
    #access_log off; # 取消服务日志
    access_log log/access.log myFormat;  #combined为日志格式的默认值
    
    sendfile on;   # 允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    sendfile_max_chunk 100k;  # 每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;  # 连接超时时间,默认为75s,可以在http,server,location块。

    error_page 404 /404.html; # 错误页
    
    server {
        keepalive_requests 120; # 单连接请求上限次数。
        listen    80;    # 监听端口
        server_name    localhost;   # 监听地址    
        
        location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
            #root path;  #根目录
            #index vv.txt;  #设置默认页
            proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            
            deny 127.0.0.1;  #拒绝的ip
            allow 172.18.5.54; #允许的ip  
        } 
    }
}
  • 几个常见配置项

    • $remote_addr$http_x_forwarded_for 用以记录客户端的IP地址;
    • $remote_user 用来记录客户端用户名称;
    • $time_local 用来记录访问时间与时区;
    • $request 用来记录请求的URL与HTTP协议;
    • $status 用来记录请求状态;成功是200;
    • $body_bytes_sent 记录发送给客户端文件主体内容大小;
    • $http_referer 用来记录从那个页面链接访问过来的;
    • $http_user_agent 记录客户端浏览器的相关信息;
  • 惊群现象:一个网络连接到来,多个睡眠的进程被同时叫醒,但只有一个进程能获得链接。这样会影响系统性能。
  • 每个指令必须有分号结束。

单站点配置(宝塔面板配置)

/etc/nginx/conf.d/mcIndex.conf

使用宝塔面板安装的目录在 /www/server/panel/vhost/nginx/*.conf

server
{
    listen 80;
    # listen 443 ssl http2;
    # SSL
    server_name mc.olimc.top;
    index index.html index.htm default.htm default.html;
    root /www/wwwroot/mcIndex;

    #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
    #error_page 404/404.html;
    #HTTP_TO_HTTPS_START
    # if ($server_port !~ 443){
    #     rewrite ^(/.*)$ https://$host$1 permanent;
    # }
    #HTTP_TO_HTTPS_END
    #SSL证书目录配置
    # ssl_certificate    /www/server/panel/vhost/cert/mcIndex/fullchain.pem;
    # ssl_certificate_key    /www/server/panel/vhost/cert/mcIndex/privkey.pem;
    # ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    # ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    # ssl_prefer_server_ciphers on;
    # ssl_session_cache shared:SSL:10m;
    # ssl_session_timeout 10m;
    # add_header Strict-Transport-Security "max-age=31536000";
    # error_page 497  https://$host$request_uri;
    #SSL-END

    #ERROR-PAGE-START  错误页相关配置,可以注释、删除或修改
    #error_page 404 /404.html;
    #error_page 502 /502.html;
    #ERROR-PAGE-END


    #REWRITE-START 伪静态相关配置,URL重写规则引用,修改后将导致面板设置的伪静态规则失效
    # include /www/server/panel/vhost/rewrite/mcIndex.conf;
    #REWRITE-END

    #禁止访问的文件或目录
    # location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    # {
    #     return 404;
    # }

    # HTTP反向代理相关配置开始 >>>
    # localtion /api
    location / {
        proxy_pass http://127.0.0.1:9001;
        proxy_set_header Host $Host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
        add_header X-Cache $upstream_cache_status;
        proxy_set_header X-Host $host:$server_port;
        proxy_set_header X-Scheme $scheme;
        proxy_connect_timeout 30s;
        proxy_read_timeout 86400s;
        proxy_send_timeout 30s;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
    
    # location /preview {
    #     proxy_pass http://127.0.0.1:9002;
    # }
    # HTTP反向代理相关配置结束 <<<

    #日志配置
    access_log  /www/wwwlogs/mcIndex.log;
    error_log  /www/wwwlogs/mcIndex.error.log;
}

配置示例(HTTP)

server
{
    listen 80;
    listen 443 ssl http2;
    server_name mc.olimc.top;
    index index.html index.htm default.htm default.html;
    root /www/wwwroot/mcIndex;

    # SSL证书目录配置
    ssl_certificate    /www/server/panel/vhost/cert/mcIndex/fullchain.pem;
    ssl_certificate_key    /www/server/panel/vhost/cert/mcIndex/privkey.pem;
    
    # HTTP反向代理相关配置开始 >>>
    # localtion /api
    location / {
        proxy_pass http://127.0.0.1:9001;
        proxy_set_header Host $Host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    
    # location /preview {
    #     proxy_pass http://127.0.0.1:9002;
    # }
    
    # ERROR-PAGE-START  错误页相关配置,可以注释、删除或修改
    # error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = 50x.html {
        root html;
    }


    #日志配置
    access_log  /www/wwwlogs/mcIndex.log;
    error_log  /www/wwwlogs/mcIndex.error.log;
}

proxy_pass

Nginx 中配置 proxy_pass 时,如果在 proxy_pass 后面的 url/ ,相当于是绝对根路径,则 Nginx 不会把 location 中匹配的路径部分代理走;

如果没有 / ,则会把匹配的路径部分给代理走。

四种模式

http://1.15.105.77/test/index.html 为例
# 第一种
location /test {
    proxy_pass http://1.15.105.77:87/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_frowarded_for;
}
# 会被代理到http://1.15.105.77/index.html

# 第二种
location /test {
    proxy_pass http://1.15.105.77:87;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_frowarded_for;
}
# 会被代理到http://1.15.105.77/test/index.html

# 第三种
location /test {
    proxy_pass http://1.15.105.77:87/linux/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_frowarded_for;
}
# 会被代理到http://1.15.105.77/linux/index.html

# 第四种
location /test {
    proxy_pass http://1.15.105.77:87/linux;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_frowarded_for;
}
# 会被代理到http://1.15.105.77/linuxindex.html
最后修改:2024 年 02 月 28 日
如果觉得我的文章对你有用,请随意赞赏