Nginx学习

一、Nginx 是什么?为什么学习它?

Nginx 是一个高性能的 HTTP 和反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。

核心特点与优势:

  1. 高并发、高性能:采用事件驱动的异步非阻塞架构,用很少的资源就能处理大量并发连接。这是它最著名的优点。

  2. 反向代理与负载均衡:将客户端请求转发到后端的多个服务器,并实现负载分配。

  3. 静态内容服务:处理 HTML、CSS、JS、图片等静态文件的速度极快。

  4. 轻量级、低内存消耗:相比其他 Web 服务器(如 Apache),在同等负载下占用资源更少。

  5. 热部署:支持在不停止服务的情况下更新配置、升级版本。

应用场景:

  • 静态内容托管:直接提供网站静态文件。

  • API 网关:作为微服务架构的入口。

  • 负载均衡器:在多个应用服务器间分配流量。

  • SSL 终端:处理 HTTPS 的加解密,为后端服务器减负。

  • 虚拟主机:在一台服务器上托管多个网站/域名。


二、核心概念

在学习配置之前,先理解这几个关键概念:

  1. 正向代理 vs. 反向代理

    • 正向代理 :代理客户端。例如:VPN、科学上网工具。服务器不知道真实的客户端是谁。

    • 反向代理 :代理服务器端。客户端不知道真实提供服务的后端服务器是谁。Nginx 主要扮演这个角色。

  2. 负载均衡

    将流量分发到多个后端服务器,以提高应用的可扩展性、可靠性和性能。常见策略有:轮询、权重、IP哈希等。

  3. 动静分离

    将动态请求(如 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文件,路径由自己定

相关推荐
秋邱39 分钟前
价值升维!公益赋能 + 绿色技术 + 终身学习,构建可持续教育 AI 生态
网络·数据库·人工智能·redis·python·学习·docker
Three~stone44 分钟前
Matlab2025b的安装教程(附安装包和密钥破解文件)
学习·mysql·持续部署
爱学习的大牛1231 小时前
如何系统学习网络渗透测试:从入门到精通的完整指南
网络·学习
ManThink Technology1 小时前
LoRaWAN网关:连接私有服务器是“可行”还是“明智”?
运维·服务器
落子摘星2 小时前
suricata学习杂记(一)
学习·modbus·suricata·pdu
J***Q2922 小时前
DevOps金融服务安全要求
运维·安全·devops
charlie1145141912 小时前
深入理解C/C++的编译链接技术6——A2:动态库设计基础之ABI设计接口
c语言·开发语言·c++·学习·动态库·函数
white-persist2 小时前
【攻防世界】reverse | Reversing-x64Elf-100 详细题解 WP
c语言·开发语言·网络·python·学习·安全·php
Dovis(誓平步青云)2 小时前
《内核视角下的 Linux 锁与普通生产消费模型:同步原语设计与性能优化思路》
linux·运维·性能优化