前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx 补充

Nginx 补充

作者头像
晚上没宵夜
发布2022-11-14 20:11:46
3890
发布2022-11-14 20:11:46
举报

有一段时间没更新笔记,主要是偷懒了,其次没有输入形不成输出

1.安装

安装 Nginx 还是挺简单的,练习时可以使用 Docker 部署简单快捷

代码语言:javascript
复制
# 安装依赖(大部分机器都有依赖了)
yum install -y gcc
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel


# 解压、安装
tar zxvf nginx-1.21.6.tar.gz
cd nginx-1.21.6
./configure --prefix=/usr/local/nginx  # --prefix是指安装路径
make
make install

# 启停命令
cd /usr/local/nginx/sbin

./nginx					    # 启动
./nginx -s stop			 	#快速停止
./nginx -s quit 			#优雅关闭,在退出前完成已经接受的连接请求
./nginx -s reload 			#重新加载配置


# 安装成系统服务,以后用 systemctl 启停
vi /usr/lib/systemd/system/nginx.service

[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target

# 重新加载系统服务
systemctl daemon-reload
# 启动
systemctl start nginx.service
# 开机启动
systemctl enable nginx.service

2. 多进程模型

  • /sbin/nginx 启动为主进程,读取并校验配置文件
  • 主进程 fork 多个子进程,读配置缓存后负责解析请求
  • reload 主进程杀死子进程,然后重 fork 进程,读取新的配置文件

多进程多线程

3. 最简配置文件

最简只需要配置 server 下的映射地址,让客户端能通过 Nginx 访问站点

代码语言:javascript
复制
# 业务子进程个数,配置cpu核数相关
worker_processes  1;

# 子进程的线程个数,不需要改
events {
    worker_connections  1024;
}

http {
	
	# 引入配置文件的地址,配置文件可分开配置
    include       mime.types;
    default_type  application/octet-stream;

	# 数据零拷贝
    sendfile        on;

	# 超时,后面两个方面讲
    keepalive_timeout  65;

	# 虚拟主机(vhost),可配多个站点,通过端口号不同区分
    server {
        listen       80;
        server_name  localhost;	# 域名,主机名

		# uri 匹配
        location / {
            root   html;	# 根目录配置在 html,是在这个目录下找文件
            index  index.html index.htm;	# 默认页
        }

		# 错误页配置(这些错误码会转向  /50x.html,通过 location 配置到 html 目录)
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

4. 虚拟主机

虚拟主机可让一台 Web 服务器代理多个站点

4.1 端口区分

代码语言:javascript
复制
# 虚拟主机1(vhost),可配多个站点,通过端口号不同区分
server {
	listen       80;
	server_name  localhost;

	# uri 匹配
	location / {
		root   /webapp/web1;
		index  index.html index.htm;
	}

	error_page   500 502 503 504  /50x.html;
	location = /50x.html {
		root   html;
	}
}

# 虚拟主机2(vhost)
server {
	listen       81;
	server_name  localhost;

	# uri 匹配
	location / {
		root   webapp/web2;
		index  index.html index.htm;
	}

	error_page   500 502 503 504  /50x.html;
	location = /50x.html {
		root   html;
	}
}

4.2 域名区分

本地配置hosts文件实现

代码语言:javascript
复制
# 虚拟主机1(vhost),可配多个站点
server {
	listen       80;
	server_name  www.web1.com;

	# uri 匹配
	location / {
		root   /webapp/web1;
		index  index.html index.htm;
	}

	error_page   500 502 503 504  /50x.html;
	location = /50x.html {
		root   html;
	}
}

# 虚拟主机2(vhost)
server {
	listen       80;
	server_name  www.web2.com;

	# uri 匹配
	location / {
		root   webapp/web2;
		index  index.html index.htm;
	}

	error_page   500 502 503 504  /50x.html;
	location = /50x.html {
		root   html;
	}
}

servername 的多种匹配方式

代码语言:javascript
复制
# 从前往后匹配 servername,匹配不上就找第一个

# 多域名、通配符、正则匹配
server {
	listen       80;
	server_name  www.web2.com www.web3.com;

	# uri 匹配
	location / {
		root   webapp/web2;
		index  index.html index.htm;
	}

	error_page   500 502 503 504  /50x.html;
	location = /50x.html {
		root   html;
	}
}

5. 反向代理

隧道式代理:举例 nginx,请求和响应都经过 nginx

DR 代理:举例 LVS,请求经过 LVS ,响应直接返回给用户,不用再走一次 LVS

代码语言:javascript
复制
http {

	# 群组
	upstream httpd {
        server 127.0.0.1:8080 weight=10 down;	# 不参与负载
        server 127.0.0.1:8081 weight=1;
        server 127.0.0.1:8082 weight=1 backup;	# 其他机器忙,则打入
	}
	
    server {
        listen       80;
        server_name  localhost;

        location / {
        
        	# 形式一:配地址
        	proxy_pass http://www.baidu.com
        	# 形式二:配群组
        	proxy_pass http://httpd
        	
            # 上下关系是二选一
            # root   html;
            # index  index.html index.htm;
        }
    }
}

地址栏是不变的

6. URLRewrite

可以影藏后端真实地址

代码语言:javascript
复制
http {

	upstream httpd {
        server 127.0.0.1:8080;
        server 127.0.0.1:8081;
     
	}
	
    server {
        listen       80;
        server_name  localhost;

        location / {
        	rewrite ^/user/list/([0-9]+).html$	/user/list?page=$1	break;
        	proxy_pass http://httpd
        }
    }
}

flag标记说明: last 本条规则匹配完成后,继续向下匹配新的location URI规则 break 本条规则匹配完成即终止,不再匹配后面的任何规则 redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址 permanent 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

7. 防盗链

代码语言:javascript
复制
http {
	
    server {
        listen       80;
        server_name  localhost;

        location / {
        
        	# 检测请求头的 referers 的地址是否包含
       		valid_referers 127.0.0.1;
            if ($invalid_referer) {
            	return 403;
            }
        	proxy_pass 127.0.0.1:8080
        }
    }
}

none:Referer 不存在的情况 blocked:Referer被防火墙或代理服务器删除或伪装(不以 http:// 或 https:// 开头) server_names:Referer 是否是多个 URL 中的某一个

8. 集群高可用

Keepalived 是安装在每台 Nginx 主机上的软件,能让虚拟 IP 在内网各机器间切换达到高可用,外界统一使用虚拟 IP 作为入口访问。

Keepalived 是监听各机器间自己的进程是否存在来选举,可以写定时脚本访问 Nginx ,若状态码不返回200则杀 Keepalived 进程来达到主备切换的目的

代码语言:javascript
复制
yum install -y keepalived

# 配置文件
vim /etc/keepalived/keepalived.conf

# 主、备只是 global_defs、state、priority不同
! Configuration File for keepalived
global_defs {
   router_id nginx-01 
}

vrrp_script check_nginx {
    script "/usr/local/src/nginx_check.sh"  # 脚本路径
    interval 3  							# 脚本执行间隔 3s
    weight 2  								# 若脚本检测结构为真,服务器权重 +2
}

vrrp_instance VI_1 {
    state MASTER   							# MASTER为主,BACKUP为备
    interface eth0  						# ip addr/ifconfig 可看网卡
    virtual_router_id 51  					# vrrp实例id 集群的实例id必须一致
    priority 100  							# 优先级
    advert_int 1  							# 心跳间隔,keepalived 集群的心跳检测
    authentication {
        auth_type PASS  					# 设置验证类型
        auth_pass 1111  					# 集群密码要设置一致
    }
    virtual_ipaddress {
        192.168.10.200 						# 虚拟IP,同网段没有使用的IP
    }
	 track_script {
		   check_nginx  					# 检测脚本名称
	 }
}

检测脚本

代码语言:javascript
复制
vim /usr/local/src/nginx_check.sh

#! /bin/bash
# -C列出 nginx 指令相关进程(master/worker process)
A=`ps -C nginx --no-header | wc -l`
if [ $A -eq 0 ];then
 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf # 启动 nginx 指定配置文件
 sleep 2														 # 睡眠 2 秒等待启动
 if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then
  systemctl stop keepalived.service 							 # 杀死 Keepalived 服务,将vip漂移到其它节点
 fi
fi

chmod 777 /usr/local/src/nginx_check.sh
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-10-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.安装
  • 2. 多进程模型
  • 3. 最简配置文件
  • 4. 虚拟主机
    • 4.1 端口区分
      • 4.2 域名区分
      • 5. 反向代理
      • 6. URLRewrite
      • 7. 防盗链
      • 8. 集群高可用
      相关产品与服务
      轻量应用服务器
      轻量应用服务器(TencentCloud Lighthouse)是新一代开箱即用、面向轻量应用场景的云服务器产品,助力中小企业和开发者便捷高效的在云端构建网站、Web应用、小程序/小游戏、游戏服、电商应用、云盘/图床和开发测试环境,相比普通云服务器更加简单易用且更贴近应用,以套餐形式整体售卖云资源并提供高带宽流量包,将热门开源软件打包实现一键构建应用,提供极简上云体验。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档