🌈 全栈技术环境搭建(一): Nginx环境搭建和配置HTTPS
☀️ 前置知识
在之前最基础的网站架构全貌图博文中提到一张网站架构全貌图:
在网络接入层都标配一个负载均衡,这个角色通常是由Nginx来承担,理由有四个:
✅性能高: Nginx采用内核Poll模型,可以同时处理大量并发请求。支持更多的并发连接。另外,Nginx的内存消耗很低,可以在有限的资源下提供更高的性能。
✅反向代理: 将来自前端和客户端的请求转发到另一台服务器或另外一组服务器,实现负载均衡、提高网站运行速度等目的。如图中Nginx可以将客户端的请求转发到页面渲染服务器,将数据请求转发到API数据服务器等。
✅安全支持: Nginx支持SSL/TLS加密,可以为网站提供安全性和隐私保护。此外,它还支持访问控制、IP地址限制等安全功能,有助于保护服务器免受网络攻击。以个人网站为例,刚上线时没来的及配置https协议。就被作弊的人将一个很差的域名自动化解析到我服务器IP地址。
总之,网站上线必须要有网络接入,这个选项通常绕不过Nginx。
🔥 安装Ngnix的两种方法
安装nginx有两种方式: yum/apt软件包管理工具和源码编译安装
💥 方法1: yum包管理工具
1️⃣ 安装EPEL仓库:
sudo yum install epel-release
2️⃣ 安装nginx
sudo yum install nginx
3️⃣ 启动nginx
sudo systemctl start nginx
4️⃣ 查看nginx状态
sudo systemctl status nginx
5️⃣ 开机自启动nginx
sudo systemctl enable nginx
6️⃣ 关停nginx
sudo systeml stop nginx
7️⃣ 默认配置: 通过yum包管理工具安装的nginx的一些默认配置一般如下:
# 1. 默认nginx.conf位置, nginx的所有配置的上层目录在/etc/nginx下。
sudo vim /etc/nginx/nginx.conf
# 2. 默认存储的日志文件目录
## 错误日志,该路径可在nginx.conf里修改
cat /var/log/nginx/error.log
## 访问日志,该路径可在nginx.conf里修改
cat /var/log/nginx/access.log
💥 方法2: 编译源码:
1️⃣ 准备系统环境
## openssl库是https需要的,zlib是http模块gzip需要的。
## ubuntu环境:
sudo apt update
sudo apt install openssl libssl-dev zlib1g zlib1g-dev
## centos环境:
sudo yum update
sudo yum install openssl openssl-devel zlib zlib-devel
2️⃣ 下载并解压源码
# 可以在https://nginx.org/download 链接里找到自己想下载的版本
# 我的目录都是放在/home/work/app目录下,根据自己的实际情况决定
cd /home/work/app
wget https://nginx.org/download/nginx-1.26.2.tar.gz
wget https://github.com/PCRE2Project/pcre2/releases/download/pcre2-10.44/pcre2-10.44.tar.gz
## 解压nginx和pcre,其中pcre时http模块配置rewrite时需要的。
tar -xvf nginx-1.26.2.tar.gz
tar -xvf pcre2-10.44.tar.gz
3️⃣ 配置编译参数
编译安装时,需要注意一些编译参数
## 注意这里有几个参数需要解释一下:
## --prefix参数: 安装路径, 将文件安装在/home/work/apps/nginx目录下
## --with-http_ssl_module参数: 开启https协议需要用到模块
## --conf-path参数:nginx.conf等configure文件存放目录
## 因为是演示https的支持,所以其他参数都没安装。
cd nginx-1.26.2/
./configure --prefix=/home/work/apps/nginx --user=work --group=work --with-http_ssl_module --with-pcre=/home/work/apps/pcre2-10.44
出现上面这张图,意味nginx编译的前置步骤达成了,在nginx-1.26.2目录下多了一个Makefile文件,Makefile是用于编译的。
4️⃣ 编译和安装:
make && make install
这张图意味着nginx已经编译完成,且已经安装在/home/work/apps/nginx目录下,进入nginx目录:
cd /home/work/apps/nginx
tree -L 2
# 返回的结果如下,在/home/work/apps/nginx目录下生成了4个目录, conf、html、logs、sbin
├── conf
│ ├── fastcgi.conf
│ ├── fastcgi.conf.default
│ ├── fastcgi_params
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types
│ ├── mime.types.default
│ ├── nginx.conf
│ ├── nginx.conf.default
│ ├── scgi_params
│ ├── scgi_params.default
│ ├── uwsgi_params
│ ├── uwsgi_params.default
│ └── win-utf
├── html
│ ├── 50x.html
│ └── index.html
├── logs
└── sbin
└── nginx
至此,nginx就安装完毕了,编译安装和通过yum等工具安装的位置可能不一样,按配置都是一样的。
5️⃣ 启动、停止、重新加载
编译安装的nginx目录是–prefix指定的,启动、停止、重新加载都需要在已安装的目录下进行:
## 启动
sudo /home/work/apps/nginx/sbin/nginx
## 从容停止: 会等待nginx进程完成当前工作后再停止
sudo /home/work/apps/nginx/sbin/nginx -s quit
## 立即停止: 会立即停止nginx进程,无论其是否在工作
sudo /home/work/apps/nginx/sbin/nginx -s stop
## 重新启动
sudo /home/work/apps/nginx/sbin/nginx -s reload
🍄 配置nginx支持https
所有网站建议标配支持HTTPS。网站支持HTTPS协议有以下好处:
✅ 数据安全性: HTTP协议在数据传输时没有对数据进行加密,这导致数据在传输过程中容易被不法分子盗用、劫持或篡改,经历过HTTP劫持的人都懂。
✅ 身份验证: HTTPS协议通过使用证书对服务器进行身份验证,确保客户端连接的是正确的服务器。这种验证机制可以有效防止中间人攻击,即攻击者冒充服务器与客户端进行通信,从而窃取或篡改数据。
✅ 提升用户信任度: HTTPS协议可以确保用户输入的信息在传输过程中得到保护,不会被第三方窃取或滥用。例如密码、信用卡号等敏感信息。
✅ 提升SEO权重: 网站支持HTTPS是影响搜索排名的一个很重要的因素。支持HTTPS和不支持HTTPS的网站搜索引擎权重相差很大。
开始配置Nginx支持https首先要确定Nginx已经安装了SSL模块。默认情况下,Nginx可能不会安装这个模块,需要手动进行配置和安装。
💥 步骤一:检查并安装SSL模块
## 通过nginx -V 注意这里V是大写
## 在centos下通过yum安装的nginx,是已经安装了http_ssl_module模块的。因为编译参数里有-with-http_ssl_module参数
nginx -V
💥 步骤二:配置SSL证书
配置https首先需要准备好SSL证书,通常是公钥和密钥,证书可在云厂商上买,也可使用免费证书,这里就不赘述。公钥和密钥通常放在/etc/pki/nginx目录下,这里的pki是(Public Key Infrastructure)的缩写。证书准备好之后,修改/etc/nginx/nginx.conf,可根据自己的需求进行修改。完整配置可以参考nginx.conf
## http协议默认端口是80
## 如果配置了SSL证书,就将80端口永久重定向到443端口上,这样访问80端口都将自动重定向到https协议。
server {
listen 80;
listen [::]:80;
return 301 https://$host$request_uri;
#rewrite ^/(.*)$ https://$host/$1 permanent;
}
server {
## https协议默认端口是443
listen 443 ssl http2;
listen [::]:443 ssl http2;
set $api_server "http://127.0.0.1:8080"; ## 这里是数据接口服务器
set $static_server "http://127.0.0.1:8081"; ## 这里是静态资源服务器
## 如果网站没有做自适应排版,构建了两套页面服务。可根据UserAgent配置不同的访问页面。
map $http_user_agent $target_server {
default "http://127.0.0.1:3000";
~*mobile "http://127.0.0.1:3001"; # 包含mobile的移动端
~*android "http://127.0.0.1:3001"; # 包含android的移动端
~*iphone "http://127.0.0.1:3001"; # 包含iphone的移动端
}
server_name allowed.example.com # 这个配置也很重要,域名改成自己的。
ssl_certificate "/etc/pki/nginx/server.pem"; # 公钥
ssl_certificate_key "/etc/pki/nginx/server.key"; # 密钥
location / {
proxy_pass $target_server; # 转发Next.js服务
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
## 数据和页面分离,需要将/api路由到api_server上
## 这里的api_server可以是Node.js、Golang、Next.js、Nest.js、JavaSpring等构建的。
location /api/ {
proxy_pass $api_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
## 这里可以配置static_server,
## 也可以配置本地目录
location /assets/ {
proxy_pass $static_server;
# root /home/work/app/nginx/assets/
}
}
💥 步骤三:开启防火墙
443端口配置好了以后,需要开启防火墙配置,常见的防火墙工具有iptables、ufw和firewalld。不同工具具有不同的配置方法。具体可以参考防火墙的文章。本文中介绍firewalld工具:
1️⃣ 查看当前防火墙已经开放的端口列表:
## 方法一:如果返回内容里没有443和80端口,就没开启
sudo firewall-cmd --zone=public --list-ports ## 例如返回: 8833/tcp 8833/udp,没开启
## 方法二: ## 返回yes是开启,返回no是没开启
sudo firewall-cmd --query-port=80/tcp
sudo firewall-cmd --query-port=443/tcp
2️⃣ 开启443和80端口防火墙
执行以下命令来添加允许80和443端口的规则
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
sudo firewall-cmd --zone=public --add-port=443/tcp --permanent
3️⃣ 重新加载防火墙配置
执行下列命令,使得防火墙配置更改生效
sudo firewall-cmd --reload
🥕 检查SELinux状态
如果上述都配置好了,结果通过ip + port访问,浏览器出现了报错:502 Bad Gateway nginx/1.20.1,查看日志文件/var/log/nginx/error.log
2024/09/27 16:49:40 [crit] 372718#372718: *5 connect() to 127.0.0.1:3000 failed (13: Permission denied) while connecting to upstream, client: 111.192.96.238, server: , request: "GET / HTTP/1.1", upstream: host:
这可能是SELinux状态引起的,可以通过getenforce查看状态并关闭SELinux
getenforce
## 返回 Enforcing
## 如果getenforing返回Enforcing,要关闭一下
setenforce 0
❤️🔥 本地配置访问
因为nginx模块SSL证书配置了server_name字段的域名限制访问,测试的时候必须通过域名访问, 要不然通不过HTTPS证书的验证,要通过HTTPS证书的限制需要更改hosts文件:
🧨 Windows系统更改方法:
## 管理员身份打开
C:\Windows\System32\drivers\etc\hosts
## 新增一行, 这里的ip地址是你的服务器地址:
x.x.x.x your_domain.com
🧨 Mac/Linux更改方法:
sudo vim /etc/hosts
## 新增一行
x.x.x.x your_domain.com
📱 联系方式
更多文章或咨询关注:微信公众号(pwfocus) | 项目合作和咨询加个人微信进群 |
---|---|