Web服务器:Nginx 的介绍与快速入门

  • Post author:
  • Post category:其他




一、Nginx 介绍

Nginx 是一个开源、快速、轻量级和高性能的 web 服务器,可直接作为静态网页服务器使用。它是用 c 语言实现的,内存占用少,启动极快,高并发能力强,官方数据测试表明它能够支持高达50000个并发连接数。是目前最流行的 web 服务器。

除了 web 服务,它还提供了其他一些功能,比如:



1.1 反向代理

  • 正向代理:


    正向代理是代理服务器代替客户端去访问所有其他服务器,并将响应返回。


    例子不举了,改来改去还是通不过审核😾

  • 反向代理:

    而反向代理恰恰相反,它代理的是服务端。我们以访问百度为例。

    百度的服务器肯定不止一台,但是我们访问时,永远只需要访问

    baidu.com

    。这是因为我们实际上访问的是百度的反向代理服务器,反向代理服务器收到请求后,将请求发送给真正的百度服务器中的其中一台,并将服务器的响应返回给客户端。


    反向代理是反向代理服务器替代服务端去接收客户端发来的请求,并将响应返回。



1.2 负载均衡

上面说过,通过反向代理可以将请求发送到多台服务器的其中一个上。这样做的目的就是避免大量请求进入时,某一台服务器的压力过大而崩溃。而这种做法被称为负载均衡。

Nginx 有很多种请求分配方法,我们看看常用的几个:

  • 轮询:

    按照请求进入的顺序,每台服务器轮流分配一个请求。

  • 加权轮询:

    在轮询基础上,给性能强一些的服务器增加权重,让其处理更多的请求。

  • 最少连接数:

    将下一个请求分配到连接数最少的那台服务器上。

  • Ip_hash:

    上面的几种会造成一个问题:客户端在 A 服务器上登陆, session 也被保存在 A 上,可下一次客户端请求可就不一定会被分配到 A 上,这显然会使客户端的登陆状态丢失。

    解决方法就是使用 Ip_hsah,每个请求按访问 IP 的 hash 结果分配,这样每个 IP 固定访问一个后端服务器,解决了 session 的问题。

    当然,在实际开发中,更加靠谱的还是使用 redis 做 session 共享。



1.3 动静分离

动静分离就是将静态文件html、css、js、jpg等)和动态文件(后台应用)区分开来处理,以提高用户访问静态文件的速度,降低对后台应用的访问,提高服务器响应速度和性能。

Nginx 作为静态文件服务器,给静态文件提供服务。就免去了应用服务器对静态文件请求的处理,降低了应用服务器的压力。



二、安装 Nginx (Ubuntu 20.04下)

  1. 安装必备组件:

    sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
    
  2. 导入官方的 nginx 签名密钥:

    curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
        | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
    
  3. 验证密钥:

    gpg --dry-run --quiet --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
    

    正常输出如下:

    pub   rsa2048 2011-08-19 [SC] [有效至:2024-06-14]
          573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
    uid                      nginx signing key <signing-key@nginx.com>
    
  4. 设置 apt 存储库(稳定版):

    echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
    http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
        | sudo tee /etc/apt/sources.list.d/nginx.list
    
  5. 设置存储库固定,以优先选择官方包而不是 Ubuntu 提供的包:

    echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
        | sudo tee /etc/apt/preferences.d/99nginx
    
  6. 安装:

    sudo apt update
    sudo apt install nginx
    
  7. 验证安装:打开 http://127.0.0.1:80,看到 nginx 就说明安装成功。



三、Nginx 常用命令

  • 启动 Nginx:

    sudo nginx    # apt 安装,会自动启动
    
  • 显示 nginx 的版本,编译器版本和配置参数:

    nginx -V
    
  • 快速退出:

    sudo nginx -s stop
    
  • 安全退出:

    sudo nginx -s quit
    
  • 检查配置文件:

    sudo nginx -t -c /etc/nginx/nginx.conf
    
  • 重新加载配置文件:

    sudo nginx -s reload
    

通常,还要对防火墙进行操作,如开放端口等。但这不属于 Nginx 的范围,所以这里就不讲了。



四、Nginx 配置简介


nginx 的配置文件位置为:/etc/nginx/nginx.conf

,配置文件以一对大括号

{}

来表示一个部分,主要分为4块:

  • 全局块,即 events 上面的部分,没有被大括号包裹:

    user  nginx;     # nginx 进程的所属用户
    worker_processes  auto;     # 工作进程数
    
    error_log  /var/log/nginx/error.log notice;    # 错误日志路径及级别
    pid        /var/run/nginx.pid;    # Nginx 服务启动的pid
    
  • Event 块:

    events {         # nginx 工作模式的配置
        worker_connections  1024;    # 每个工作进程支持的最大连接数
    }
    
  • HTTP 块:

    http {
        include       /etc/nginx/mime.types;   # mime 类型定义
        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  /var/log/nginx/access.log  main;  # 访问日志
    
        sendfile        on;    # 优化静态资源
        #tcp_nopush     on;    # nginx 不要缓存数据,而是一段一段发送
    
        keepalive_timeout  65;   # 给客户端分配连接超时时间,服务器会在这个时间过后关闭连接。
    
        #gzip  on;    # 压缩
    
        include /etc/nginx/conf.d/*.conf;    # 要包含的其他配置文件的路径,如下面的 default.conf
        
        
        
        # 负载均衡相关配置,默认是没有的,需要我们自己添加
        # upstream 任意名称{
        #     server 127.0.0.1:8000;
        # }
    }
    
  • 通常,还有一个

    server 块,单独保存在:/etc/nginx/conf.d/default.conf

    中:

    server {
        listen      80;    # 监听端口
        server_name  localhost;    # 提供服务的域名或主机名
    
        #access_log  /var/log/nginx/host.access.log  main;
    
        location / {    # 控制网站访问路径
            root   /usr/share/nginx/html;   # 存放网站的路径
            index  index.html index.htm;    # 默认访问的首页
        }
    
        #error_page  404              /404.html;  # 错误页面
    
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;  # 配置错误页
          = /50x.html {   # 错误代码重定向到新的 location
            root   /usr/share/nginx/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;
        #}
    }
    


注意!不要直接修改配置文件,应该先做好原配置文件的备份。



五、配置反向代理



5.1 简单的反向代理

比如,当我们访问

127.0.0.1:888

时,自动跳转到 python 的官网https://www.python.org/。

server {
    listen      888;
    server_name  127.0.0.1;    

    location / {
        proxy_pass   https://www.python.org/;   # 增加请求转发路径
    }
}



5.2 根据请求路径转发到不同的服务器

比如:

  • 访问

    127.0.0.1:888/AAA/

    时,自动跳转到 AAA 服务器。
  • 访问

    127.0.0.1:888/BBB/

    时,自动跳转到 BBB 服务器。
server {
    listen      888;
    server_name  127.0.0.1;    

    location ~/AAA/ {     # ~ 表示 URI 包含正则表达式
        proxy_pass   AAA 的ip地址和端口;
    }
    
    # 增加一个 location
    location ~/BBB/ {
        proxy_pass   BBB 的ip地址和端口;    # 地址不能带路径,末尾的 / 也不行
    }
    
    ......
}

说明:


  • ~

    :表示 URI 包含正则表达式,并区分大小写。


  • ~*

    :表示 URI 包含正则表达式,不区分大小写。


  • =

    :表示 URI 不包含正则表达式,要求路径与 URI 严格匹配。


  • ^~

    :表示 URI 不包含正则表达式, 如果匹配到普通的 location,就不再去匹配包含正则表达式的 location。



六、配置负载均衡

http {
    ......
    
    upstream 任意名称{
        请求分配方法;
        server 服务器1的地址;
        server 服务器2的地址;
        ......
    }

    ......
}




server {
    ......
    location / {
        proxy_pass   upstream 的名称;
    }
    ......
}

请求分配方法:

  • 轮询:是默认的,不写策略用的就是轮询。

  • 加权轮询:

    upstream 任意名称{
        server 服务器1的地址;
        server 服务器2的地址 weight=100;
        ......
    }
    

    权重越重,分配到的请求就越多。

  • 最少连接数:

    upstream 任意名称{
        last_conn;
        server 服务器1的地址;
        server 服务器2的地址;
        ......
    }
    
  • ip_hash:

    upstream 任意名称{
        ip_hash;
        server 服务器1的地址;
        server 服务器2的地址;
        ......
    }
    



七、配置动静分离

server {
    ......
    location /访问路径/ {
        root 存放静态文件目录的路径;
        autoindex on;    # 对目录进行索引,展示目录下有什么内容
        index 文件名1 文件名2 ......    # NGINX 会按指定顺序查找文件并返回它找到的第一个文件
    }
    ......
}



版权声明:本文为qq_39330486原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。