一、Nginx 是什么?为什么学习它?
Nginx 是一个高性能的 HTTP 和反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。
核心特点与优势:
-
高并发、高性能:采用事件驱动的异步非阻塞架构,用很少的资源就能处理大量并发连接。这是它最著名的优点。
-
反向代理与负载均衡:将客户端请求转发到后端的多个服务器,并实现负载分配。
-
静态内容服务:处理 HTML、CSS、JS、图片等静态文件的速度极快。
-
轻量级、低内存消耗:相比其他 Web 服务器(如 Apache),在同等负载下占用资源更少。
-
热部署:支持在不停止服务的情况下更新配置、升级版本。
应用场景:
-
静态内容托管:直接提供网站静态文件。
-
API 网关:作为微服务架构的入口。
-
负载均衡器:在多个应用服务器间分配流量。
-
SSL 终端:处理 HTTPS 的加解密,为后端服务器减负。
-
虚拟主机:在一台服务器上托管多个网站/域名。
二、核心概念
在学习配置之前,先理解这几个关键概念:
-
正向代理 vs. 反向代理
-
正向代理 :代理客户端。例如:VPN、科学上网工具。服务器不知道真实的客户端是谁。
-
反向代理 :代理服务器端。客户端不知道真实提供服务的后端服务器是谁。Nginx 主要扮演这个角色。
-
-
负载均衡
将流量分发到多个后端服务器,以提高应用的可扩展性、可靠性和性能。常见策略有:轮询、权重、IP哈希等。
-
动静分离
将动态请求(如 PHP、Python、Java 程序)和静态请求(如图片、CSS)分开处理。Nginx 处理静态文件,动态请求则转发给后端应用服务器(如 Tomcat, uWSGI, Gunicorn)。
三、快速上手:基本命令
root@localhost:~# /usr/local/nginx/sbin/nginx ##启动nginx服务
root@localhost:~# groupadd nginx ##创建nginx用户组
root@localhost:~# useradd -g nginx -s /sbin/nologin nginx ##创建nginx用户,并禁止登录
root@localhost:~# ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx ##设置nginx软连接
root@localhost:~# nginx ##再次启动nginx服务
root@localhost:~# nginx -V ##查看nginx版本及模块
root@localhost:~# netstat -nutlp | grep 80 ##过滤nginx服务端口
root@localhost:~# nginx -t #检测配置文件格式
root@localhost:~# nginx -s reload # nginx热加载配置文件
root@localhost:~# nginx -s stop # 停止nginx服务
root@localhost:~# nginx -V # 查看版本及模块信息
## 如果未执行2.4里的软连接命令,会提示命令不存在,需执行绝对路径 /usr/local/nginx/sbin/nginx
四、配置文件结构解析
events{
worker_connections 65535; # 设置每个Worker进程能够同时处理的最大连接数,提示nginx并发
}
##gzip压缩配置
gzip on; # 启用Gzip压缩
gzip_http_version 1.1; # 仅压缩HTTP/1.1及以上协议
gzip_min_length 1k; # 只压缩大于1KB的文件
gzip_buffers 4 16k; # 压缩缓冲区大小(4个16KB内存块)
gzip_comp_level 9; # 最高压缩级别(CPU消耗较高)
gzip_types text/plain [...] # 指定压缩的文件类型(覆盖了常见Web资源)
gzip_vary on; # 添加"Vary: Accept-Encoding"响应头
gzip_disable "MSIE [1-6]\."; # 禁用IE6及以下版本的Gzip(兼容性)
##代理配置
proxy_set_header Host $host; # 传递原始请求的Host头
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 代理链IP记录
proxy_set_header X-Forwarded-Proto $scheme; # 原始协议(http/https)
##跨域配置
add_header 'Access-Control-Allow-Origin' *; # 允许所有域跨域访问
add_header 'Access-Control-Allow-Credentials' 'true'; # 允许携带Cookie
add_header 'Access-Control-Allow-Methods' *; # 允许所有HTTP方法
add_header 'Access-Control-Allow-Headers' *; # 允许所有请求头
##前端页面配置
location / {
root /usr/local/nginx/html/test_kehu; # 静态文件根目录
index index.html index.htm; # 默认索引文件
try_files $uri $uri/ /index.html; # 前端路由支持(如Vue/React)
}
##前端路由histroy模式
location /mobile { # 独立移动端路径
alias /usr/local/nginx/html/test_mobile; # 注意:alias与root的区别
try_files $uri $uri/ /index.html;
}
##nginx状态监控页
location /nginx_status { # Nginx基础状态监控
stub_status; # 返回简版状态页
access_log off; # 不记录访问日志
allow 127.0.0.1; # 建议添加IP白名单限制!
deny all;
}
##SSL证书配置
ssl_certificate ../cert/test.cn.pem; # SSL证书路径(建议使用绝对路径)
ssl_certificate_key ../cert/test.key; # SSL私钥路径
ssl_session_timeout 5m; # SSL会话缓存超时时间
ssl_protocols TLSv1.2 TLSv1.3; # 仅允许安全协议(禁用TLSv1.0/1.1)
ssl_ciphers ECDHE+AESGCM:ECDHE+CHACHA20:...; # 现代加密套件
ssl_prefer_server_ciphers on; # 优先使用服务端加密配置
ssl_session_cache shared:SSL:10m; # SSL会话缓存(提升性能)
client_max_body_size 500M; # 允许上传大文件(如视频)
##80端口强制跳转443
add_header Strict-Transport-Security "max-age=31536000"; # 强制HTTPS(HSTS)
if ($server_port !~ 443){ # HTTP自动跳转HTTPS
rewrite ^(/.*)$ https://$host$1 permanent;
}
## 接口代理
location /oaapi/ { # 反向代理到后端Java服务
proxy_pass http://192.168.1.1:8080/; # 注意末尾斜杠(会去除/oaapi前缀)
}
# 静态文件缓存至用户浏览器
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires max;
log_not_found off;
}
## 永久重定向www到非www
if ($host = 'www.example.com') {
return 301 https://example.com$request_uri;
}
## 重定向旧域名到新域名
if ($host = 'old.example.com') {
return 301 https://example.com$request_uri;
}
# 重定向HTTP到HTTPS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # 强制HTTPS(HSTS)
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
## 加权轮询代理
upstream api {
server 192.168.0.1:8080 weight=2;
server 192.168.0.2:8080 weight=1;
}
五、nginx链接加密
windows版本
在git bash中运行
echo "admin:$(openssl passwd -apr1 123456)" >> D:/nginx/conf/.htpasswd
admin改为用户真实名字
-apr1后面改为真实密码
路径自行修改
在conf中nginx.conf修改
location /demo/ {
alias D:/demo/;
index index.html;
auth_basic "Restricted Access";
auth_basic_user_file D:/nginx-1.24.0/nginx-1.24.0/conf/.htpasswd;
}
ubuntu版本
admin改为用户真实名字
-apr1后面改为真实密码
路径自行修改
sudo bash -c 'echo "admin:$(openssl passwd -apr1 123456)" >> /usr/local/nginx/htpasswd'
location /yangyu{
alias /usr/local/nginx/html/yangyu;
index index.html index.htm;
try_files $uri $uri/ /index.html;
auth_basic "Restricted Access"; #添加这行
auth_basic_user_file /usr/local/nginx/htpasswd; #添加这行
}
六、外置文件
include /usr/local/nginx/conf/test/test.conf;
在目录中创建一个conf文件,路径由自己定