文章目录
Nginx 服务器
Nginx 介绍
-
Nginx 是一款高性能的开源 HTTP 和反向代理服务器,同时也具备 IMAP/POP3/SMTP 代理功能,能够选择高效的epoll、kqueue、eventport最为网络I/O模型
-
Nginx 核心优势:
-
高并发处理能力:Nginx 采用异步、非阻塞的事件驱动模型,能够高效处理大量并发连接。在同等硬件资源下,相比传统的 Apache 服务器,能支持更多的并发请求,甚至可轻松应对数万级别的并发连接
-
低资源消耗:在空闲状态下,Nginx 进程占用的内存非常少。即使在高并发场景下,CPU 和内存的使用率也能保持在较低水平
-
高可靠性:Nginx 采用主从进程架构,主进程负责管理配置加载、子进程监控等,工作进程负责处理实际的网络请求。当某个工作进程出现异常时,主进程会迅速启动新的工作进程来替代它,保证服务的持续稳定运行,极少出现宕机情况
-
模块化设计:Nginx 的核心功能模块设计简洁,同时支持丰富的第三方模块扩展。用户可以根据实际需求,通过加载不同的模块来实现 URL 重写、缓存、SSL 加密、负载均衡等功能,极大地增强了 Nginx 的灵活性和可扩展性
-
跨平台支持:Nginx 可以运行在多种操作系统上,包括 Linux、FreeBSD、Solaris、Windows 等,其中在 Linux 系统上的性能表现最佳,是大多数互联网企业的首选部署环境
-
-
Nginx 主要应用场景:
-
静态资源服务:高效处理 HTML、CSS、JS、图片、视频等静态文件,支持缓存策略和压缩传输,提升资源加载速度
-
反向代理:作为前端请求入口,将请求转发至后端业务服务器(如 Java Spring Boot、Python Django、Node.js 服务),隐藏后端服务细节,提高安全性
-
负载均衡:将高并发请求分发到多台后端服务器,实现流量分担,避免单点故障,提升系统整体可用性和吞吐量
-
HTTPS 终端:处理 SSL/TLS 加密解密,简化后端服务的安全配置,同时支持证书管理和安全协议优化
-
API 网关:实现 API 请求的路由、认证、限流、日志记录等功能,统一管理后端 API 服务
-
Nginx 配置文件
- 主配置文件:
/etc/nginx/nginx.conf
- 虚拟主机配置目录:
/etc/nginx/conf.d/
,目录下.conf
后缀文件会被主配置自动引入 - 默认静态页面目录:
/usr/share/nginx/html
- 日志目录:
/var/log/nginx/
安装 Nginx
安装nginx软件包
[root@server ~ 09:26:05]# yum install -y nginx
启动服务
[root@server ~ 09:26:21]# systemctl enable nginx --now
配置静态页面
[root@server ~ 11:13:04]# echo hello world > /etc/nginx/html/index.html
域名解析
# windows客户端修改 C:\Windows\System32\drivers\etc\hosts
# Linux或Unix修改 /etc/hosts
# 添加需要解析的域名
10.1.8.10 www.stj.cloud
[root@client ~ 11:29:42]# cat /etc/hosts
...
10.1.8.10 server.stj.cloud server www.stj.cloud
10.1.8.11 client.stj.cloud client
Nginx 虚拟主机设置
Nginx 虚拟主机允许在一台服务器上托管多个网站
基于域名的虚拟主机
复制配置文件模板到虚拟主机配置文件 vhost-name.conf
[root@server ~ 09:50:30]# cp /etc/nginx/nginx.conf /etc/nginx/conf.d/vhost-name.conf
修改 vhost-name.conf 虚拟主机配置文件
[root@server ~ 09:53:49]# vim /etc/nginx/conf.d/vhost-name.conf
[root@server ~ 16:56:46]# cat /etc/nginx/conf.d/vhost-name.conf
server {
server_name www1.stj.cloud;
root /usr/share/nginx/www1;
}
server {
server_name www2.stj.cloud;
root /usr/share/nginx/www2;
}
配置网页,并重启服务
[root@server ~ 09:38:14]# mkdir -p /usr/share/nginx/www{1,2}
[root@server ~ 09:49:11]# cp /usr/share/nginx/html/index.html /usr/share/nginx/www1
[root@server ~ 09:49:21]# cp /usr/share/nginx/html/index.html /usr/share/nginx/www2
[root@server ~ 09:50:10]# echo www1.stj.cloud > /usr/share/nginx/www1/index.html
[root@server ~ 09:50:31]# echo www2.stj.cloud > /usr/share/nginx/www2/index.html
[root@server ~ 10:02:24]# systemctl restart nginx
配置客户端域名解析
[root@client ~ 09:41:44]# vim /etc/hosts
[root@client ~ 11:29:42]# cat /etc/hosts
...
10.1.8.10 server.stj.cloud server www1.stj.cloud www2.stj.cloud www.stj.cloud
10.1.8.11 client.stj.cloud client
验证
[root@client ~ 10:02:51]# curl http://www1.stj.cloud
www1.stj.cloud
[root@client ~ 10:03:20]# curl http://www2.stj.cloud
www2.stj.cloud
基于端口的虚拟主机
复制配置文件模板到虚拟主机配置文件 vhost-port.conf
[root@server ~ 09:53:03]# cp /etc/nginx/nginx.conf /etc/nginx/conf.d/vhost-port.conf
修改 vhost-port.conf 虚拟主机配置文件
[root@server ~ 09:57:40]# vim /etc/nginx/conf.d/vhost-port.conf
[root@server ~ 17:16:42]# cat /etc/nginx/conf.d/vhost-port.conf
server {
listen 8081;
server_name www.stj/cloud;
root /usr/share/nginx/8081;
}
server {
listen 8082;
server_name www.stj/cloud;
root /usr/share/nginx/8082;
}
配置网页,并重启服务
[root@server ~ 10:03:46]# mkdir -p /usr/share/nginx/808{1,2}
[root@server ~ 10:07:49]# cp /usr/share/nginx/html/index.html /usr/share/nginx/8081
[root@server ~ 10:08:03]# cp /usr/share/nginx/html/index.html /usr/share/nginx/8082
[root@server ~ 10:10:17]# echo 8081 > /usr/share/nginx/8081/index.html
[root@server ~ 10:10:26]# echo 8082 > /usr/share/nginx/8082/index.html
[root@server ~ 10:10:36]# systemctl restart nginx
配置客户端域名解析
[root@client ~ 11:29:36]# vim /etc/hosts
[root@client ~ 11:29:42]# cat /etc/hosts
...
10.1.8.10 server.stj.cloud server www1.stj.cloud www2.stj.cloud www.stj.cloud
10.1.8.11 client.stj.cloud client
验证
[root@client ~ 10:10:44]# curl http://www.stj.cloud:8081
8081
[root@client ~ 10:10:56]# curl http://www.stj.cloud:8082
8082
配置SSL/TLS
生成证书
生成私钥 key
[root@server ~ 10:29:54]# openssl genrsa -out www.key 2048
生成请求文件 csr ,CN的值必须是网站域名
[root@server ~ 10:30:44]# openssl req -new -key www.key -out www.csr -subj "/C=CN/ST=JS/L=NJ/O=LM/OU=DEVOPS/CN=www.stj.cloud/emailAddress=stj@stj.cloud"
使用私钥对请求文件签名,以生成证书 crt
[root@server ~ 10:31:28]# openssl x509 -req -days 3650 -in www.csr -signkey www.key -out www.crt
验证生成
[root@server ~ 10:32:15]# ls
anaconda-ks.cfg inventory.sql mysql.tar.gz www.crt www.csr www.key
[root@server ~ 10:14:56]# mkdir /etc/ssl/certs/www.stj.cloud
[root@server ~ 10:32:18]# mv www* /etc/ssl/certs/www.stj.cloud
配置站点
配置SSL
[root@server ~ 10:55:33]# cp /etc/nginx/nginx.conf /etc/nginx/conf.d/vhost-www.stj.cloud-ssl.conf
[root@server ~ 10:56:23]# vim /etc/nginx/conf.d/vhost-www.stj.cloud-ssl.conf
[root@server ~ 17:35:02]# cat /etc/nginx/conf.d/vhost-www.stj.cloud-ssl.conf
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.stj.cloud;
root /usr/share/nginx/html;
# 证书
ssl_certificate "/etc/ssl/certs/www.stj.cloud/www.crt";
# 私钥
ssl_certificate_key "/etc/ssl/certs/www.stj.cloud/www.key";
}
}
# 配置 http 重定向到 https
server {
listen 80;
listen [::]:80;
server_name www.stj.cloud;
root /usr/share/nginx/html;
# 重定向
return 301 https://$host$request_uri;
}
重启服务,并验证
[root@server ~ 10:59:31]# systemctl restart nginx
[root@client ~ 11:01:17]# curl http://www.stj.cloud
[root@client ~ 11:01:26]# curl -k https://www.stj.cloud
Nginx 动态脚本
核心概念与架构
-
Nginx 处理动态内容的方式:
- Nginx 作为前端服务器,将动态请求转发给后端应用
- 不直接执行脚本,而是通过协议与后端通信
- 支持多种协议:FastCGI、uWSGI、SCGI、HTTP 反向代理等
-
处理流程:
- Nginx 接收请求
- 根据 location 匹配规则判断请求类型
- 静态文件直接返回
- 动态请求转发给相应后端处理
- 接收后端响应并返回给客户端
PHP 处理
安装 php 和 php-fpm
[root@server ~ 11:32:57]# yum install -y php php-fpm
查看 php 版本
[root@server ~ 11:33:27]# php -v
测试 php 是否正常
[root@server ~ 11:42:22]# echo "<?php echo 'PHP Test Page'.\"\n\"; ?>" > php_test.php
[root@server ~ 11:42:48]# php php_test.php
PHP Test Page
修改配置文件,并启用 php-fpm 服务
[root@server ~ 11:48:00]# vim /etc/nginx/conf.d/vhost-www.stj.cloud-ssl.conf
[root@server ~ 17:55:23]# cat /etc/nginx/conf.d/vhost-www.stj.cloud-ssl.conf
server {
listen 443 ssl http2;
......
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
......
[root@server ~ 11:53:55]# systemctl start php-fpm.service
设置测试页面,使用 phpinfo 查看详细信息
[root@server ~ 11:42:50]# echo "<?php phpinfo(); ?>" > /usr/share/nginx/html/info.php
重启服务,并测试
[root@server ~ 11:48:29]# systemctl restart nginx
[root@client ~ 11:29:48]# curl http://www.stj.cloud/info.php
反向代理
-
客户端访问代理服务器,代理服务器会将客户端请求发送给真实服务器
-
反向代理实现了隐藏内部服务器
角色说明
-
代理服务器: proxy 10.1.8.20
-
真实服务器: server 10.1.8.10
代理服务器配置
安装 nginx 软件包,并启用服务
[root@proxy ~ 16:02:36]# yum install -y nginx
[root@proxy ~ 16:02:44]# systemctl enable nginx --now
配置域名解析
[root@proxy ~ 16:02:57]# echo '10.1.8.10 www.stj.cloud' >> /etc/hosts
设置 proxy 代理服务器的配置文件
[root@proxy ~ 16:03:44]# cp /etc/nginx/nginx.conf /etc/nginx/conf.d/proxy.conf
[root@proxy ~ 16:07:46]# vim /etc/nginx/conf.d/proxy.conf
[root@proxy ~ 16:10:59]# cat /etc/nginx/conf.d/proxy.conf
server {
listen 80;
listen [::]:80;
server_name _;
root /usr/share/nginx/html;
#添加如下内容
#proxy_redirect off;
#proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header Host $http_host;
#新增 location 规则
location /proxy/ {
proxy_pass http://www.stj.cloud/;
}
}
重启服务,并验证
[root@proxy ~ 16:11:24]# systemctl restart nginx
[root@proxy ~ 16:24:56]# curl http://www.stj.cloud/proxy/