ubuntu 24手动编译nginx源码及添加对ip地址过滤的支持

本文参考了csdn这位博主的文章并修改整理:

https://blog.csdn.net/qq_32262243/article/details/133951973

还是腾讯云ubuntu 24系统,我这里并没有手动下载pcre等源码,直接用ubuntu自带的就可以了,也不需要手动编译openssl等。

一、软件准备

1.1 nginx源码

  这里使用最新的稳定版本1.26.1的源码,下载地址:

https://nginx.org/download/nginx-1.26.1.tar.gz

1.2 geoip2模块源码

Releases · leev/ngx_http_geoip2_module · GitHub

  这个源码是配合nginx源码在做静态编译的时候添加对IP地址过滤支持用的。

1.3 libmaxmindb库

https://github.com/maxmind/libmaxminddb/releases

1.4 IP地址库

https://www.maxmind.com/en/home

注册然后登录,下载country库和city库备用

二、环境准备

   ubuntu 24系统做以下准备

sudo apt-get install build-essential zlib1g-dev libssl-dev libpcre2-dev libmaxminddb-dev libmaxminddb0 mmdb-bin vim 

三、编译安装

  解压缩第一步下载的4个压缩包,解压缩命令是tar -zxvf 压缩包名称,我这里数据盘挂载路径是/data,所以在解压缩以后我把这四个压缩包解压结果移动到了我的/data里面备用,其中geoip2模块的路径是/data/software/nginx/ngx_http_geoip2_module-3.4/,以下先编译安装libmaxmindb

cd /data/libmaxminddb-1.10.0
./configure
make
make install
ldconfig

  然后开始编译nginx

cd /data/nginx-1.26.1
./configure --with-http_realip_module --with-http_sub_module --with-http_gzip_static_module --with-http_stub_status_module --with-http_ssl_module  --with-http_v2_module --with-stream --add-module=/data/software/nginx/ngx_http_geoip2_module-3.4/
make
make install

 这就编译安装成功了,以下开始配置nginx

mkdir -p /data/nginx/logs
mkdir -p /usr/local/nginx/conf/v_host/
mkdir -p /usr/local/nginx/cache

  四、配置nginx

  修改/usr/local/nginx/conf/nginx.conf文件,增加对IP地址过滤的支持


#user  nobody;
worker_processes  auto;error_log   /data/nginx/logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;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  /data/nginx/logs/access.log  main;sendfile        on;#tcp_nopush     on;   keepalive_timeout  65;gzip  on;# 配置国家IP库geoip2 /data/GeoLite2-Country/GeoLite2-Country.mmdb{auto_reload 20m;$geoip2_metadate_country_build metadata build_epoch;#$geoip2_data_country_code country iso_code;$geoip2_country_name country names en;$geoip2_data_country_code default=US country iso_code;}# 配置城市IP库geoip2 /data/GeoLite2-City/GeoLite2-City.mmdb {auto_reload 20m;$geoip2_data_city_name city names en;$geoip2_data_province_name subdivisions 0 names en;$geoip2_data_province_isocode subdivisions 0 iso_code;$geoip2_continent_code continent code;}#配置规则,默认不允许所有IP访问,只允许中国IP访问map $geoip2_data_country_code $allowed_country {default no;CN yes;}# 引用v_host中的指定conf配置文件include /usr/local/nginx/conf/v_host/*.conf;}

  在/usr/local/nginx/conf/v_host里面新增自己站点的.conf文件,如xxx.com.conf文件并配置里面的内容:

server {listen   443   ssl;server_name  xxxx.com;ssl_certificate /data/nginx/xxxxxxx.crt;ssl_certificate_key /data/nginx/xxxxxxxxx.key;ssl_session_timeout 5m;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_prefer_server_ciphers on;ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";ssl_ecdh_curve secp384r1;ssl_session_cache shared:SSL:10m;ssl_stapling on;ssl_stapling_verify on;client_max_body_size 50M;# 添加客户端的IP头add_header client-country $geoip2_data_country_code;    # 做判断,如果国家不是中国,就返回451状态码给客户端;if ($geoip2_data_country_code != CN ) {return 451;}# 做判断,如果匹配到默认不允许的规则,就返回452状态码给客户端;   if ($geoip2_data_country_code = no ) {return 452;}location / {if ($allowed_country = no) {return 403;}#你的正常配置}
}

 最后,写一个nginx的systemd服务文件,将nginx配置为systemd 服务程序

vim /etc/systemd/system/nginx.service

[Unit]
Description=NGINX HTTP and reverse proxy server
After=syslog.target network.target nss-lookup.target[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/bin/kill -s HUP $MAINPID
ExecStop=/usr/bin/kill -s QUIT $MAINPID
# Hardening
#InaccessiblePaths=/etc/gnupg /etc/shadow /etc/ssh
#ProtectSystem=full
#ProtectKernelTunables=yes
#ProtectControlGroups=yes
#SystemCallFilter=~@clock @cpu-emulation @debug @keyring @module @mount @obsolete @raw-io
#MemoryDenyWriteExecute=yes
#RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
#RestrictRealtime=yes[Install]
WantedBy=multi-user.target

systemctl enable nginx 就可以了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/868256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL—统计函数和数学函数以及GROUP BY配合HAVING

合计/统计函数 count -- 演示 mysql 的统计函数的使用 -- 统计一个班级共有多少学生? SELECT COUNT(*) FROM student -- 统计数学成绩大于 90 的学生有多少个? SELECT COUNT(*) FROM student WHERE math > 90 -- 统计总分大于 250 的人数有多少&…

【SpringCloud应用框架】Nacos命名空间、分组和DataID三者关系

第五章 Spring Cloud Alibaba Nacos之命名空间、分组和DataID三者关系 文章目录 一、名词解释三者关系 二、切换不同环境DataID方案Group方案Namespace空间方案 一、名词解释 命名空间(Namespace) ​用于进行租户粒度的配置隔离。不同的命名空间下&…

GraphRAG

什么是RAG? RAG 是一种自然语言查询方法,用于通过外部知识增强现有的LLM,因此如果问题需要特定知识,问题的答案会更相关。它包括一个检索信息组件,用于从外部源获取附加信息,也称为“基础上下文”&#xf…

pnpm介绍

PNPM 是一个 JavaScript 包管理器,类似于 npm 和 Yarn。它的全称是 "Performant npm",主要设计目标是优化包的安装和管理过程,以提升速度和效率。PNPM 的主要特点包括: 符号链接(Symlink)&#x…

rocketmq 顺序消息原理与实战

消费者pull和push pull 为主动从broker获取消息 Push为broker主动推送消息个consumer 实时性更高,但流量要自己控制 PullBatchSize,代表的是每次从broker的一个队列上拉取的最大消息数。 consumeThreadMax 和 consumeThreadMin 代表消费者pull消息时需要…

AI产品经理发展与规划

今天引用高飞老师的讲课内容,分享一下,何为AI产品经理?这个话题不仅仅希望介绍AI产品经理的工作方式等方面的内容,更多的在于讨论未来产品经理这个行业应该如何发展?行业壁垒在何处?如何应对中年危机&#…

嵌入式驱动源代码(8):IO 模拟 SPI

目录 1、SPI初始化函数 2、SPI写函数 3、SPI写字节 4、spi读字节 5、spi写字节 SPI是一种通用的通信方式,很多时候为了节省成本,选择的主控制器资源不足。 这个时候外设需要用到SPI,就只能通过io模拟的方式来实现了。 1、SPI初始化函数 /*****************************…

Flume工具详解

Flume是一个由Apache提供的开源日志收集系统,最初由Cloudera贡献。它以其高可用性、高可靠性和分布式特性而著称,被广泛应用于海量日志的采集、聚合和传输。以下是对Flume工具的详细解析: 一、概述 功能定位:Flume主要用于收集、…

名企面试必问30题(二十六)——毕业这么久了,为什么还没有找到工作?

回答一: “毕业后的这段时间,我一直在努力寻找最适合自己发展的岗位。我没有急于随便接受一份工作,而是希望能够进入一个与我的专业技能和职业规划高度匹配的公司。在这个过程中,我不断提升自己的技术能力,学习新的测…

PyQT: 开发一款ROI绘制小程序

在一些基于图像或者视频流的应用中,比如电子围栏/客流统计等,我们需要手动绘制一些感兴趣(Region of Interest,简称ROI)区域。 在这里,我们基于Python和PyQt5框架开发了一款桌面应用程序,允许用…

c#类型转换和常见集合类型

目录 1. 整数转换,整数和字符串,字符串和整数之间的转换怎么实现? 2. 日期转换,获取当前日期,字符串转日期,日期转字符串怎么实现? 3. 举例一维、二维、三维数组 4. 需求:有个88…

事务(数据库)

是一组操作的集合,是一个不可分割的工作单位,事物会把所有的操作作为一个整体一起向系统提交或撤销操作请求,这些操作要么同时成功,要么同时失败 create table account(id int auto_increment primary key comment 主键ID,name va…

VPN 的入门介绍

VPN(虚拟专用网络) 简介 虚拟专用网络,简称虚拟专网(VPN),其主要功能是在公用网络上建立专用网络,进行加密通讯。在企业网络中有广泛应用。VPN网关通过对数据包的加密和数据包目标地址的转换实…

14-48 剑和诗人22 - RAG 的主要痛点和解决方案

​​​​​ 检索增强生成 (RAG) 模型已成为一种有前途的方法,它利用存储在文档中的外部知识来提高生成文本的准确性和相关性。通过检索和调节相关的上下文文档,与传统语言模型相比,RAG 模型可以产生更真实、更深入和更具体的响应。 然而&…

诸葛亮的空城计 - 代理模式

定场诗 “无形之中蕴含至理,虚实相生方见大道。” 在三国演义中,诸葛亮的空城计可谓神来之笔。这看似冒险的策略,实则蕴含深意。今天,我们将透过空城计,一窥软件设计中代理模式的奥秘。 西城无人旦夕危,…

君方智能设计平台-事务管理技术方案

1.背景介绍 事务处理是指对数据进行一组操作,这些操作要么全部成功,要么全部失败,以确保数据的一致性和完整性。软件的事务管理主要实现方案主要涉及以下几个方面: (1)数据一致性:在CAD软件中…

STM32实现看门狗(HAL库)

文章目录 一. 看门狗1. 独立看门狗(IWDG)1.1 原理1.2 相关配置1.3 相关函数 2. 窗口看门狗(WWDG)2.1 原理2.2 相关配置2.3 相关函数 一. 看门狗 单片机在日常工作中常常会因为用户配置代码出现BUG,而导致芯片无法正常工…

Flask项目搭建及部署(完整版!全网最全)

flask搭建及部署 pip 19.2.3 python 3.7.5 Flask 1.1.1 Flask-SQLAlchemy 2.4.1 Pika 1.1.0 Redis 3.3.11 flask-wtf 0.14.2 1、创建flask项目: 创建完成后整个项目结构树: app.py: 项⽬管理⽂件,通过它管理项⽬。 static: 存放静态文…

map和set的原理、优劣势、应用场景和示例代码,统统告诉你。

map和set的原理都是基于哈希表实现的,通过哈希值来快速查找和插入元素,从而实现高效的数据存储和管理,那么他们之间有什么不同呢,该如何选择,本文带你了解。 一、map和set的原理 map和set都是数据结构,用…

【分布式系统三】监控平台Zabbix对接grafana(截图详细版)

目录 一.安装grafana并启动 二.浏览器访问 三.导入zabbix数据,对接grafana 四.如何导入模版 以前两篇博客为基础 【分布式系统】监控平台Zabbix介绍与部署(命令截图版)-CSDN博客 【分布式系统】监控平台Zabbix自定义模版配置-CSDN博客 …