nginx

简介

Nginx(发音为”engine-x”)是一个高性能的开源 Web 服务器和反向代理服务器。以下是 Nginx 的一些关键特点和简介:

高性能: Nginx 以高性能而著称,能够处理大量并发连接,同时占用较少的系统资源。它的事件驱动架构和非阻塞 IO 模型有助于实现高效的性能。

轻量级和可扩展: Nginx 的设计目标之一是保持简单、轻量级且可扩展。它的模块化架构使得用户可以根据需要选择性地添加功能模块。

反向代理: Nginx 可以用作反向代理服务器,接收客户端请求并将其转发到后端服务器。这使得它成为负载均衡和提高 Web 应用性能的理想选择。

负载均衡: Nginx 支持基于轮询、IP 哈希等算法的负载均衡,能够平均分配流量到多个后端服务器,提高系统的可用性和稳定性。

静态文件服务: Nginx 非常擅长提供静态文件服务,可以快速地传送静态内容,减轻后端服务器的负担。

SSL/TLS 支持: Nginx 支持 SSL/TLS 协议,能够提供安全的加密通信,用于保护网站和应用程序的数据传输。

虚拟主机: Nginx 支持虚拟主机配置,允许多个域名共享同一台服务器,并根据域名或其他条件进行不同的配置。

日志记录: Nginx 提供详细的访问日志和错误日志,有助于进行故障排除和性能优化。

社区支持和活跃: Nginx 是一个开源项目,拥有庞大的用户社区,有许多第三方模块和插件可用。它也有商业版本(NGINX Plus)提供额外的功能和支持。

总体而言,Nginx 是一个强大、灵活且高性能的 Web 服务器,适用于处理各种 Web 应用程序和场景。由于其卓越的性能和可扩展性,它被广泛用于互联网和企业环境中

安装

1. 包管理安装

1
brew install nginx

or

1
2
sudo apt update
sudo apt install nginx

2. 编译安装

下载源码,预编译,编译,安装,比较灵活,可以自定义配置一些东西,但比较麻烦

3. 使用 Docker 安装

1
docker pull nginx

启动服务

  1. 启动命令:
1
nginx

没有消息就是好消息

  1. 打开浏览器输入 localhost,能打开页面看到 Welcome to nginx! ,说明启动成功

  2. ps -ef|grep nginx可查看 nginx 进程

  3. nginx -s signal
    quit : 优雅停止
    stop: 立即停止
    reload:重新配置文件
    reopen:重新打开日志文件

  4. nginx -V
    可以查看 Nginx 的安装目录,编译参数等等

  5. 如何查看 nginx 运行的网页的位置

  6. nginx -V

  7. 找到–prefix,例如: –prefix=/opt/homebrew/Cellar/nginx/1.21.6_1

  8. cd /opt/homebrew/Cellar/nginx/1.21.6_1

  9. ls -ltr 可以看到列表中有 html

  10. cd html

  11. ls -ltr

  12. code index.html

搭建一个属于自己的个人博客网站

  1. 新建博客
1
2
3
4
npm install hexo-cli -g
hexo init blog
cd blog;npm install
hexo server/ hexo s
  1. 部署到 nginx 上
    然后将 hexo 生成的网页文件(在 public 目录下),复制到 nginx 中

cp -rf * /opt/homebrew/var/www

nginx 配置

1. 基本的服务器配置

1
2
3
4
5
6
7
8
9
10
11
server {
listen 80; # 监听端口
server_name example.com www.example.com; # 域名配置
root /path/to/your/webroot; # 网站根目录
index index.html index.htm; # 默认首页

location / {
# 其他配置
}
}

2. 反向代理配置

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80;
server_name example.com;

location / {
proxy_pass http://backend_server; # 后端服务器地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 其他反向代理配置
}
}

3. 负载均衡配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
upstream backend {
server backend1.example.com;
server backend2.example.com;
# 添加更多后端服务器
}

server {
listen 80;
server_name example.com;

location / {
proxy_pass http://backend;
# 其他负载均衡配置
}
}

4. SSL/TLS 配置

1
2
3
4
5
6
7
8
9
10
server {
listen 443 ssl;
server_name secure.example.com;

ssl_certificate /path/to/ssl_certificate.crt;
ssl_certificate_key /path/to/ssl_certificate.key;

# 其他SSL/TLS配置
}

5. 重定向配置

1
2
3
4
5
6
server {
listen 80;
server_name www.example.com;
return 301 http://example.com$request_uri; # 重定向到非www域名
}

反向代理和负载均衡

正向代理和反向代理

正向代理 代理客户端(client)(VPN)
反向代理 代理服务端(server) (比如我们通过 Google 搜索内容,我们只通过一个域名访问,但其实转发到了后面很多个不同的服务器端上,从而隐藏了真实的服务器 IP 地址、端口等信息)

例子

  1. 首先先用 go 生成一个简单的 web 页面,在端口 8000 监听,这里我是用 chatGPT 自动帮我生成:

如果没有安装 go,请先安装,我这边直接用brew install go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import (
"fmt"
"net/http"
)

func main() {
// 设置路由
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
})

// 启动服务器并监听8000端口
port := 8000
fmt.Printf("服务器正在监听端口 %d...\n", port)
err := http.ListenAndServe(fmt.Sprintf(":%d", port), nil)
if err != nil {
fmt.Println("启动服务器时发生错误:", err)
}
}

  1. 我们将上面的文件再复制出两个文件,分别改写端口号为 8001、8002,分别运行在浏览器中。

  2. 然后我们再修改一下 nginx 的配置文件
    code /opt/homebrew/etc/nginx/nginx.conf
    添加upstream的配置,这个就是反向代理的配置

1
2
3
4
5
upstream backend{
server 127.0.0.1:8000;
server 127.0.0.1:8001;
server 127.0.0.1:8002;
}

在 下面的 server 配置中再添加一个 location 的配置,访问 app 都将代理到刚刚的配置中

1
2
3
location /app{
proxy_pass http://backend;
}
  1. 重新 reload 一下 nginx 配置
    nginx -s reload

https 配置

http + ssl 证书 -> https
http 默认端口: 80
https 默认端口: 443
在主流的云平台(腾讯云,阿里云,AWS,GCP)上都可以申请免费的 ssl 证书,证书申请完后会得到证书文件(cacert.pem)和私钥文件(private.key),如果没有云平台也没有关系,我们可以通过 openssl 来自己生成一个自签名的证书

openssl 生成证书

  1. 生成私钥文件(private key)
    openssl genrsa -out private.key 2048
  2. 根据私钥生成证书签名请求文件
    openssl req -new -key private.key -out cert.csr
  3. 使用私钥对证书申请进行签名从而生成证书(pem 文件)
    openssl x509 -req -in cert.csr -out cacert.pem -signkey private.key

nginx 配置

这两个文件需要放置到服务器上证书文件(cacert.pem)和私钥文件(private.key),然后在 nginx 的配置文件中进行配置

  1. 在监听后加上 ssl
    listen 443 ssl;
  2. 将证书和私钥填写进入
1
2
ssl_certificate    /opt/homebrew/etc/nginx/cacert.pem
ssl_certificate_key /opt/homebrew/etc/nginx/private.key
  1. 然后再加上一些验证配置和加密协议,这些配置基本是固定的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
listen 443 ssl;
server_name your_domain.com;

ssl_certificate /etc/nginx/ssl/your_domain.crt;
ssl_certificate_key /etc/nginx/ssl/your_domain.key;

# 可选:配置 SSL 优化和安全性
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384';

# 其他 SSL 配置...

location / {
# 配置其他相关的代理或静态文件服务...
}
}

我们的证书是自签名的,没有经过 ca 认证,所以打开网站会提示不安全

配置 http 重定向到 https

server {
listen 80;
server_name your_domain.com www.your_domain.com;

# 重定向到 HTTPS
return 301 https://$host$request_uri;

}

虚拟主机

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

配置

nginx 中通过server块来配置虚拟主机,每个server块就是一个虚拟主机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server {
listen 80; # 监听端口

server_name your_domain.com www.your_domain.com; # 替换为你的域名

root /path/to/your/webroot; # 替换为你的网站根目录

index index.html index.htm; # 默认首页

location / {
# 配置其他参数,比如代理、缓存等
}

# 配置其他特定的location块,如果需要的话
}

如何将一个 vue 项目部署到服务器上

  1. 创建一个 vue 项目,并打包好

  2. open nginx 配置项目

  • cd /opt/homebrew/etc/nginx
  • code .
  • 新建一个 servers 文件夹,在 servers 里建vue.conf
1
2
3
4
5
6
7
8
server{
listen 5173;
server_name localhost;//替换成域名
location / {
root /Users/mei/vue-demo/dist;//打包项目地址
index index.html index.htm;
}
}
  • nginx -s reload
    在浏览器中输入 localhost:5173 就可以看到 vue 项目。