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文件,路径由自己定

相关推荐
XIAOHEZIcode15 小时前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220701 天前
如何搭建本地yum源(上)
运维
ping某2 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树884 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
通信小呆呆4 天前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
霸道流氓气质4 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
H__Rick4 天前
自动对焦学习-3
人工智能·学习·计算机视觉
Daisy Lee4 天前
量化学习-第1章-什么是量化金融
学习·金融·datawhale
Inhand陈工4 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信