Nginx 学习笔记
安装nginx
这里使用Centos8-Stream ,用包管理器安装nginx
[root@localhost ~]# dnf -y install nginx
nginx服务的启停
[root@localhost ~]# nginx # 回车启动nginx,没有输出为正常
然后打开浏览器,输入localhost,如果能够看到Nginx的Web页面,说明启动成功。
# nginx启动完成后作为一个后台程序执行,查看一下!
[root@localhost ~]# ps -ef | grep nginx
这里只需要关注两个进程,一个master进程,一个work 进程
Nginx的进程模型
master 进程是Nginx的主进程 : 负责读取和验证配置文件以及管理Work进程
work进程负责完成具体的工作(work进程的数量可以通过配置文件来调整)
只有一个master 进程,可以有多个work 进程
通过nginx -s [选项]来管理nginx进程
nginx -s quit # 正常程序退出nginx
nginx -s stop # 立即停止nginx
nginx -s reload # 重新加载nginx配置文件
nginx -s reopen # 重新打开日志文件
nginx # 启动nginx
静态站点部署
修改服务启动的默认页面
Nginx -V 查看nginx的详细信息,一般是查看nginx在服务器的配置文件路径
编辑配置文件,这个就是默认Web页面文件的位置
进入到该目录
[root@localhost nginx]# ls
html modules
[root@localhost html]# vim index.html # 修改里面的内容,随便修改即可
重新载入nginx配置文件
nginx -s reload # 然后刷新页面,可以看到显示了
搭建一个属于自己的个人博客
我们使用Hexo 搭建一个博客网站,然后部署在nginx里。
# 提前安装git 和 nodejs
dnf -y install git
dnf -y install nodejs
记得nodejs要版本新一点,如果上述第一条命令错了,那基本上是nodejs 版本不对,需要更新。
# 然后再按照上图方式安装即可。
# ------------------更新nodejs----------------------------
国内安装nvm失败的,可以去看这篇文章:https://blog.youkuaiyun.com/glovenone/article/details/137633632
# 安装 nvm (Node 版本管理器)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
# 下载并安装 Node.js(可能需要重启终端)
nvm install 22
# 验证环境中是否存在正确的 Node.js 版本
node -v # 应该打印 `v22.12.0`
# 验证环境中是否存在正确的 npm 版本
npm -v # 应该打印 `10.9.0`
访问成功
进入博客的目录,执行hexo g
将博客的markdown格式,转换成静态页面,生成在了public 目录下。
实际应用中,我们使用nginx作为Web服务器,只需要将public 目录下的所有文件复制到html目录下即可
[root@localhost public]# sudo cp -r /blog/public/* /usr/share/nginx/html/
然后再次刷新页面 localhost或者ip地址,可以看到原本nginx的首页变成了博客页面
Nginx的配置文件
在配置文件里测试修改work 进程的数量
[root@localhost html]# vim /etc/nginx/nginx.conf
我这里修改为5个
保存后,使用nginx -t 检查配置文件是否是正确的。
[root@localhost html]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
重载配置文件
[root@localhost html]# nginx -s reload
[root@localhost html]# ps -ef | grep nginx
root 44488 1 0 22:36 ? 00:00:00 nginx: master process nginx
nginx 44839 44488 0 22:49 ? 00:00:00 nginx: worker process
nginx 44840 44488 0 22:49 ? 00:00:00 nginx: worker process
nginx 44841 44488 0 22:49 ? 00:00:00 nginx: worker process
nginx 44842 44488 0 22:49 ? 00:00:00 nginx: worker process
nginx 44843 44488 0 22:49 ? 00:00:00 nginx: worker process
root 44845 2378 0 22:49 pts/0 00:00:00 grep --color=auto nginx
Tips:
一般来说,这个数量保持和服务器CPU内核数量相同即可。
也可以设置为auto,这样Nginx会自动根据内核的数量来设置work进程的数量
配置文件里修改最频繁的就是http这一模块。
这一块涉及到了反向代理、负载均衡、虚拟主机等
一个Http模块可以包含多个server模块
反向代理和负载均衡
Nginx是一个非常典型的反向代理的服务器
演示反向代理
使用Go语言从头搭建三个Web服务器
Tips: 这里我们可以使用GPT或者其他AI工具帮我们生成一个简单Go语言的Web源码
先提前在linux 里安装Go
dnf -y install go
package main
import (
"fmt"
"net/http"
)
func helloWorldHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Hello, World!")
}
func main() {
http.HandleFunc("/", helloWorldHandler)
fmt.Println("Starting server on :8080")
err := http.ListenAndServe(":8080", nil)
if err != nil {
fmt.Println("Error starting server:", err)
}
}
在随便哪一个目录下创建一个文件
[root@localhost nginx-web]# mkdir nginx-web
[root@localhost nginx-web]# cd nginx-web
[root@localhost nginx-web]# touch main.go
-------------------------------------------------------
把上面的粘贴进去
-------------------------------------------------------
复制三份,把里面的内容也各自修改一下,这里以8000为例如图
[root@localhost nginx-web]# ls
main-8000.go main-8001.go main-8002.go
修改nginx改配置文件
添加如下两个
upstream是在http块里添加的
nginx -t 检查配置文件是否有问题
nginx -s reload
然后克隆三个终端,进入到我们的三个go文件夹目录下,分别在三个终端执行:
go run main-8000.go
go run main-8001.go
go run main-8002.go
然后打开浏览器,输入 IP/app 不停刷新即可看到每次出现的结果不同(默认以轮询的方式代理)
还可以使用权重来加给某个服务器,让他接受更多的请求
编辑配置文件,加上权重,weight=3,意思他出现的额频率是其他两个的3倍
另外一个比较常用的策略是ip_hash(解决了一些客户端seesion 的问题)
这个地址会根据客户端的地址进行一个哈希,同一个客户端的请求,就会被分配到同一台服务器上。
修改配置文件
nginx -t
nginx -s reload
然后刷新浏览器,会发现请求都打在了8000端口
HTTPS配置
主流的云平台皆可以申请到HTTPS证书
如果没有云平台也没有关系
我们可以使用openssl来生成一个自签名认证的HTTPS证书
# 1.生成私钥文件-private key
openssl genrsa -out private.key 2048
# 2. 根据私钥生成证书签名请求文件。简称 CSR文件
openssl req -new -key private.key -out cert.csr
# 3.使用私钥对证书申请进行签名从而生成证书文件(pem文件)
openssl x509 -req -in cert.csr -out cacert.pem -signkey private.key
然后根据提示输入信息,完成后,会得到下面两个文件,一个是私钥文件,一个是证书文件pem
然后将这两个文件放入 nginx服务器目录下面。也就是/etc/nginx/
然后编辑nginx配置文件,将证书信息写入进去
listen 443 ssl;
server_name localhost;
# 证书文件名称
ssl_certificate /etc/nginx/cacert.pem;
#证书私钥文件名称
ssl_certificate_key /etc/nginx/private.key;
# 下面这几行配置一般都是固定的
# ssl 验证配置
ssl_session_timeout 5m; # 缓存有效期
# 安全连接可选的加密协议
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
# 配置加密套件/加密算法
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
# 使用服务端的首选算法
ssl_prefer_server_ciphers on;
[root@localhost nginx]# nginx -s reload # 重新加载配置文件 然后使用浏览器访问
因为我们刚刚生成的证书是自签名的,没有经过CA机构的认证,所以浏览器会提示我们不安全。
点击【高级】继续访问
然后我们查看一下证书的信息,点击不安全,点击【证书详情就可以看到我们的证书信息】
还有一般我们会将http的请求重定向到https,只需要在配置文件中加上如下几行命令即可
然后重启 nginx -s reload
server {
listen 80;
server_name test.net www.test.net;
return 301 https://$server_name$request_uri;
}
然后就可以访问成功了!!!
虚拟主机
虚拟主机可以在一台服务器上部署多个站点。
Nginx中的每一个server块都是一个虚拟主机站点。
同时,nginx还提供了一个更加规范化的标准,允许在主配置文件中包含进来外部配置的虚拟主机站点,
而不必将所有的站点都一股脑堆在同一个配置文件中,显得过于臃肿。
例如,将上面的https的配置的server块,剪贴下来,复制到本目录下的conf.d目录下,新建一个配置文件名称。粘贴进去。
然后在nginx.conf主配置文件中,引用该配置文件即可
[root@localhost conf.d]# vim local.conf
# 复制过去
[root@localhost conf.d]# nginx -s reload
# 为啥是conf.d目录,因为我们可以看到主配置文件当中有这样一命令
include /etc/nginx/conf.d/*.conf;
这个命令意思是将conf.d目录下.conf 后缀的文件都包括进来。