Nginx

0x01 概述

  • Nginx 是目前最流行的 Web 服务器
  • 为解决 C10K 问题而开发
    • C10K:10000 concurrent connection,同时处理 10k 个并发链接
  • 特点
    • 高并发,最大 5w 个连接
    • 高性能、低内存消耗
    • 热部署

0x02 Nginx 安装

  1. 包管理器

    1. Linux

      $ sudo apt update
      $ sudo apt install nginx
      
    2. Mac

      $ brew install nginx
      
    3. Windows

      $ scoop install nginx
      $ choco install nginx
      
  2. 编译安装

    $ ./configure
      --sbin-path=/usr/local/nginx/nginx
      --conf-path=/usr/local/nginx/nginx.conf
      --pid-path=/usr/local/nginx/nginx.pid
      --with-http_ssl_module
      --with-pcre=../pcre2-10.39
      --with-zlib=../zlib-1.2.11
    $ make
    $ make install
    
  3. 使用 Docker

    $ docker pull nginx
    

0x03 服务启停

  • 使用命令 nginx 即可启动服务

    • 在浏览器访问 localhost 即可
  • 使用命令 ps -ef|grep nginx 即可查看后台中 Nginx 的进程

    graph TB A(master)-->B(worker) A-->C(worker) A-->D(worker)
    • master 进程是 Nginx 的主进程,负责读取和验证配置文件、管理 worker 进程
    • worker 进程是 Nginx 的工作进程,负责处理实际的请求
  • 使用命令 lsof -i:80 来仅查看 80 端口占用情况

  • 使用命令 nginx -s [quit|stop|reload|reopen] 对 Nginx 服务进行停止操作

    • quit:优雅停止
    • stop:立即停止
    • reload:重载配置文件
    • reopen:重启日志文件

0x04 静态站点部署

使用命令 nginx -V 即可查看 Nginx 的安装目录、编译参数、配置文件、日志文件位置等

  • 举例:搭建个人博客网站

    • Hexo 是一个基于 Node.js 的静态博客站点生成工具,可以将 Markdown 格式的文档转换成静态页面

      • 安装:npm install hexo-cli -g
      • 初始化:hexo init blog
      • 安装依赖:cd blog; npm install
      • 本地运行:hexo server
    • 将基于 Hexo 生成项目中的 public 目录下的所有内容复制到 Nginx 的 html 目录下

      • html 目录在 Nginx 的 --prefix 对应的目录下
    • 上述部署方法可以使用命令 hexo -d 进行一键部署

0x05 配置文件

  • 需要打开配置文件 nginx.conf
    • 每次修改配置文件后都需要通过命令 nginx -s reload 重载配置文件
  • 配置文件一般由三部分组成
    • 全局块
      • 主要是一些全局配置,包括 worker 进程数量、指定运行服务的用户等
      • worker_processes 对应的是 worker 进程的数量
        • 数量与服务器 CPU 内核数量一致较为合适,可将值设置为 auto
    • events 块
      • 主要是一些服务器和客户端之间网络连接的配置
    • http 块
      • 包括虚拟主机、反向代理、负载均衡等
      • 包含多个 server 块,又称“虚拟主机”
      • include servers/*:将 servers 目录下的所有配置文件全部包含进来,将每个虚拟主机的配置保存在单独的文件里,使主配置文件更加简洁清晰

0x06 反向代理和负载均衡

(1)正向代理

  • 正向代理就是代理客户端
  • 使用 VPN 访问墙外网站就是利用了正向代理
    • VPN 接收并代理客户端的请求向墙外网站发起请求,并将返回的结果转发回客户端

(2)反向代理

  • 反向代理就是代理服务端

  • 使用 DNS 访问某个服务器是利用了反向代理

    • 客户端通过域名请求访问服务端,此时请求被 DNS 转发至服务器中,从而隐藏了真实的服务器 IP 地址和端口等信息
  • 举例:使用 GO 语言搭建三个 Web 服务器并使用 Nginx 进行反向代理

    • Web 服务器 main-8000.go、main-8001.go、main-8002.go

      package main
      
      import (
          "fmt"
          "log"
          "net/http"
      )
      
      func main() {
          // 定义路由处理函数
          http.HandleFunc("/", func(w http.ResponseWriterm r *http.Request) {
              fmt.Fpring(w, "<h1>Port 8000</h1>")
          })
          
          // 启动服务器并监听 8000 端口
          log.Fatal(http.ListenAndServe(":8000", nil))
      }
      
      • 使用命令 go run main-8000.go 启动服务
    • 在 nginx.conf 的 http 块中添加反向代理配置

      upstream backend {
      	server 127.0.0.1:8080;
      	server 127.0.0.1:8081;
      	server 127.0.0.1:8082;
      }
      
      server {
      	# ...
      	
      	location /app {
      		proxy_pass http://backend;
      	}
      	
      	# ...
      }
      
      • backend 的名字可以自定义,proxy_pass 中 http:// 后与该名字一致
    • 访问 localhost/app 即可查看代理结果

(3)负载均衡

  • 服务器的性能和配置可能有所不同,故而需要负载均衡

  • 策略一

    • 可以修改 nginx.conf 的 http 块的 upstream,通过添加 weight 来修改权重

      upstream backend {
      	server 127.0.0.1:8080 weight=3;
      	server 127.0.0.1:8081;
      	server 127.0.0.1:8082;
      }
      
      • 权重越大,被分配到请求的次数越多
  • 策略二

    • 可以修改 nginx.conf 的 http 块的 upstream,添加 ip_hash

      upstream backend {
      	ip_hash;
      	server 127.0.0.1:8080;
      	server 127.0.0.1:8081;
      	server 127.0.0.1:8082;
      }
      

0x07 HTTPS 配置

  • HTTPS 是 HTTP 的安全版本

    • HTTPS = HTTP + SSL
  • 使用 openssl 生成自签名证书

    • 生成私钥文件
      openssl genrsa -out private.key 2048
    • 根据私钥生成证书签名请求文件
      openssl req -new -key private.key -out cert.csr
    • 使用私钥对证书申请进行签名从而生成证书文件
      openssl x509 -req -in cert.csr -out cacert.pem -signkey private.key
  • 在 nginx.conf 中进行修改

    server {
    	# 监听 443 端口并使用 SSL
    	listen 443 ssl;
    	# 设置域名
    	server_name localhost;
    	# 证书私钥文件名称
    	ssl_certificate /.../cacert.pem;
    	# 证书私钥文件名称
    	ssl_certificate_key /.../private.key
    	# ssl 验证配置
    	ssl_session_timeout 5m;
    	# 安全链接可选的加密协议
    	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    	# 配置加密套件/加密算法
    	ssl_ciphers ECDHE0-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!RC4:!DHE;
    	# 使用服务器端的首选算法
    	ssl_prefer_server_ciphers on;
    	
    	# ...
    }
    
  • 设置重定向

    server {
    	listen: 80;
    	server_name example.net www.example.net;
    	return 301 https://$server_name$request_uri;
    }
    

0x08 虚拟主机

  • 虚拟主机可以在一台服务器上部署多个站点

  • Nginx 的虚拟主机通过 server 块实现,其中通过 server_name 指定虚拟主机的域名

  • 举例:生成 Vue 站点

    • 新建 Vue 项目,使用命令 npm run build 将项目打包,结果在项目的 dist 目录下

    • 在 Nginx 配置目录 servers 下新建配置文件 vue.conf

      server {
      	listen 2023;
      	server_name localhost;
      	location / {
      		root /.../dist;
      		index index.html index.htm;
      	}
      }
      
    • 使用命令 nginx -s reload 重载 Nginx 的配置文件

    • 访问 localhost:2023 验证配置结果

-End-

posted @ 2023-07-21 16:39  SRIGT  阅读(61)  评论(0编辑  收藏  举报