Nginx
0x01 概述
- Nginx 是目前最流行的 Web 服务器
- 为解决 C10K 问题而开发
- C10K:10000 concurrent connection,同时处理 10k 个并发链接
- 特点
- 高并发,最大 5w 个连接
- 高性能、低内存消耗
- 热部署
0x02 Nginx 安装
-
包管理器
-
Linux
$ sudo apt update $ sudo apt install nginx
-
Mac
$ brew install nginx
-
Windows
$ scoop install nginx $ choco install nginx
-
-
编译安装
$ ./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
-
使用 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
对应的目录下
- html 目录在 Nginx 的
-
上述部署方法可以使用命令
hexo -d
进行一键部署
-
0x05 配置文件
- 需要打开配置文件 nginx.conf
- 每次修改配置文件后都需要通过命令
nginx -s reload
重载配置文件
- 每次修改配置文件后都需要通过命令
- 配置文件一般由三部分组成
- 全局块
- 主要是一些全局配置,包括 worker 进程数量、指定运行服务的用户等
- worker_processes 对应的是 worker 进程的数量
- 数量与服务器 CPU 内核数量一致较为合适,可将值设置为
auto
- 数量与服务器 CPU 内核数量一致较为合适,可将值设置为
- 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-