本文以centos为例

nginx+nginxscript

源码安装nginx

安装必要环境

  1. 安装gcc环境
    sudo yum -y install gcc gcc-c++
  2. 安装 pcre,让nginx支持重写功能,代码如下:
    sudo yum -y install pcre pcre-devel
  3. 安装 zlib,zlib 库提供了很多压缩和解压缩的方式,nginx 使用 zlib 对 http 包内容进行 gzip 压缩,代码如下
    sudo yum -y install zlib zlib-devel
  4. 安装 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配置为系统服务并开机自启

配置系统服务+开启自启

  1. 在/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
  1. 添加完成后如果权限有问题需要进行权限设置
chmod 755 /usr/lib/systemd/system/nginx.service
  1. 使用命令
启动: 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)实现请求头验证或者分流的更多相关文章

  1. 【转】linux 编译安装nginx,配置自启动脚本

    linux 编译安装nginx,配置自启动脚本 本文章来给各位同学介绍一篇关于linux 编译安装nginx,配置自启动脚本教程,希望有需要了解的朋友可一起来学习学习哦. 在公司的suse服务器装ng ...

  2. linux 编译安装nginx,配置自启动脚本

    本文章来给各位同学介绍一篇关于linux 编译安装nginx,配置自启动脚本教程,希望有需要了解的朋友可一起来学习学习哦. 在公司的suse服务器装nginx,记录下安装过程: 参照这篇文章:Linu ...

  3. 【Nginx安装】CentOS7安装Nginx及配置

    [Nginx安装]CentOS7安装Nginx及配置 2018年03月05日 11:07:21 阅读数:7073 Nginx是一款轻量级的网页服务器.反向代理服务器.相较于Apache.lighttp ...

  4. CentOS 下 安装 nginx 执行配置命令 ./configure 报错

    CentOS 下 安装 nginx 执行配置命令 ./configure --prefix=/opt/nginx --sbin-path=/usr/bin/nginx 时提示以下错误: checkin ...

  5. 【Asp.net Core】在 Linux 子系统中安装 nginx 并配置反向代理

    上一篇鸟文中,老周已经介绍过在 Ubuntu 子系统中安装 dotnet-sdk 的方法,本文老周给大伙伴们说说安装 nginx 服务,并配置反向代理.同样,老周假设你从来没有用过 Linux,所以老 ...

  6. linux下安装nginx与配置

    linux系统为Centos 64位 第一步:从http://nginx.org/download/上下载相应的版本(或者wget http://nginx.org/download/nginx-1. ...

  7. CentOS7安装Nginx及配置

    Nginx是一款轻量级的网页服务器.反向代理服务器.相较于Apache.lighttpd具有占有内存少,稳定性高等优势.**它最常的用途是提供反向代理服务.** 安装   在Centos下,yum源不 ...

  8. mac 安装nginx,并配置nginx的运行环境

    1. 安装nginx // 查询有没有nginx brew search nginx //开始安装nignx brew install nginx 2. 检查nignx是否安装成功 nginx -V ...

  9. linux安装nginx并配置负载均衡

    linux上安装nginx比较简单: 前提是需要有gcc或者g++ 1.yum需要的依赖  yum -y install openssl openssl-devel 2.解压pcre库.zlib库   ...

  10. linux下安装nginx和配置

    1.系统:centos6.8 2.安装准备: 安装nginx前,我们首先要确保系统安装了g++.gcc.openssl-devel.pcre-devel和zlib-devel软件,可通过如图所示命令进 ...

随机推荐

  1. Centos镜像下载

    1.进入官网,并点击下图所示的红框(alternative downloads) 官网网址:https://www.centos.org/download/  2.在往下翻,可以看到如下图的历史版本, ...

  2. 剑指offer20题表示数值的字符串:这题实在是太优雅了

    目录 前言 一.憨憨初解 1.思路 2.代码 3.战绩 4.反思 二.看懂再解 1.思路 2.代码 3.C++版战绩 总结 前言 题目来源:https://leetcode.cn/problems/b ...

  3. python(27)反射机制

    1. 什么是反射? 它的核心本质其实就是基于字符串的事件驱动,通过字符串的形式去操作对象的属性或者方法 2. 反射的优点 一个概念被提出来,就是要明白它的优点有哪些,这样我们才能知道为什么要使用反射. ...

  4. js高级之函数高级部分

    基于尚硅谷的尚硅谷JavaScript高级教程提供笔记撰写,加入一些个人理解 github源码 博客下载 原型与原型链 prototype : 显式原型属性,它默认指向一个Object空对象(即称为: ...

  5. 2022春每日一题:Day 11

    题目:高斯消元法 高斯消元法是一个模板,下面简单介绍其内容以及实现方法. 高斯消元是求一个求多元一次方程组的解的算法. 就是形式如下的关于x1,x2...xn的方程组的解. a11x1 + a12x2 ...

  6. centos7 uwsgi 加入系统服务

    生产环境中采用nginx + uwsgi + django 来部署web服务,这里需要实现uwsgi的启动和停止,简单的处理方式可以直接在命令行中启动和kill掉uwsgi服务,但为了更安全.方便的管 ...

  7. SqlServer 联合Update

    --1.创建一个备份表: select * into Users_Bak from Users --2.依据某个表进行更新: update Users_Bak set Users_Bak.Mobile ...

  8. 一文教会你如何在内网搭建一套属于自己小组的在线 API 文档?

    Hello,大家好,我是阿粉,对接文档是每个开发人员不可避免都要写的,友好的文档可以大大的提升工作效率. 阿粉最近将项目的文档基于 Gitbook 和 Gitlab 的 Webhook 功能的在内网部 ...

  9. JavaEE Day04 MySQL多表&事务

    今日内容 多表查询 事务 DCL用于控制权限和管理用户,DBA完成:SQL中四类DDL  DML  DQL  DCL 一.多表查询 1.多表查询_概述 1.1 查询语法     select      ...

  10. 【Java SE进阶】Day03 数据结构、List、Set、Collections

    一.数据结构 1.红黑树 根黑子黑红子黑 接近平衡树(左右孩子数量相同),查询叶子快慢次数不超过2倍 二.List 1.概述 元素有序 线性存储 带有索引 可以重复 2.常用方法 增:add(I,E) ...