安装nginx并配置nginxscript(njs)实现请求头验证或者分流
本文以centos为例
nginx+nginxscript
源码安装nginx
安装必要环境
- 安装gcc环境
sudo yum -y install gcc gcc-c++
- 安装 pcre,让nginx支持重写功能,代码如下:
sudo yum -y install pcre pcre-devel
- 安装 zlib,zlib 库提供了很多压缩和解压缩的方式,nginx 使用 zlib 对 http 包内容进行 gzip 压缩,代码如下
sudo yum -y install zlib zlib-devel
- 安装 openssl,安全套接字层密码库,用于通信加密,代码如下:
sudo yum -y install openssl openssl-devel
解压Nginx安装包并进行安装
下载源码
#下载
wget http://nginx.org/download/nginx-1.16.1.tar.gz
#解压 nginx版本过新可能无法安装
tar -xzf nginx-1.16.1.tar.gz
cd nginx-1.16.1
编译安装
./configure --prefix=/usr/local/nginx --prefix=后面为安装Nginx安装目录,我这里是的安装目录是/usr/local/nginx
1. make ##编译
2. make install ##安装
源码安装nginxscript
克隆源码
hg clone http://hg.nginx.org/njs
从nginx根目录编译并安装njs
./configure --prefix=/usr/local/nginx --add-dynamic-module=/usr/local/nginx/njs/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module ## njs源码目录
# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module
make install ##重新安装nginx
将nginx配置为系统服务并开机自启
配置系统服务+开启自启
- 在/usr/lib/systemd/system目录下添加nginx.service,内容如下:
vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx web service
Documentation=http://nginx.org/en/docs/
After=network.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
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=default.target
- 添加完成后如果权限有问题需要进行权限设置
chmod 755 /usr/lib/systemd/system/nginx.service
- 使用命令
启动: systemctl start nginx
停止: systemctl stop nginx
重启: systemctl restart nginx
重新加载配置文件: systemctl reload nginx
查看nginx状态: systemctl status nginx
开机启动: systemctl enable nginx
enjoy yourself
使用njs实现请求头参数控制
由于这是加载的动态模块所以需要在根下面引入
# 加载njs模块
load_module modules/ngx_http_js_module.so;
在配置文件中(http下面)导入js文件
js_import dreamer from dreamer_header_check.js;
根conf示例
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
# 加载njs模块
load_module modules/ngx_http_js_module.so;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
# 引入js
js_import dreamer from dreamer_header_check.js;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /opt/conf/nginx/conf/conf.d/*.conf;
}
在具体的配置文件中使用
server {
listen 80;
server_name admin.hnzmr.com;
location /admin {
alias /data/dreamer/admin/dist;
index index.html index.htm;
}
location /prod-api/ { ## njs层代理
js_content dreamer.headers_filter;
}
location @admin-backend { ## @真实的代理服务
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://adminapi.hnzmr.com;
}
}
js文件
// 获取header里面的参数
// 认证参数 token
const authorization ='authorization';
// APP ID(程序唯一标识)
const appId='appId';
// 设备类型 android ios wx h5 web
const os='os';
// 应用版本号
const version='version';
function headers_filter(r){
r.headersOut['Content-Type'] = "application/json; charset=utf-8";
// 定义要校验的数组
var arr = [appId,os,version];
// 循环数组判断有没有缺少参数
for(var i=0;i<arr.length;i++){
if(!r.headersIn[arr[i]]){
var json={
code:400,
msg:"请求头校验不通过,缺少'"+arr[i]+"'参数"
};
r . return ( 400 , JSON.stringify(json) ) ;
return;
}
}
// 传递下去
/* r.subrequest(r.uri).then((response) => {
r.headersOut["Content-Type"] = "application/json;charset=UTF-8";
r.return(response.status, JSON.stringify(response));
}); */
r.internalRedirect('@admin-backend');
}
function dreamer_headers_filter(r){
r.headersOut['Content-Type'] = "application/json; charset=utf-8";
// 定义要校验的数组
var arr = [appId,os,version];
// 循环数组判断有没有缺少参数
for(var i=0;i<arr.length;i++){
if(!r.headersIn[arr[i]]){
var json={
code:400,
msg:"请求头校验不通过,缺少'"+arr[i]+"'参数"
};
r . return ( 400 , JSON.stringify(json) ) ;
return;
}
}
// 传递下去
/* r.subrequest(r.uri).then((response) => {
r.headersOut["Content-Type"] = "application/json;charset=UTF-8";
r.return(response.status, JSON.stringify(response));
}); */
r.internalRedirect('@dreamer-backend');
}
export default {headers_filter,dreamer_headers_filter};
安装nginx并配置nginxscript(njs)实现请求头验证或者分流的更多相关文章
- 【转】linux 编译安装nginx,配置自启动脚本
linux 编译安装nginx,配置自启动脚本 本文章来给各位同学介绍一篇关于linux 编译安装nginx,配置自启动脚本教程,希望有需要了解的朋友可一起来学习学习哦. 在公司的suse服务器装ng ...
- linux 编译安装nginx,配置自启动脚本
本文章来给各位同学介绍一篇关于linux 编译安装nginx,配置自启动脚本教程,希望有需要了解的朋友可一起来学习学习哦. 在公司的suse服务器装nginx,记录下安装过程: 参照这篇文章:Linu ...
- 【Nginx安装】CentOS7安装Nginx及配置
[Nginx安装]CentOS7安装Nginx及配置 2018年03月05日 11:07:21 阅读数:7073 Nginx是一款轻量级的网页服务器.反向代理服务器.相较于Apache.lighttp ...
- CentOS 下 安装 nginx 执行配置命令 ./configure 报错
CentOS 下 安装 nginx 执行配置命令 ./configure --prefix=/opt/nginx --sbin-path=/usr/bin/nginx 时提示以下错误: checkin ...
- 【Asp.net Core】在 Linux 子系统中安装 nginx 并配置反向代理
上一篇鸟文中,老周已经介绍过在 Ubuntu 子系统中安装 dotnet-sdk 的方法,本文老周给大伙伴们说说安装 nginx 服务,并配置反向代理.同样,老周假设你从来没有用过 Linux,所以老 ...
- linux下安装nginx与配置
linux系统为Centos 64位 第一步:从http://nginx.org/download/上下载相应的版本(或者wget http://nginx.org/download/nginx-1. ...
- CentOS7安装Nginx及配置
Nginx是一款轻量级的网页服务器.反向代理服务器.相较于Apache.lighttpd具有占有内存少,稳定性高等优势.**它最常的用途是提供反向代理服务.** 安装 在Centos下,yum源不 ...
- mac 安装nginx,并配置nginx的运行环境
1. 安装nginx // 查询有没有nginx brew search nginx //开始安装nignx brew install nginx 2. 检查nignx是否安装成功 nginx -V ...
- linux安装nginx并配置负载均衡
linux上安装nginx比较简单: 前提是需要有gcc或者g++ 1.yum需要的依赖 yum -y install openssl openssl-devel 2.解压pcre库.zlib库 ...
- linux下安装nginx和配置
1.系统:centos6.8 2.安装准备: 安装nginx前,我们首先要确保系统安装了g++.gcc.openssl-devel.pcre-devel和zlib-devel软件,可通过如图所示命令进 ...
随机推荐
- vue使用elementUI组件提交表单(带图片)到node后台
1.方法一(图片与表单分开,请求2次) 1.1 前台代码 // elementUI表单 <el-form ref="form" class="forms" ...
- netty系列之:来,手把手教你使用netty搭建一个DNS tcp服务器
目录 简介 搭建netty服务器 DNS服务器的消息处理 DNS客户端消息请求 总结 简介 在前面的文章中,我们提到了使用netty构建tcp和udp的客户端向已经公布的DNS服务器进行域名请求服务. ...
- C#和Open eVision Studio图像库联合编程-读取图像
OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "Image Files (*.t ...
- 27、求解n阶多项式的值,多项式公式如下
/* 求解n阶多项式的值,多项式公式如下: Pn(x) = 1 n=0; = x n = 1; = (2n - 1)xPn-1(x) - (n - 1)Pn-2(x) n>=2 */ #incl ...
- 我的第一个项目(二):使用Vue做一个登录注册界面
好家伙, 顶不住了,太多的bug, 本来是想把背景用canvas做成动态的,但是,出现了各种问题 为了不耽误进度,我们先把一个简单的登录注册界面做出来 来看看效果: (看上去还不错) 本界面使用 ...
- React实用插件收集
1.react-img-editor 图片编辑 demo: npm install react-img-editor -S 引入和使用 import ReactImgEditor from 'reac ...
- uniapp 实现小程序中自定义tabBar 的方法
uniapp 实现小程序中自定义tabBar 的方法 第一种方式: page.json中配置 "tabBar": { "color": "#7A7E8 ...
- 【GUI开发案例】用python爬百度搜索结果,并开发成exe桌面软件!
一.背景介绍 你好,我是 @马哥python说 ,一名10年程序猿. 1.1 老版本 之前我开发过一个百度搜索的python爬虫代码,具体如下: [python爬虫案例]用python爬取百度的搜索结 ...
- 写一个frida通杀脚本
1. 前言 过年对我来说和平常没什么区别,该干什么干什么. 之前没接触过 frida 这个工具,前几天用了一些时间学习了一下,相比于 xposed hook 框架,frida 相对于调试方面真的很方便 ...
- Linux 基础-新手必备命令
Linux 基础-新手必备命令 概述 常见执行 Linux 命令的格式是这样的: 命令名称 [命令参数] [命令对象] 注意,命令名称.命令参数.命令对象之间请用空格键分隔. 命令对象一般是指要处理的 ...