百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Rocky Linux 9.x 从零安装 Nginx 全流程:源码编译 + dnf 安装方案详解

ahcoder 2025-07-02 17:40 4 浏览

0.前言

本文目标,安装nginx提供http访问git仓库。关于这篇只是再续,还有续集...

以下安装主要的过程都是在root用户下进行,如果是非root用户,请使用sudo获取root权限执行命令。

1.安装编译依赖

安装全部依赖,如下:

sudo dnf install -y \
gcc gcc-c++ make \ # C/C++编译器和构建工具
openssl-devel pcre-devel zlib-devel \ # 分别支持SSL、正则表达式和压缩功能
redhat-rpm-config \ # 提供RHEL系统的安全编译参数(如RELRO、PIE)
wget tar \ # 用于下载和解压Nginx源码
fcgiwrap # 运行Git HTTP后端(git-http-backend)的FastCGI包装器,起到nginx和git的桥梁作用

先查看有没有安装这些依赖,再调整,前面我已经安装升级了openssl和git,所以简化以上命令为:

sudo dnf install -y redhat-rpm-config fcgiwrap

错误原因:Rocky Linux 9 的默认仓库中没有 fcgiwrap。这是Rock Linux的软件包策略发生了变化有关, 启用 EPEL (Extra Packages for Enterprise Linux) 仓库。

sudo dnf install epel-release

再运行依赖安装命令

2.下载Nginx安装包

创建源码目录

sudo mkdir -p /usr/local/src/nginx
cd /usr/local/src/nginx

下载源码

sudo wget https://nginx.org/download/nginx-1.24.0.tar.gz

3.解压

当前源码目录解压:

sudo tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0

4.创建安装目录

sudo mkdir -p /u01/nginx
sudo chmod -R 755 /u01/nginx # 设置权限

5.配置编译参数

命令解释:

sudo ./configure \
--prefix=/u01/nginx \ # 指定Nginx安装路径
--with-http_ssl_module \ # 启用HTTPS支持(必需,保护Git通信安全)
--with-http_v2_module \ # 启用HTTP/2协议(提升传输效率,减少延迟)
--with-http_gzip_static_module \ # 启用预压缩文件支持(加速静态资源传输)
--with-http_realip_module \ # 启用真实IP获取(用于反向代理环境,获取客户端原始IP)
--with-pcre \ # 启用PCRE正则表达式支持(用于URL重写和匹配,Git路径解析必需)
--with-stream \ # 启用TCP/UDP代理模块(可用于代理Git的SSH协议,如需要)
--with-stream_ssl_module \ # 启用流模块的SSL支持(用于加密TCP/UDP流量)
--with-threads \ # 启用线程池支持(提升并发处理能力,特别适合IO密集型的Git服务)
--with-http_auth_request_module \ # 启用认证请求模块(用于高级认证,如OAuth、LDAP等外部认证服务)
--with-http_flv_module \ # 启用FLV流媒体模块(可选,用于视频播放,Git服务可能不需要,但保留灵活性)
--with-http_mp4_module \ # 启用MP4流媒体模块(可选,用于视频播放,Git服务可能不需要,但保留灵活性)
--with-http_sub_module \ # 启用内容替换模块(可用于自定义Git Web界面,替换页面元素)
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic' # 优化编译参数(提升性能和安全性)

运行一下命令:

cd nginx-1.24.0
sudo ./configure --prefix=/u01/nginx --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_realip_module --with-pcre --with-stream --with-stream_ssl_module --with-threads --with-http_auth_request_module --with-http_flv_module --with-http_mp4_module --with-http_sub_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic'

6.编译安装并验证和启动

编译:

sudo make

安装

sudo make install

安装的操作就是拷贝到指定路径咯!

验证,全路径测试安装是否成功

/u01/nginx/sbin/nginx -v

启动

全路径启动

/u01/nginx/sbin/nginx

浏览器可以访问到,说明已经启动成功

如果浏览器访问不到,就查看以下80端口是否开放,

firewall-cmd --list-ports // 端口列表
firewall-cmd --query-port=80/tcp // 指定端口查看

开放端口,重启防火墙

firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --reload

7.配置环境变量

sudo tee /etc/profile.d/nginx.sh << 'EOF'
export PATH="/u01/nginx/sbin:$PATH"
EOF
source /etc/profile.d/nginx.sh

系统启动,或用户通过ssh登录就会加载脚本。

配置环境变量,有利于手动启动,启动不写全路径。

8. 开机启动

创建文件

touch /etc/systemd/system/nginx.service

写入内容:

[Unit]
Description=The NGINX HTTP Server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/u01/nginx/logs/nginx.pid
ExecStartPre=/u01/nginx/sbin/nginx -t
ExecStart=/u01/nginx/sbin/nginx
ExecReload=/u01/nginx/sbin/nginx -s reload
ExecStop=/u01/nginx/sbin/nginx -s stop
ExecQuit=/u01/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target

重载systemd管理器配置

systemctl daemon-reload

创建Nginx服务

systemctl enable nginx

启动服务、查看服务状态

# 立即启动Nginx
systemctl start nginx
# 验证服务状态
systemctl status nginx
# 重启启动Nginx
systemctl restart nginx

重启系统验证是否自动启动nginx

9.加强权限提高安全性(适合生产优化)

这一步很重要,是考虑到了系统被攻击等安全性,而加的一个重要步骤。

查询nginx进程情况

ps -ef | grep nginx

两个进程,一个是主进程master process,另一个是工作进程worker process,主进程由root用户运行,而工作进程由,nobody 用户运行。

nobody用户权限极低,专门用来运行无需高权限的服务或进程,这样即便服务有漏洞被攻击,因 nobody 能访问的资源极少,能把对系统的破坏范围 “锁死”。Nginx 用 nobody 运行工作进程,就算进程被入侵,攻击者也拿不到系统高权限(如 root )。那么我们有一个问题:

那么Nginx工作进程(worker process)已经使用nobody用户运行,那还有必要创建Nginx用户去运行工作进程吗?

答案是:有必要。

因为nobody 是共享低权用户,是系统默认创建的用户,nobody用户有可能也运行其他服务和进程,如果nobody被攻破,就会扩大破坏范围,因此,我们使用Nginx专属用户隔离,创建专属隔离。

创建Nginx专属用户:

sudo useradd --system --shell /sbin/nologin --comment "Nginx Web Server" --user-group --no-create-home nginx

创建的nginx用户特点:

  1. --system 创建系统用户
  2. --shell /sbin/nologin 禁止登录
  3. --comment "Nginx Web Server" 添加注释
  4. --user-group 创建同名组 nginx
  5. --no-create-home 不创建家目录

可以查一下,创建是否成功

id nginx

下面是优化过程

9.1. 备份nginx.conf配置文件

cp /u01/nginx/conf/nginx.conf /u01/nginx/conf/nginx.conf.bak

9.2.修改nginx.conf配置

配置运行用户,将以下配置加到nginx.conf 首行。

user nginx nginx; 

9.3.修改启动服务文件nginx.service

修改

nano /etc/systemd/system/nginx.service

在[Service]中添加一下片段

[Service] 
AmbientCapabilities=CAP_NET_BIND_SERVICE 
ProtectSystem=full 
ProtectHome=true

修改完后,重新加载

systemctl daemon-reload

9.3.调整 Nginx 目录权限

为了以防万一权限混乱,下面对Nginx目录的权限做备份,运行备份命令:

find /u01/nginx -type f -o -type d -print0 | xargs -0 -I {} bash -c 'stat -c "chown %u:%g %n; chmod %a %n" "{}"' > /u01/nginx_perm_backup.sh

将权限写到nginx_perm_backup.sh文件中,可以查看内容

cat /u01/nginx_perm_backup.sh
chown 0:0 /u01/nginx; chmod 755 /u01/nginx
chown 0:0 /u01/nginx/sbin; chmod 755 /u01/nginx/sbin
chown 0:0 /u01/nginx/conf; chmod 755 /u01/nginx/conf
chown 0:0 /u01/nginx/logs; chmod 755 /u01/nginx/logs
chown 0:0 /u01/nginx/html; chmod 755 /u01/nginx/html
chown 65534:0 /u01/nginx/client_body_temp; chmod 700 /u01/nginx/client_body_temp
chown 65534:0 /u01/nginx/proxy_temp; chmod 700 /u01/nginx/proxy_temp
chown 65534:0 /u01/nginx/fastcgi_temp; chmod 700 /u01/nginx/fastcgi_temp
chown 65534:0 /u01/nginx/uwsgi_temp; chmod 700 /u01/nginx/uwsgi_temp
chown 65534:0 /u01/nginx/scgi_temp; chmod 700 /u01/nginx/scgi_temp

恢复权限使用命令

bash /u01/nginx_perm_backup.sh 

还有一种备份方式,高级备份

getfacl -R /u01/nginx > /u01/nginx_perm_backup.acl

恢复使用

setfacl --restore=/u01/nginx_perm_backup.acl

保存了以上权限。

下面开始改权限:

核心原则:最小权限

比如:

主目录 /u01/nginx 保持 root:nginx ownership,权限 750(root 可操作,nginx 组只读 / 执行,其他用户无权限);

配置目录 conf 设为 root:nginx,权限 750(nginx 组能读配置,但不能修改);

日志目录 logs、临时目录 temp、网页目录 html 设为 nginx:nginx,权限 750/755(nginx 用户可读写日志、生成临时文件、提供网页内容)。

我目录 /u01/nginx的目录如下:

# 递归设置Nginx主目录权限给nginx用户组
chown -R root:nginx /u01/nginx
# 设置配置文件目录权限
chmod -R 750 /u01/nginx/conf
chmod 640 /u01/nginx/conf/nginx.conf
# 设置日志目录权限
chown -R nginx:nginx /u01/nginx/logs
chmod -R 750 /u01/nginx/logs
# 设置临时文件目录权限(若有)
chown -R nginx:nginx /u01/nginx/client_body_temp
chmod -R 750 /u01/nginx/client_body_temp
chown -R nginx:nginx /u01/nginx/fastcgi_temp
chmod -R 750 /u01/nginx/fastcgi_temp
chown -R nginx:nginx /u01/nginx/proxy_temp
chmod -R 750 /u01/nginx/proxy_temp
chown -R nginx:nginx /u01/nginx/scgi_temp
chmod -R 750 /u01/nginx/scgi_temp
chown -R nginx:nginx /u01/nginx/uwsgi_temp
chmod -R 750 /u01/nginx/uwsgi_temp

# 设置HTML目录权限(根据实际情况调整)
chown -R nginx:nginx /u01/nginx/html
chmod -R 755 /u01/nginx/html

验证

su -s /bin/bash -c "touch /u01/nginx/logs/test.log" nginx  # 测试日志写入
su -s /bin/bash -c "ls /u01/nginx/html" nginx            # 测试网页目录访问
// 安装这种方式验证其他目录的nginx用户权限,验证是为了更好的保证正确,不验证也行

9.4.SELinux权限问题

判断系统是否启用了 SELinux(Security-Enhanced Linux ,安全增强型 Linux )

getenforce
  • 如果输出 Enforcing,表示 SELinux 处于强制启用状态,会严格依据策略限制访问。
  • 如果输出 Permissive,表示 SELinux 已加载策略,但仅记录违规行为,不实际阻止操作 。
  • 如果输出 Disabled,表示 SELinux 已被禁用。
# 查看 Nginx 相关的 SELinux 拒绝规则
grep nginx /var/log/audit/audit.log | audit2allow -m nginx_policy
# 生成并加载策略
grep nginx /var/log/audit/audit.log | audit2allow -M nginx_policy
semodule -i nginx_policy.pp

9.5 完成测试

完成以上的配置后,我重启nginx,查看状态

systemctl restart nginx
systemctl status nginx

正常启动,状态正常。

查看进程是不是nginx用户运行了工作进程:

符合预期,主进程由root用户运行,工作进程由nginx用户运行。

完成!

过几天补一篇文章,关于git安装的,之前的git安装我忽略了 openssl-devel包。

相关推荐

ClickHouse日志平台这样建,分分钟秒掉ELK

目前业界的日志生态,最常用的是ELK,其次就是ClickHouse,本文会演示如何使用Vector+ClickHouse来采集Nginx日志并做清洗,最终写入ClickHouse。至...

nginx打印请求头日志方法-openresty

一、前言之前想用nginx打印收到的请求的请求头,但是只找到打印请求体的,没有打印请求头的,感觉原版nginx不支持。建议如果想打印请求头,先换成openresty(本人安装的是openresty-1...

文心快码帮你解大厂面试题:如何使用shell找到access log?

【大厂面试真题】系列,带你攻克大厂面试真题,秒变offer收割机!今日问题:在8g内存的机器,能否启动一个7G堆大小的java进程?一起看看文心快码BaiduComate给出的答案吧!如果这个问题你...

Nginx奇技淫巧之:按日期自动生成日志文件

时光闹钟app开发者,请关注我,后续分享更精彩!坚持原创,共同进步!前言之前文章:Nginx奇技淫巧之:用户行为埋点数据采集实现,介绍了Nginx获取post请求body参数生成日志文件的方法。当业务...

Nginx 日志文件详解:监控与诊断利器

随着互联网技术的快速发展,Nginx已成为最受欢迎的Web服务器之一,其稳定性、高性能和灵活性备受推崇。Nginx日志文件是Nginx服务器中非常重要的组成部分,对于监控和诊断Web应...

Nginx从入门到放弃05-访问日志与日志切割

设置访问日志当我们访问nginx服务时,nginx会记录日志,nginx日志分两种,一种是访问日志,一种是错误日志,访问日志记录在”access.log”文件中,错误日志记录在”error.log”文...

nginx系列:常用利用shell统计日志

0x01:根据访问IP统计UVUV(UniqueVisitor)独立访客,统计访问某站点的用户数;IP(InternetProtocol)独立IP数,是指独立的浏览了页面的不同IP,即统计不同的I...

Linux 必须重点监控的 17 个日志文件:运维与安全必备指南

在Linux系统的日常运维与安全管理中,日志文件的重要性不言而喻。日志不仅记录着系统运行的点点滴滴,更是排查故障、发现异常、提前预警的第一手证据。作为一名系统管理员、安全工程师,甚至普通开发者,了...

nginx 常用日志参数(nginx日志详解)

Nginx提供了多种日志参数(变量),可以用来记录请求的不同方面。常用日志参数$remote_addr:客户端的IP地址。$remote_user:客户端用户名。$time_local:局部时...

GoAccess轻量nginx日志分析工具(nginx日志收集方案)

什么是GoAccessGoAccess是一款开源、实时,运行在命令行终端下的Web日志分析工具。该工具提供快速、多样的HTTP状态统计。分析结果,可以通过XShell等客户端工具查看,并...

后端实践:Nginx日志配置(超详细)(nginx日志配置文件)

作者:antwang来源:https://juejin.im/post/5aa09bb3f265da238f121b6c前言Nginx日志对于统计、系统服务排错很有用。Nginx日志主要分为两种:...

Nginx access_log 运行日志查询和配置

1.介绍当我们学会Nginx的基本配置之后,可以通过Nginx配置Service代理。管理服务器所有的http和https请求。那么接下来就需要了解Nginx的日志控制,以及相关的文档查看了。你通过...

Nginx记录用户请求Header到access log

为了统计和其它用途,经常有人需要自定义Nginx日志,把http请求中的某个字段记录到日志中,刚好在看lua+nginx的文章,第一想到的是用lua赋值来做,但是想想有点小恶心,于是Google了一番...

介绍五款Web服务器日志分析软件(web服务器日志是什么)

  每个站长必须要看的数据统计表,都是由日志分析软件统计和分析网站情况所得出的。日志分析软件是一种解析Nginx/Apache/IIS/Lighttpd和任何其他Web服务器日志文件的软件...

Nginx系列:Nginx自带后端健康检查

严格说Nginx并没有自带针对负载均衡后端节点的健康检查功能,但是可以通过默认自带的ngx_http_proxy_module模块和ngx_http_upstream_module模块中的相关指令...