Skip to content

Nginx

Nginx是一款高性能HTTP服务器软件,具有优秀的高并发处理能力,同时支持反向代理及负载均衡等能力

js
默认路径
执行脚本: /usr/share/nginx 
配置文件:/etc/nginx/nginx.conf 
日志文件:/var/log/nginx/access.log
错误日志:/var/log/nginx/error.log

查看本机地址命令是: ifconfig 查看端口占用情况: sudo netstat -tupln | grep 端口号 ,HTTP 默认端口为 80 杀死某个进程 : sudo kill -9 xx进程号

Nginx 常用命令及参数:

  • nginx -t 测试配置是否正确,配置文件修改后先操作验证,在进行后续操作。
  • nginx -s reload 加载最新配置,等待全部子进程结束,然后开辟新的子进程使用新的配置。
  • nginx -s reopen 重新打开日志,重命名 access.log 日志文件,并重新创建新 access.log 文件,再次访问查看变化。
  • nginx -s quit 优雅停止,等待全部子进程处理完毕,不再开启新的子进程。
  • nginx -s stop 立即停止,不等待子进程处理,立即停止所有子进程及主进程

配置项相关

nginx
Main  #全局配置区,Nginx 核心功能配置
events{ # events 事件区,子进程核心配置
	
}
http { # http 服务器配置区
  
  server { # 不同服务配置区
    	location { # location 不同请求路径配置区
    		
    	}
  }
		
}
mail{ # 邮件代理配置区
  server{ # 邮件服务配置区
  	
  }
}

默认配置解析

读nginx配置文件内容,过滤掉注释后的内容: egrep -v "#|^$" nginx.conf

nginx
user www-data;	#使用那个用户角色运行 Nginx
worker_processes auto;	#允许开启的 worker 数量,通常设置成和cpu的数量相等
pid /run/nginx.pid;	 # pid 路径
include /etc/nginx/modules-enabled/*.conf;  #引入其他配置项 
events {	# 事件区
    # 每个 work 进程支持的最大链接数,理论值 65535 每个进程的最大句柄数 
    worker_connections 1024; 
    # 2字节==16位,
}
http { # http 区
    #sendfile 指定 nginx 调用 sendfile 函数(zero copy 方式)来输出文件,
    #配合 tcp_nopush 与 tcp_nodelay 完成数据的快速响应
    sendfile on; 
    tcp_nopush on; # 数据包会累积后一起传输,可以提高传输效率。
    tcp_nodelay on; #小的数据包不等待直接传输
    #  tcp_nopush 与 tcp_nodelay 互斥,Nginx 会借助sendfile 进行平衡处理

    # 持久链接打开的超时时长
    keepalive_timeout 65;
    
    # 散列表的冲突率,越大,消耗内存越多,冲突率越低,检索速度就更快
    types_hash_max_size 2048;
    # mime 类型列表
    include /etc/nginx/mime.types; 
    # 默认 mime 类型 流
    default_type application/octet-stream;
    # 协商ssl加密算法时,优先使用服务端的加密套件
    ssl_prefer_server_ciphers on;
    # [错误]日志存储路径
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    # 开启 gzip 协议压缩,减少数据传输量
    gzip on;
    # 引入其他配置文件
    include /etc/nginx/conf.d/*.conf;

    server { #server区 
      # 设置系统监听端口 
      listen 80 default_server;
      listen [::]:80 default_server; 
      # 定义服务器访问默认根路径
      root /var/www/html;
      # 定义首页索引文件的名称
      index index.html index.htm index.nginx-debian.html;
      # 定义访问域名
      server_name _;
      # location 区域,相当于路由判断
      location / {
              try_files $uri $uri/ =404;
      }
		}
}

反向代理

反向代理就是外部客户端通过网关访问内网服务器上的内容,网关起到了反向代理的功能,内网服务器不对外提供服务,一般由防火墙设立拦截,对外暴露网关端口

  • 反向代理,代理的是服务器,帮助服务器处理请求响应给客户端,隐藏真实服务器响应。
  • 正向代理,代理的是客户端,帮助客户端获取目标服务器的数据,隐藏真实客户端请求。

配置两台服务器: 一台专门用来做业务逻辑响应,设置端口 3000 。 一台专门用于处理图片资源响应,设置端口 3001 。

业务逻辑响应代码

js
// node-server.js
var http = require('http')
var server = http.createServer()
server.listen(3000)
server.on('request',(req,res)=>{
    if(req.url == '/'){
        res.end('node-server')
    }else{
        res.end('heihei')
    }
})

图片资源响应代码

js
// 图片资源响应 3001 
var http = require('http')
var fs = require('fs')
var server = http.createServer()
server.listen(3001)
server.on('request',(req,res)=>{
    fs.readFile('./'+req.url,(err,data)=>{
        if(err){
            res.end('没有这个文件')
        }else{
            res.end(data)
        }
    })
})

启动上面两台服务器后,对 Nginx 的配置文件进行修改,具体的 server 配置项是 /etc/nginx/sites-available/default 文件

js
location / {
  # First attempt to serve request as file, then
  # as directory, then fall back to displaying a 404.
  # try_files $uri $uri/ =404;
  proxy_pass HTTP://127.0.0.1:3000;
}

location ~ \.(jpg|png)$ {
  proxy_pass HTTP://127.0.0.1:3001;
}

通过命令 nginx -s reload 重新加载配置文件后,就可以访问不同的内容了,由 Nginx 代理到不同的内部服务器,提供不同的资源响应;

负载均衡

内网服务器因为要处理大量的业务逻辑,因此,内网单台服务器的响应能力非常有限,为了提供更加快速的响应,一般会在内网架设多台业务逻辑处理器,当某一台正在工作时,可以由其他正在闲置的服务器来处理请求响应; 后端多台相同的业务逻辑服务器,被称为服务器集群;而当请求到来时,到底由那台服务器进行处理,取决于代理转向那台服务器,这项能力,就叫负载均衡;

nginx
upstream 自定义连接池名称 {
   server ip:prot weight=权重值,越大越重   max_fails=失败次数  fail_timeout=超时时间
}

server{
	location ~ \.(jpg|png)$ {
      			# 反向代理到负载链接池
            proxy_pass HTTP://自定义连接池名称;
    }
}

例如:

nginx
upstream img_server {
  server 127.0.0.1:3001 weight=2 max_fails=2 fail_timeout=30s;
  server 127.0.0.1:3002 weight=1 max_fails=2 fail_timeout=30s;
  server 127.0.0.1:3003 weight=2 max_fails=2 fail_timeout=30s;
}
location /img {
  proxy_pass http://img_server;
}

https

  1. 获取 SSL 证书和密钥:首先,确保你已经获得有效的 SSL 证书和私钥文件。证书通常由证书颁发机构(CA)提供,可以是自签名证书或购买的证书。确保将证书文件(通常以 .crt 或 .pem 结尾)和私钥文件(通常以 .key 结尾)保存在安全的位置。
  2. 编辑 Nginx 配置文件:打开 Nginx 的配置文件,通常位于 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/default.conf。
nginx
server {
    listen 443 ssl;
    server_name example.com;
    
    ssl_certificate /path/certificate.crt;
    ssl_certificate_key /path/private.key;
    
    location / {
        # 其他配置指令
    }
}

将http自动重定向到https配置

nginx
server {
    listen 80;
    server_name example.com;
    
    return 301 https://$host$request_uri;
}

其他

本机连接远程服务器 ssh 用户名@域名/ip地址

读nginx配置文件内容,过滤掉注释后的内容: egrep -v "#|^$" nginx.conf

worker_connections 子进程最大连接数,根据服务器的配置可自行设置,一般65535

Released under the MIT License.