nginx

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > nginx > 红帽redhat配置Nginx服务器

基于红帽redhat环境下配置Nginx Web服务器

作者:tangyal

本文详细介绍了在RedHat10系统上使用Nginx搭建基于不同IP、端口和主机名的Web服务器,并配置基于HTTPS的加密站点,具有一定的参考价值,感兴趣的可以了解一下

一、基于不同IP搭建Web服务器

(一)实验目标

在 Red Hat 10 系统上安装 Nginx,并配置两个基于不同 IP 地址的虚拟主机(Virtual Host),实现通过不同 IP 访问不同的网页内容。

(二)详细操作步骤

第一步:安装 Nginx

  1. 使用 dnf 包管理器安装 Nginx。

    dnf install nginx -y

    注意:截图显示安装过程中提示“无法读取客户身份”及“未在权利服务器中注册”,这属于订阅管理提示,不影响 Nginx 软件包的正常安装。

  2. 启动并设置 Nginx 开机自启。

    systemctl restart nginx
    systemctl enable nginx

验证:使用 systemctl status nginx 查看服务状态,确保显示 active (running)

第二步:创建网页目录结构

为了区分不同的虚拟主机,我们需要创建独立的目录和测试页面。

1、创建主目录

/www 下创建 testexam 目录。

mkdir -p /www/{test,exam}

创建主目录

2、设置 SELinux 上下文(关键步骤)

由于 RHEL 默认开启 SELinux,直接在根目录 / 下创建的目录可能无法被 Nginx 读取。需要修改安全上下文

semanage fcontext -a -t httpd_sys_content_t "/www(/.*)?"
restorecon -R /www

解释:将 /www 及其子目录的类型标记为httpd_sys_content_t,允许 Web 服务访问。

3、创建测试页面

echo "hello,130" > /www/test/index.html
echo "hello,131" > /www/exam/index.html

创建测试页面

第三步:配置网络 IP 地址

本实验采用“基于 IP 的虚拟主机”,因此需要为网卡配置多个 IP 地址(IP 别名)。

1、查看当前 IP

使用 ip a 查看网卡名称(截图中为 ens160

2、临时添加 IP 地址

nmcli connection modify ens160 +ipv4.addresses 172.25.2.130/24
nmcli connection modify ens160 +ipv4.addresses 172.25.2.131/24
nmcli connection up ens160

效果:此时 ens160 网卡将同时拥有 130 和 131 两个 IP。

第四步:配置防火墙

firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload

第五步:配置 Nginx 虚拟主机

将配置文件存放在 /etc/nginx/conf.d/ 目录下。

1、编辑配置文件

vim /etc/nginx/conf.d/ip.conf

2、配置代码

将以下代码复制到 ip.conf 文件中:

server {
    listen 172.25.2.130:80;
    server_name _;
​
location / {
    root /www/test;
    index index.html;
}
​
}
​
server {
    listen 172.25.2.131:80;
    server_name _;
​
location / {
    root /www/exam;
    index index.html;
}
​
}

参数解释

3、重启 Nginx 使配置生效

systemctl restart nginx

(三)验证测试

配置完成后,通过 curl 命令或浏览器进行访问测试。

访问 IP 130

访问 IP 131

(四)故障排查提示

如果访问失败,请检查以下几点:

二、基于不同端口的Web服务器搭建

(一)实验目标及意义

目标:在 Red Hat 10 系统上,利用已安装的 Nginx 服务,配置两个基于不同端口的虚拟主机。实现通过访问 IP:9091IP:9092 访问不同的网页内容。

意义:在生产环境中,有时无法为服务器分配多个 IP 地址,或者希望在同一 IP 上托管多个独立的 Web 服务。此时,基于端口的虚拟主机(Port-Based Virtual Host)是最佳解决方案。

(二)详细操作步骤

第一步

参照 一、(二)详细操作步骤 的前两步操作(一模一样)

第二步:配置防火墙(开放指定端口)

Nginx 默认只开放 80 端口,我们需要手动放行 9091 和 9092 端口。

firewall-cmd --permanent --add-port=9091/tcp
firewall-cmd --permanent --add-port=9092/tcp

重载防火墙

firewall-cmd --reload

验证:确保命令返回 success

第三步:Nginx虚拟主机

创建一个新的配置文件,或者修改原有的配置文件(建议新建以避免冲突)。

1、编辑配置文件

vim /etc/nginx/conf.d/port.conf

2、写入配置代码

将以下代码复制到文件port.conf中。注意 listen 指令后的端口号变化,以及 root 路径的对应关系。

server {
    listen 9091; # 监听本机所有 IP 的 9091 端口
    server_name _; # 匹配任意域名
    location / {
        root /www/test; # 对应 test 目录
        index index.html;
    }
}
​
server {
    listen 9092; # 监听本机所有 IP 的 9092 端口
    server_name _; # 匹配任意域名
    location / {
        root /www/exam; # 对应 exam 目录
        index index.html;
    }
}

💡 参数解析

3、重启 Nginx 服务

systemctl restart nginx

(三)验证测试

配置完成后,使用 curl 命令进行本地或远程测试。

访问端口 9091

访问端口 9092

(四)可能有困惑之处-详解

1、配置server_name _;的原因

在基于端口的配置中,Nginx 依靠 listen 指令后的端口号(如 9091)来区分不同的网站。server_name _; 是一个通配符,表示“匹配任意域名”。如果写死域名或 IP,当客户端通过 IP:端口 访问时,HTTP 请求头中的 Host 字段(如 127.0.0.1:9091)可能无法匹配,导致 Nginx 返回默认页面或 404。使用 _ 确保了只要端口对,就能命中配置。

2、防火墙配置的必要性

Linux 的 firewalld 默认只放行常用端口(如 80、443)。自定义端口(9091/9092)必须手动添加规则,否则外部网络包无法进入服务器。

(五)所遇故障及排查思路

1、遇到的报错

遇到的报错

日志中出现了关键错误信息:

nginx: [emerg] bind() to 0.0.0.0:9091 failed (13: Permission denied)

解读:Nginx 进程没有权限绑定到 9091 和 9092 端口。这通常不是文件权限问题,而是 SELinux(Security-Enhanced Linux) 在作祟。SELinux 有一套预定义的端口策略,Nginx 默认只被允许监听 80、443 等标准端口,非标准端口会被拦截。

2、解决步骤

①查看防火墙配置(放行的端口是否正确)

[root@localhost conf.d]# firewall-cmd --list-ports

若出现9091/tcp 9092/tcp,则证明无误;

若没出现,就重新配置,如下命令。

防火墙放行端口(这一步是必要的,但不是导致 Permission denied 的原因)

firewall-cmd --permanent --add-port=9091/tcp
firewall-cmd --permanent --add-port=9092/tcp
firewall-cmd --reload

重启服务(依然失败,大概率推断是 SELinux 问题)

systemctl restart nginx

①查看防火墙配置(放行的端口是否正确)

上述确认无误但还是不能启动,进一步如下操作:

②检查端口是否被其他进程占用

netstat -tuln | grep 9091
netstat -tuln | grep 9092

②检查端口是否被其他进程占用

假设被占用了,你看到类似这样的输出: tcp 0 0 0.0.0.0:9091 0.0.0.0:* LISTEN 0 12345 1234/java

最后一列 1234/java 表示:PID 为 1234 的 java 程序正在占用 9091 端口。

杀掉进程(以 PID 1234 为例)

   kill -9 1234

重新检查端口,确认已释放

   netstat -tuln | grep 9091

(此时应该没有输出,表示端口空闲)

没被占用,且还不能正常启动nginx,继续下一步操作:

③ SELinux 排错

解决方案:临时禁用 SELinux 进行验证

临时将 SELinux 设置为宽容模式(Permissive)

setenforce 0

再次检查配置语法

nginx -t

输出:syntax is ok (此时语法检查通过,且不再报 Permission denied)

systemctl restart nginx

再次重新启动nginx

③ SELinux 排错

最终建议: 为了系统安全,建议在实验结束后,重新开启 SELinux 并通过策略模块放行端口,而不是保持 setenforce 0 的状态。

3、最终解决故障,成功排错并解决!

三、基于不同主机名的Web服务器搭建

(一)实验目标

配置两个基于域名的虚拟主机 (www.test.comwww.exam.com),并实现正常访问。

(二)详细操作步骤

第一步:准备网站根目录与测试页面

1、创建网站根目录

mkdir -p /www/test /www/exam

2、编写测试页面文件

/www/test/index.html 内容为 hello,130

/www/exam/index.html 内容为 hello,131

这里我直接用的上述实验的目录文件了,就没有重复操作,这里就不放实验图片啦 > . <

3、本地解析

修改 /etc/hosts 文件,添加域名映射(指向本机或指定 IP),以便在没有 DNS 服务器的情况下进行测试。

vim /etc/hosts

第二步:编写 Nginx 虚拟主机配置

1、进入配置目录

cd /etc/nginx/conf.d/

2、创建配置文件

[root@localhost conf.d]# vim hostname.conf
[root@localhost conf.d]# cat hostname.conf
server {
    listen 9091; 
    server_name www.test.com;
    location / {
        root /www/test;
        index index.html;
    }
}
​
server {
    listen 9092;
    server_name www.exam.com;
    location / {
        root /www/exam;
        index index.html;
    }
}

第三步:重启Nginx服务

# 放行 SELinux 策略(解决 9091/9092 权限问题)
[root@localhost conf.d]# semanage port -a -t http_port_t -p tcp 9091
[root@localhost conf.d]# semanage port -a -t http_port_t -p tcp 9092
​
[root@localhost conf.d]# systemctl restart nginx.service

(三)验证测试

[root@localhost conf.d]# curl http://www.test.com
hello,130
[root@localhost conf.d]# curl http://www.exam.com
hello,131

(四)所遇故障及排查思路

1、遇到的故障

2、解决方法1(使用9091、9092端口)

解决方法1(使用9091、9092端口)

nginx: [emerg] bind() to 0.0.0.0:9091 failed (13: Permission denied)

解读:Nginx 想要绑定(监听)9091 端口,但是系统拒绝了。

原因:这是 SELinux 在搞鬼,9091 端口被 SELinux 拦截(CentOS/RHEL 的安全机制,默认不允许 Nginx 用 80 以外的端口)。

解决

①将配置文件的80端口改为9091和9092

②通过命令放行SELinux策略

# 安装 semanage 工具(如果没安装)
yum install policycoreutils-python-utils -y
​
# 告诉 SELinux 允许 9091和9092
semanage port -a -t http_port_t -p tcp 9091
semanage port -a -t http_port_t -p tcp 9092

提示:如果还是不行也检查一下9091和9092是否被其他进程监听占用,如下图。

正是因为我发现9091和9092比80(如解决方法2中图)被进程监听占用得少(就可以少备份一份文件),所以上述正常详细操作步骤中我选择的是用9091和9092端口,而不是80端口。

3、解决方法2(仍使用80端口)

①首先排查80端口是否被其他进程监听占用

grep -r "listen.*80" /etc/nginx/

①首先排查80端口是否被其他进程监听占用

输出分析

结论:出现了nginx配置冲突,80端口ip.conf在使用了,hostname也想使用,导致冲突。这就像是两个人都想坐同一把椅子(80号椅子),肯定会打架。

②备份干扰文件并移除(ip.conf)

mv /etc/nginx/conf.d/ip.conf /etc/nginx/conf.d/ip.conf.bak

4、成功解决

无论上述哪一种方法都能有效解决这个报错问题,最后重启nginx服务就没问题了!

(五) 实验总结与关键知识点

1、Nginx 启动失败排查三部曲

2、SELinux 的重要性

3、虚拟主机配置原则

(六)扩展知识:Linux 中常见的三种“Permission denied”🧐

1、文件/目录权限拒绝 (标准 Linux 权限)

2、端口绑定权限拒绝 (特权端口限制)

3、安全策略权限拒绝 (SELinux/AppArmor) ——正是上述所遇的故障

场景:即使是 root 用户,即使端口没被占用,即使文件权限正确,系统依然拒绝操作。

原因:系统的安全策略(SELinux)认为该操作不安全。

特征:通常伴随着端口绑定失败(如你的情况)或文件访问失败(如 Nginx 无法读取网页文件)。

解决

四、基于HTTPS加密的Web服务器配置

(一)实验目标

配置基于HTTPS加密的Web站点

(二)实验步骤

1、生成SSL证书

# 创建证书目录
sudo mkdir -p /etc/ssl/private
​
# 生成自签名证书,建议直接复制粘贴下述代码
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/nginx-selfsigned.key \
-out /etc/ssl/certs/nginx-selfsigned.crt

生成SSL证书

证书信息填写:

Country Name (2 letter code) [XX]: CN
State or Province Name (full name) []: Beijing
Locality Name (eg, city) [Default City]: Beijing
Organization Name (eg, company) [Default Company Ltd]: My
Organizational Unit Name (eg, section) []: IT
Common Name (eg, your name or your server's hostname) []: www.https.com
Email Address []: admin@example.com

2、配置SELinux上下文

# 配置证书文件SELinux上下文
[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t "/etc/ssl/certs/nginx-selfsigned.crt"
[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t "/etc/ssl/private/nginx-selfsigned.key"
[root@localhost ~]# restorecon -v /etc/ssl/certs/nginx-selfsigned.crt
[root@localhost ~]# restorecon -v /etc/ssl/private/nginx-selfsigned.key

semanage fcontext: SELinux 管理文件上下文的命令。

restorecon -v: 重新加载(Restore)文件的安全上下文。-v 参数表示显示详细过程。这一步是将 semanage 定义的规则应用到实际文件上,让 Nginx 进程能够读取证书文件,否则会报 403 Forbidden 或权限拒绝错误。

3、创建配置文件

创建 /etc/nginx/conf.d/https.conf

server {
    listen 443 ssl;
    server_name www.https.com;
    
    ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
    ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
    
    location / {
        root /www/https;
        index index.html;
    }
}

4、配置本地解析

编辑 /etc/hosts 文件:

sudo vim /etc/hosts

添加以下内容:127.0.0.1 www.https.com

5、编写测试页面文件

[root@localhost ~]# cd /www/
[root@localhost www]# ll
总计 0
drwxr-xr-x. 2 root root 24  3月30日 18:35 exam
drwxr-xr-x. 2 root root  6  3月30日 14:49 https
drwxr-xr-x. 2 root root 24  3月30日 18:35 test
[root@localhost www]# cd https/
[root@localhost https]# echo hello,https!!! > index.html
echo hello,httpsll! > index.html
[root@localhost https]# cat index.html 
hello,httpsll!

6、测试配置

# 检查配置语法(可选)
nginx -t
​
# 重启Nginx
systemctl restart nginx
​
# 测试访问(忽略证书验证)
curl -k https://www.https.com

(三)常见问题与解决方案

问题1:证书文件无法加载

现象: cannot load certificate ... No such file or directory

解决方案

# 确保证书目录存在
sudo mkdir -p /etc/ssl/private
​
# 重新生成证书
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/private/nginx-selfsigned.key \
-out /etc/ssl/certs/nginx-selfsigned.crt

问题2:HTTPS访问被重定向

现象: 访问时被重定向到广告页面

解决方案

# 确保本地解析配置正确
echo "127.0.0.1 www.https.com" | sudo tee -a /etc/hosts
​
# 删除默认配置文件
sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak

问题3:SELinux权限拒绝

现象: Nginx无法访问文件或端口

解决方案

# 修复目录上下文
sudo restorecon -R /www
​
# 允许自定义端口
sudo semanage port -a -t http_port_t -p tcp 9090

五、 实验总结与配置思路

(一)四个实验的整体配置思路

这四个实验层层递进,展示了 Nginx 如何利用 listenserver_name 指令实现“一台服务器,多个站点”。

1、基于 IP 的虚拟主机 (IP-Based)

2、基于端口的虚拟主机 (Port-Based)

3、基于主机名的虚拟主机 (Name-Based)

4、基于 HTTPS 的加密站点

核心逻辑:在 HTTP 的基础上增加 SSL/TLS 加密层。

配置关键

安全增强:结合了前三种虚拟主机的逻辑,但增加了数据传输的加密和身份验证(虽然是自签名)。

(二)关键排错经验总结

通过这四个实验,可以总结出 Linux 下 Web 服务排错的“黄金法则”:

第一步(服务层)

systemctl status nginx -> 看服务是否启动。

第二步(日志层)

journalctl -xeu nginx.service -> 看具体报错代码(如 Permission denied)。

第三步(配置层)

nginx -t-> 检查语法;grep listen /etc/nginx/*` -> 检查端口冲突。

第四步(安全层)

当端口未被占用但无法绑定时,检查 SELinux (semanage port -l | grep http);当文件存在但无法读取时,检查 SELinux 上下文 (ls -Z)。

到此这篇关于基于红帽redhat环境下配置Nginx Web服务器的文章就介绍到这了,更多相关红帽redhat配置Nginx服务器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文