💖对Nginx的企业级理解,附阿里云实战💖

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
日志服务 SLS,月写入数据量 50GB 1个月
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介: Nginx 安装目录下,其默认的配置文件都放在这个目录的 conf 目录下,而主配置文件nginx.conf 也在其中,后续对 Nginx 的使用基本上都是对此配置文件进行相应的修改。

1.JPG


三、Nginx 常用的命令和配置文件


3.1、Nginx常用命令


3.1.1、启动命令


# 在Nginx的sbin目录下执行
./nginx
复制代码


3.1.2、关闭命令


# 在Nginx的sbin目录下执行
./nginx -s stop
复制代码


3.1.3、重启Nginx


# 在Nginx的sbin目录下执行
/nginx -s reload
复制代码


3.2、Nginx的配置文件


   Nginx 安装目录下,其默认的配置文件都放在这个目录的 conf 目录下,而主配置文件nginx.conf 也在其中,后续对 Nginx 的使用基本上都是对此配置文件进行相应的修改。


2.JPG

 

配置文件中有很多#, 开头的表示注释内容。


#user  nobody;
#开启进程数 <=CPU数 
worker_processes  1;
#错误日志保存位置
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#进程号保存文件
#pid        logs/nginx.pid;
#每个进程最大连接数(最大连接=连接数x进程数)每个worker允许同时产生多少个链接,默认1024
events {
    worker_connections  1024;
}
http {
  #文件扩展名与文件类型映射表
    include       mime.types;
  #默认文件类型
    default_type  application/octet-stream;
  #日志文件输出格式 这个位置相于全局设置
    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  logs/access.log  main;
  #打开发送文件
    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
  #连接超时时间
    keepalive_timeout  65;
  #打开gzip压缩
    #gzip  on;
  #设定请求缓冲
  #client_header_buffer_size 1k;
  #large_client_header_buffers 4 4k;
  #设定负载均衡的服务器列表
  #upstream myproject {
    #weigth参数表示权值,权值越高被分配到的几率越大
    #max_fails 当有#max_fails个请求失败,就表示后端的服务器不可用,默认为1,将其设置为0可以关闭检查
    #fail_timeout 在以后的#fail_timeout时间内nginx不会再把请求发往已检查出标记为不可用的服务器
  #}
    #webapp
    #upstream myapp {   
    # server 192.168.122.133:8080 weight=1 max_fails=2 fail_timeout=30s;   
  # server 192.168.122.134:8080 weight=1 max_fails=2 fail_timeout=30s;   
    #} 
    #配置虚拟主机,基于域名、ip和端口
    server {
    #监听端口
        listen       80;
    #监听域名
        server_name  localhost;
        #charset koi8-r;
    #nginx访问日志放在logs/host.access.log下,并且使用main格式(还可以自定义格式)
        #access_log  logs/host.access.log  main;
    #返回的相应文件地址   
        location / {
            #设置客户端真实ip地址
            #proxy_set_header X-real-ip $remote_addr;   
      #负载均衡反向代理
      #proxy_pass http://myapp;
      #返回根路径地址(相对路径:相对于/usr/local/nginx/)
            root   html;
      #默认访问文件
            index  index.html index.htm;
        }
    #配置反向代理tomcat服务器:拦截.jsp结尾的请求转向到tomcat
        #location ~ \.jsp$ {
        #    proxy_pass http://192.168.122.133:8080;
        #}    
        #error_page  404              /404.html;
        # redirect server error pages to the static page /50x.html
        #
    #错误页面及其返回地址
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }
  #虚拟主机配置:
  server {
    listen 1234;
    server_name wolfcode.cn;
    location / {
    #正则表达式匹配uri方式:在/usr/local/nginx/wolfcode.cn下 建立一个test123.html 然后使用正则匹配
    #location ~ test {
      ## 重写语法:if return (条件 = ~ ~*)
      #if ($remote_addr = 192.168.122.1) {
      #       return 401;
      #}    
      #if ($http_user_agent ~* firefox) {
      #    rewrite ^.*$ /firefox.html;
      #    break;
      #}      
      root wolfcode.cn;
      index index.html;
    }
    #location /goods {
    #   rewrite "goods-(\d{1,5})\.html" /goods-ctrl.html;
    #   root wolfcode.cn;
    #   index index.html;
    #}
    #配置访问日志
    access_log logs/wolfcode.cn.access.log main;
  }
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;
    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
}
复制代码

 

  我们去掉所有以 # 开头的段落,精简之后的内容如下:


...              #全局块
events {         #events块
   ...
}
http      #http块
{
    ...   #http全局块
    server        #server块
    { 
        ...       #server全局块
        location [PATTERN]   #location块
        {
            ...
        }
        location [PATTERN] 
        {
            ...
        }
    }
    server
    {
      ...
    }
    ...     #http全局块
}
复制代码


3.2.1、全局块


   从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。


   比如第一行的worker_processes 1;,这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约


3.2.2、events块


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


   比如下面这段配置,就表示每个 work process 支持的最大连接数为 1024,这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。


events {
    worker_connections  1024;
}
复制代码


3.2.3、http块


   这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。


   可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。


   http 块也可以包括 http 全局块、server 块。


3.2.3.1、http全局块


   http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。


3.2.3.2、server块


   这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。


   每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机,而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。


server {
        listen    80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
}
复制代码

3.2.3.2.1、全局server块


   最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置


3.2.3.2.2、location块


   一个 server 块可以配置多个 location 块。这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。


3.2.4、location配置


   location支持多种语法规则:


  1. = 开头表示精确匹配。
  2. ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。
  3. ~ 开头表示区分大小写的正则匹配。
  4. ~* 开头表示不区分大小写的正则匹配。
  5. !~!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则。
  6. / 通用匹配,任何请求都会匹配到。


   既然有多种匹配规则,那么就肯定是有匹配的顺序:首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。


3.3、Nginx服务的信号控制


  Nginx之所以有高性能,其实也和它的架构模式有关。Nginx默认采用的是多进程的方式来工作的,当将Nginx启动后,我们通过 ps -ef | grep nginx命令可以查看。


3.JPG

 

Nginx后台进程中包含一个master进程和多个worker进程,master进程主要用来管理worker进程,包含接收外界的信息,并将接收到的信号发送给各个worker进程,监控worker进程的状态,当worker进程出现异常退出后,会自动重新启动新的worker进程。而worker进程则是专门用来处理用户请求的,各个worker进程之间是平等的并且相互独立,处理请求的机会也是一样的。


4.JPG


四、Nginx实现反向代理


   使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中。nginx 监听端口为 9001,实现下面的效果:


  1. 访问 http://127.0.0.1:9001/edu/ 直接跳转到 127.0.0.1:8081
  2. 访问 http://127.0.0.1:9001/vod/ 直接跳转到 127.0.0.1:8082


准备两个 tomcat,一个 8001 端口,一个 8002 端口,并准备好测试的页面

修改 nginx 的配置文件,在 http 块中添加 server{}

server {
  listen 9001;
  server_name localhost;
  location ~ /edu/ {
    proxy_pass http://localhost:8001;
  }
  location ~ /vod/ {
    proxy_pass http://localhost:8002;
  }
}
复制代码


五、Nginx实现负载均衡


5.1、负载均衡简介


   随着互联网信息的爆炸性增长,负载均衡(load balance)已经不再是一个很陌生的话题,顾名思义,负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。


   快速增长的访问量和数据流量催生了各式各样的负载均衡产品,很多专业的负载均衡硬件提供了很好的功能,但却价格不菲,这使得负载均衡软件大受欢迎,nginx 就是其中的一个,在 linux 下有 Nginx、LVS、Haproxy 等等服务可以提供负载均衡服务


5.2、在nginx.conf进行配置


http{
  upstream myserver{
    ip_hash;
    server 192.168.10.1:80880 weight=1;
    server 192.168.10.2:80880 weight=1;
  }
  server{
    location /{
      # 这里http后面名字要和上面的upstream后面的一样
      proxy_pass http://myserver;
      proxy_connect<timeout 10;
    }
  }
}
复制代码


5.3、负载均衡策略


   Nginx 提供了几种分配方式(策略):


  1. 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
  2. weight:代表权重,权重默认为1,权重越高,被分配的客户端就越多。
  3. ip_hash:每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。
  4. 随机


六、Nginx实现动静分离

6.1、概述


   Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种:


  1. 纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案。
  2. 动态跟静态文件混合在一起发布,通过 nginx 来分开。


6.2、配置文件配置


在配置文件方面,重点是配置location。


location /www/ {
    root /data/;
    index index.html index.html;
  }
  location /image/ {
    root /data/;
    autoindex on;
  }
复制代码

 

最后检查 Nginx 配置是否正确即可,然后测试动静分离是否成功,之需要删除后端tomcat服务器上的某个静态文件,查看是否能访问,如果可以访问说明静态资源 nginx 直接返回了,不走后端 tomcat 服务器。

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
6月前
|
Web App开发 编解码 运维
LNMP详解(十二)——Nginx URL重写实战
LNMP详解(十二)——Nginx URL重写实战
71 2
|
6月前
|
运维 负载均衡 应用服务中间件
LNMP详解(九)——Nginx虚拟IP实战
LNMP详解(九)——Nginx虚拟IP实战
136 2
|
6月前
|
运维 监控 应用服务中间件
LNMP详解(十五)——Nginx日志分析实战
LNMP详解(十五)——Nginx日志分析实战
74 0
|
6月前
|
运维 前端开发 应用服务中间件
LNMP详解(八)——Nginx动静分离实战配置
LNMP详解(八)——Nginx动静分离实战配置
111 0
|
6月前
|
运维 负载均衡 应用服务中间件
LNMP详解(九)——Nginx虚拟IP实战
LNMP详解(九)——Nginx虚拟IP实战
132 2
|
6月前
|
运维 应用服务中间件 Linux
keepalived详解(三)——keepalived与Nginx配合实战
keepalived详解(三)——keepalived与Nginx配合实战
207 1
|
1月前
|
缓存 负载均衡 安全
Nginx常用基本配置总结:从入门到实战的全方位指南
Nginx常用基本配置总结:从入门到实战的全方位指南
253 0
|
6月前
|
缓存 运维 前端开发
LNMP详解(十)——Nginx负载分担实战
LNMP详解(十)——Nginx负载分担实战
58 1
|
6月前
|
运维 前端开发 应用服务中间件
LNMP详解(八)——Nginx动静分离实战配置
LNMP详解(八)——Nginx动静分离实战配置
74 1
|
5月前
|
安全 Ubuntu 应用服务中间件
NGINX环境下实现Web网站访问控制的实战指南
在NGINX中设置基于IP的访问控制可提升网站安全性。步骤包括安装NGINX、备份配置文件、编辑`/etc/nginx/sites-available/default`,添加`allow`和`deny`指令限制特定IP访问,如`allow 192.168.1.100; deny all;`,然后测试配置并重启服务。成功后,仅允许的IP能访问网站,否则会收到403错误。这为Web安全提供基础保障,还可扩展实现更多高级控制策略。【6月更文挑战第20天】
603 3