详细Linux中级知识(不断完善)
Nginx服务配置
基于主机名配置
映射IP和主机名
[root@localhost ~]# vim /etc/hosts
192.168.72.135 www.chengke.com chengke[root@localhost ~]# echo "192.168.72.135 www.xx.com" >> /etc/hosts以上是两种方法,前面是你的IP地址,后面是你想要设置的域名
安装Nginx
1、查看nginx是否已经安装
[root@localhost ~]# rpm -ql nginx
package nginx is not installed
这表示没有安装。
2、查看是否有仓库配置
[root@localhost ~]# dnf repolist
repo id repo name
appStream AppStream
baseOS BaseOS编写仓库基础知识文字里有
3、查看是否挂载
[root@localhost ~]# ls /mnt
hgfs
[root@localhost ~]# mount /dev/sr0 /mnt
mount: /mnt: WARNING: source write-protected, mounted read-only.
[root@localhost ~]# ls /mnt
AppStream EFI extra_files.json images media.repo RPM-GPG-KEY-redhat-release
BaseOS EULA GPL isolinux RPM-GPG-KEY-redhat-beta这是红帽的,根据版本的问题,有些自动挂载,有些需要手动挂载。
4、安装nginx
[root@localhost ~]# dnf install nginx -y
BaseOS 847 kB/s | 2.7 kB 00:00
AppStream 3.1 MB/s | 3.2 kB 00:00
Dependencies resolved.
====================================================================================================Package Architecture Version Repository Size
====================================================================================================
Installing:nginx x86_64 2:1.20.1-20.el9 appStream 40 k
Installing dependencies:nginx-core x86_64 2:1.20.1-20.el9 appStream 574 knginx-filesystem noarch 2:1.20.1-20.el9 appStream 11 kredhat-logos-httpd noarch 90.4-2.el9 appStream 18 k
Transaction Summary
====================================================================================================
Install 4 Packages
Total size: 643 k
Installed size: 1.8 M
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transactionPreparing : 1/1 Running scriptlet: nginx-filesystem-2:1.20.1-20.el9.noarch 1/4 Installing : nginx-filesystem-2:1.20.1-20.el9.noarch 1/4 Installing : nginx-core-2:1.20.1-20.el9.x86_64 2/4 Installing : redhat-logos-httpd-90.4-2.el9.noarch 3/4 Installing : nginx-2:1.20.1-20.el9.x86_64 4/4 Running scriptlet: nginx-2:1.20.1-20.el9.x86_64 4/4 Verifying : nginx-2:1.20.1-20.el9.x86_64 1/4 Verifying : nginx-core-2:1.20.1-20.el9.x86_64 2/4 Verifying : nginx-filesystem-2:1.20.1-20.el9.noarch 3/4 Verifying : redhat-logos-httpd-90.4-2.el9.noarch 4/4
Installed products updated.
Installed:nginx-2:1.20.1-20.el9.x86_64 nginx-core-2:1.20.1-20.el9.x86_64 nginx-filesystem-2:1.20.1-20.el9.noarch redhat-logos-httpd-90.4-2.el9.noarch
Complete!
配置ngnix
我们在 /etc/nginx/conf.d/ 目录下创建我们自己的自定义配置文件。
[root@localhost ~]# vim /etc/nginx/conf.d/chengke.conf
server {listen 80;server_name www.chengke.com;access_log /var/log/nginx/chengke/access.log;error_log /var/log/nginx/chengke/error.log;root /opt/chengke;
}1. [root@localhost ~]# vim /etc/nginx/conf.d/chengke.conf
这并非 Nginx 配置文件的内容,而是一条在 Linux 系统中使用vim编辑器来打开 /etc/nginx/conf.d/chengke.conf 文件的命令。2. server {
此行为一个server块的起始,在 Nginx 里,server块用来定义虚拟主机,能够对不同的域名或者 IP 地址设置不同的配置。3. listen 80;
这行代码告知 Nginx 要监听 80 端口,也就是 HTTP 协议的默认端口。当有客户端发起 HTTP 请求时,Nginx 会接收这些请求并进行处理。4. server_name www.chengke.com;
该配置指定了这个虚拟主机所对应的域名。当客户端通过www.chengke.com这个域名发起请求时,Nginx 会采用这个server块的配置来处理请求。5. access_log /var/log/nginx/chengke/access.log;
此配置指定了访问日志的存放路径。Nginx 会把所有针对这个虚拟主机的访问记录保存到 /var/log/nginx/chengke/access.log 文件中,这些记录有助于后续分析用户的访问行为。6. error_log /var/log/nginx/chengke/error.log;
这行代码指定了错误日志的存放路径。当 Nginx 在处理请求过程中出现错误时,相关的错误信息会被记录到 /var/log/nginx/chengke/error.log 文件中,这有助于排查问题。7. root /opt/chengke;
此配置定义了这个虚拟主机的根目录。当客户端请求静态文件时,Nginx 会从 /opt/chengke 目录下查找对应的文件。综上所述,这段配置文件的作用是创建一个虚拟主机,监听 80 端口,对应域名www.chengke.com,并将访问日志和错误日志分别记录到指定文件,同时将 /opt/chengke 目录作为根目录来提供静态文件服务。
然后创建配置文件所需要的目录。
[root@localhost ~]# mkdir /opt/chengke -p
[root@localhost ~]# mkdir /var/log/nginx/chengke -p具体的文件会根据配置自动创建,但是目录需要手动创建
启动服务
[root@localhost ~]# systemctl start nginx
[root@localhost ~]# ps -ef | grep nginx
root 12510 1 0 14:53 ? 00:00:00 nginx: master process /usr/sbin/nginx
nginx 12511 12510 0 14:53 ? 00:00:00 nginx: worker process
nginx 12512 12510 0 14:53 ? 00:00:00 nginx: worker process
nginx 12513 12510 0 14:53 ? 00:00:00 nginx: worker process
nginx 12514 12510 0 14:53 ? 00:00:00 nginx: worker process
root 12516 1112 0 14:53 pts/0 00:00:00 grep --color=auto nginx主播认为出现的问题:
Nginx 配置未生效或错误:虽然你在 /etc/nginx/conf.d/chengke.conf 中配置了针对 www.chengke.com 的虚拟主机,但是 Nginx 可能没有正确加载该配置。可能的原因包括:
配置文件语法错误:你可以使用 nginx -t 命令来检查 Nginx 配置文件的语法是否正确。如果存在语法错误,Nginx 不会重新加载配置,仍然会使用之前的配置或默认配置。
[root@localhost ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
这样表示没错,否则会提示具体行数。(新手可能性大)配置文件未被加载:确认 Nginx 主配置文件(/etc/nginx/nginx.conf)中是否包含了 include /etc/nginx/conf.d/*.conf; 这样的语句,以便让 Nginx 加载 /etc/nginx/conf.d/ 目录下的所有配置文件。Nginx 服务未重启或重新加载配置:修改配置文件后,需要执行 systemctl restart nginx 或 systemctl reload nginx 命令使配置生效。如果没有执行这些操作,Nginx 仍会使用旧的配置。
域名解析问题:确保 www.chengke.com 正确解析到了当前运行 Nginx 服务器的 IP 地址。你可以通过 ping www.chengke.com 命令来检查域名解析是否正常。如果域名解析不正确,你访问的可能并不是你配置的 Nginx 服务器。根目录内容缺失:你在配置文件中设置了 root /opt/chengke;,但 /opt/chengke 目录下可能没有放置任何内容,或者没有正确的索引文件(如 index.html)。在这种情况下,Nginx 可能会回退到默认的行为,展示 Red Hat Enterprise Linux 的测试页面。存在其他默认配置优先:Nginx 可能还有其他默认的虚拟主机配置,这些配置可能会优先于你设置的 www.chengke.com 配置。例如,在 Nginx 的默认配置中可能已经定义了一个监听 80 端口的默认虚拟主机,当请求无法匹配到具体的虚拟主机时,就会展示默认的测试页面。默认的测试界面就是一个html文件的代码。有其他进程占用了80端口,解决方法如下:都可以尝试查询错误日志
[root@localhost ~]# tail -n 50 /var/log/nginx/error.log
2025/03/24 16:19:35 [emerg] 38144#38144: bind() to 0.0.0.0:80 failed (98: Address already in use)
2025/03/24 16:19:35 [emerg] 38144#38144: bind() to [::]:80 failed (98: Address already in use)
2025/03/24 16:19:35 [emerg] 38144#38144: bind() to 0.0.0.0:80 failed (98: Address already in use)
2025/03/24 16:19:35 [emerg] 38144#38144: bind() to [::]:80 failed (98: Address already in use)
2025/03/24 16:19:35 [emerg] 38144#38144: bind() to 0.0.0.0:80 failed (98: Address already in use)
2025/03/24 16:19:35 [emerg] 38144#38144: bind() to [::]:80 failed (98: Address already in use)
部分
查找占用 80 端口的进程:在 Linux 系统中,使用lsof或netstat命令查找占用 80 端口的进程。以lsof为例,执行lsof -i :80 ,该命令会列出所有打开 80 端口的进程信息,包括进程 ID(PID)、进程名等。若使用netstat,则执行netstat -tulnp | grep :80,-t表示 TCP 协议,-u表示 UDP 协议,-l表示仅列出监听状态的端口,-n表示不解析服务名,直接显示端口号,-p表示显示占用端口的进程 ID 和进程名。停止占用端口的进程:如果查找到占用 80 端口的进程是不必要的服务,如 Apache(若已安装且未使用),可以停止该进程。若使用systemctl管理服务,对于 Apache 服务,执行sudo systemctl stop httpd(CentOS/RHEL 系统)或sudo systemctl stop apache2(Debian/Ubuntu 系统)。若占用进程是其他未知程序,且不清楚其作用,不要随意停止,先确认其功能,避免影响系统正常运行。修改 Nginx 监听端口:如果不想停止占用 80 端口的进程,或者无法确定该进程是否可停止,可以修改 Nginx 的监听端口。打开 Nginx 配置文件,一般在/etc/nginx/nginx.conf或/etc/nginx/conf.d/目录下的相关配置文件中,找到类似listen 80;的配置行,将其修改为其他未被占用的端口,如listen 8080; ,保存文件后,重新加载 Nginx 配置使修改生效,执行sudo systemctl reload nginx 。修改端口后,访问网站时需使用新的端口号,如http://your_domain:8080。简单来说就是要么修改你的端口号,要么停止80端口的服务,比如httpd。
功能测试
1、使用 curl 命令
[root@localhost ~]# curl www.chengke.com
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
这个错误是因为中默认情况下会显示服务的根目录(/opt/chengke/)下的 index.html 文件,因此,我们需要先创建这个文件,简单来说我们打开一个网页,需要有一个html文件进行显示,但是现在没有展示的东西。
[root@localhost ~]# echo "chengke index.html" > /opt/chengke/index.html
# 创建好后,再次访问就可以成功了。
[root@localhost ~]# curl www.chengke.com
chengke index.html
几个指令介绍
root 指令
我们修改 /etc/nginx/conf.d/chengke.conf 配置文件
[root@localhost ~]# vim /etc/nginx/conf.d/chengke.conf
server {listen 80;server_name www.chengke.com;access_log /var/log/nginx/chengke/access.log;error_log /var/log/nginx/chengke/error.log;location / {root /opt/chengke;index index.html;}
}
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# curl www.chengke.com
chengke index.html初始 root 指令配置:在最初的 /etc/nginx/conf.d/chengke.conf 配置文件中,使用了 root 指令来指定网站的根目录。对于 location / 这个配置块,root /opt/chengke; 意味着当用户访问根路径(如 www.chengke.com)时,Nginx 会从 /opt/chengke 目录下寻找资源,index index.html; 表示优先寻找 index.html 文件。当执行 curl www.chengke.com 时,返回 chengke index.html,说明 Nginx 成功从指定目录读取并返回了文件内容。
alias 指令
# 修改配置文件
[root@localhost ~]# vim /etc/nginx/conf.d/chengke.conf
server {listen 80;server_name www.chengke.com;access_log /var/log/nginx/chengke/access.log;error_log /var/log/nginx/chengke/error.log;location /test.html {root /opt/chengke;index index.html;}location /demo.html {alias /opt/chengke;index index.html;}
}
# 在 /opt/chengke 目录下创建 test.html 和 demo.html
[root@localhost ~]# echo "test.html" > /opt/chengke/test.html
[root@localhost ~]# echo "demo.html" > /opt/chengke/demo.html
# 验证文件是否创建成功
[root@localhost ~]# ls /opt/chengke/
demo.html index.html test.html
# 重新启动服务
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# curl www.chengke.com/test.html
test.html
[root@localhost ~]# curl www.chengke.com/demo.html
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>解决:location /demo.html {alias /opt/chengke/demo.html;index index.html;}
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# curl www.chengke.com/demo.html
demo.html添加 alias 指令配置:之后修改配置文件,添加了两个新的 location 块。对于 location /test.html,使用 root /opt/chengke;,这和之前的原理一样,访问 www.chengke.com/test.html 时,Nginx 会去 /opt/chengke 目录下找 test.html 文件,所以 curl www.chengke.com/test.html 返回 test.html。而对于 location /demo.html,使用了 alias /opt/chengke;,原本预期访问 www.chengke.com/demo.html 能直接返回 /opt/chengke 目录下的 demo.html 内容,但实际返回了 301 重定向的页面。这是因为 alias 指令的使用方式有误,alias 指令指定的路径应该精确到文件(如果是单个文件的映射)或目录(如果是目录映射),并且目录后面需要加上斜杠 / 来表示这是一个目录。
修正 alias 指令配置:正确的配置应该是 alias /opt/chengke/demo.html;,这样就明确告诉 Nginx,当访问 www.chengke.com/demo.html 时,直接返回 /opt/chengke/demo.html 的内容。修改配置并重启 Nginx 后,执行 curl www.chengke.com/demo.html 成功返回 demo.html。location里面的参数解释:/demo.html:这是匹配的请求路径。表示当客户端请求的 URL 路径以 /demo.html 开头时,Nginx 会应用这个 location 块中的配置。
alias /opt/chengke;:alias 指令用于指定一个目录路径,当请求匹配到 location 时,Nginx 会将请求映射到该目录。在这个例子中,它将请求映射到 /opt/chengke 目录。不过需要注意的是,原配置存在问题,根据 Nginx 的规则,如果使用 alias 定义了一个文件或目录,那么在请求该路径时,Nginx 会严格按照 alias 指定的路径来查找,而不会像使用 root 指令那样进行额外的拼接。所以原配置中访问 /demo.html 时出现 301 错误,是因为 Nginx 没有找到正确的文件路径。修改后的 alias /opt/chengke/demo.html; 才是正确的配置,这样 Nginx 就能准确找到 demo.html 文件。
index index.html;:index 指令用于指定当请求的是一个目录时,Nginx 会优先查找并返回的默认文件名。这里指定为 index.html,意味着如果请求的是一个目录,且该目录下存在 index.html 文件,Nginx 会将其作为默认页面返回。
location
精确匹配
在 location 中可以使用 = 来进行精确匹配。
[root@localhost ~]# vim /etc/nginx/conf.d/chengke.conf
server {listen 80;server_name www.chengke.com;location = /test.html {root /opt/chengke;index index.html;}
}
# 重新启动服务
[root@localhost ~]# systemctl restart nginx
# 分别创建三个与 test.html 相似的文件
[root@localhost ~]# echo "Test.html" > /opt/chengke/Test.html
[root@localhost ~]# echo "test1.html" > /opt/chengke/test1.html
[root@localhost ~]# echo "test.htm" > /opt/chengke/test.htm
# 测试test.html,它是可以精确匹配的
[root@localhost ~]# curl www.chengke.com/test.html
test.html
# 由于不能精确匹配,所以报 404 错误
[root@localhost ~]# curl www.chengke.com/test.htm
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
[root@localhost ~]# curl www.chengke.com/test1.html
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
区分大小写
通过在 location 上配置 ~ 来进行区分大小写的匹配。
[root@localhost ~]# vim /etc/nginx/conf.d/chengke.conf
server {listen 80; server_name www.chengke.com;location ~ /test.html {root /opt/chengke;index index.html;}
}
# 重新启动服务
[root@localhost ~]# systemctl restart nginx
# 测试可以匹配上的
[root@localhost ~]# curl www.chengke.com/test.html
test.html
# 由于是区分大小写的,所以 test.html 和 Test.html 是不一要的,所以它不能匹配成功
[root@localhost ~]# curl www.chengke.com/Test.html
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
不区分大小写
在 location 中使用 ~* 来匹配不区分大小写匹配。
[root@localhost ~]# vim /etc/nginx/conf.d/chengke.conf
server {listen 80;server_name www.chengke.com;location ~* /test.html {root /opt/chengke;index index.html;}
}
# 重新启动服务
[root@localhost ~]# systemctl restart nginx
# 测试小写
[root@localhost ~]# curl www.chengke.com/test.html
test.html
# 测试大写
[root@localhost ~]# curl www.chengke.com/Test.html
Test.html
基于端口配置
首先创建端口配置文件,假设我们监听的是 9000 端口,那么我们创建的配置文件就叫 9000.conf[root@localhost ~]# vim /etc/nginx/conf.d/9000.conf
server {listen 9000;server_name www.chengke.com;root /opt/chengke/9000;
}
# 创建目录
[root@localhost ~]# mkdir /opt/chengke/9000
# 启动服务
[root@localhost ~]# systemctl restart nginx
# 创建文件
[root@localhost ~]# echo "9000 index.html" > /opt/chengke/9000/index.html
# 测试
[root@localhost ~]# curl www.chengke.com:9000
9000 index.html
基于IP地址配置
我们在 /etc/nginx/conf.d 目录下新 135.conf 配置文件(这里根据自己的IP命名,不是必要)
[root@localhost ~]# ip a show ens160
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:e1:bb:6b brd ff:ff:ff:ff:ff:ffaltname enp3s0inet 192.168.182.129/24 brd 192.168.182.255 scope global dynamic noprefixroute ens160valid_lft 1762sec preferred_lft 1762secinet6 fe80::20c:29ff:fee1:bb6b/64 scope link noprefixroute valid_lft forever preferred_lft forever[root@localhost ~]# ip ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:e1:bb:6b brd ff:ff:ff:ff:ff:ffaltname enp3s0inet 192.168.182.129/24 brd 192.168.182.255 scope global dynamic noprefixroute ens160valid_lft 1755sec preferred_lft 1755secinet6 fe80::20c:29ff:fee1:bb6b/64 scope link noprefixroute valid_lft forever preferred_lft forever
两个命令都能查看
# 创建配置文件
[root@localhost ~]# vim /etc/nginx/conf.d/129.conf
server {listen 80;server_name 192.168.72.129;root /opt/chengke/129;
}
# 创建相关目录,用于存放项目文件
[root@localhost ~]# mkdir /opt/chengke/129 -p
# 重新启动服务
[root@localhost ~]# systemctl restart nginx
# 创建基于IP访问的首页
[root@localhost ~]# echo "129 index.html" > /opt/chengke/129/index.html
# 测试基于IP地址的配置
[root@localhost ~]# curl 192.168.182.129
129 index.html
账号验证访问配置
安装加密工具
[root@localhost ~]# dnf install httpd-tools -y
Last metadata expiration check: 1:47:05 ago on Sun 23 Mar 2025 02:40:52 PM CST.
Dependencies resolved.
==========================================================================================================Package Architecture Version Repository Size
==========================================================================================================
Installing:httpd-tools x86_64 2.4.62-1.el9 appStream 86 k
Installing dependencies:apr x86_64 1.7.0-12.el9_3 appStream 126 kapr-util x86_64 1.6.1-23.el9 appStream 97 kapr-util-bdb x86_64 1.6.1-23.el9 appStream 14 k
Installing weak dependencies:apr-util-openssl x86_64 1.6.1-23.el9 appStream 17 k
Transaction Summary
==========================================================================================================
Install 5 Packages
Total size: 340 k
Installed size: 737 k
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transactionPreparing : 1/1 Installing : apr-1.7.0-12.el9_3.x86_64 1/5 Installing : apr-util-bdb-1.6.1-23.el9.x86_64 2/5 Installing : apr-util-openssl-1.6.1-23.el9.x86_64 3/5 Installing : apr-util-1.6.1-23.el9.x86_64 4/5 Installing : httpd-tools-2.4.62-1.el9.x86_64 5/5 Running scriptlet: httpd-tools-2.4.62-1.el9.x86_64 5/5 Verifying : apr-1.7.0-12.el9_3.x86_64 1/5 Verifying : apr-util-1.6.1-23.el9.x86_64 2/5 Verifying : apr-util-bdb-1.6.1-23.el9.x86_64 3/5 Verifying : apr-util-openssl-1.6.1-23.el9.x86_64 4/5 Verifying : httpd-tools-2.4.62-1.el9.x86_64 5/5
Installed products updated.
Installed:apr-1.7.0-12.el9_3.x86_64 apr-util-1.6.1-23.el9.x86_64 apr-util-bdb-1.6.1-23.el9.x86_64 apr-util-openssl-1.6.1-23.el9.x86_64 httpd-tools-2.4.62-1.el9.x86_64
Complete!
创建访问账号
# 创建zhangsan用户,它的密码是123456,用户信息保存在 passwdfile 文件中
[root@localhost ~]# htpasswd -cb passwdfile zhangsan 123456
Adding password for user zhangsan# 创建lisi用户,它的密码是123456,用户信息保存在 passwdfile 文件中
[root@localhost ~]# htpasswd -b passwdfile lisi 123456
Adding password for user lisihtpasswd是一个用于创建和管理密码文件的工具,通常用于为需要身份验证的网站或服务生成用户名和密码的存储文件,其作用主要体现在以下几个方面:
基本身份验证:在 Web 服务器等环境中,htpasswd用于创建和维护包含用户名和加密密码的文件。当用户访问受保护的资源时,服务器会使用该文件来验证用户提供的用户名和密码是否正确,以此决定是否允许用户访问。
保护网站资源:可以通过.htaccess文件配合htpasswd生成的密码文件,对网站的特定目录或文件进行访问限制。只有提供了正确用户名和密码的用户才能访问这些受保护的内容,从而增加网站资源的安全性。
与多种服务器兼容:htpasswd生成的密码文件格式被许多 Web 服务器和应用程序所支持,如 Apache、Nginx 等。这使得它在不同的服务器环境中都能方便地用于实现用户身份验证功能,具有较好的通用性和可移植性。
# 查看密码文件
[root@localhost ~]# cat passwdfile
zhangsan:$apr1$bVzZtwGq$tzqy/ezWyV1yF2FEsKFvo0
lisi:$apr1$SpgMNXrj$3G4z2KiT2CBlEB3JXHaim0
[root@localhost conf.d]# ll passwdfile
-rw-r--r--. 1 root root 90 Mar 23 17:16 passwdfile
# 修改密码文件的权限
[root@localhost conf.d]# chmod 600 passwdfile
[root@localhost conf.d]# chown nginx passwdfile
[root@localhost conf.d]# ll passwdfile
-rw-------. 1 nginx root 90 Mar 23 17:16 passwdfile
映射IP和域名
# 配置IP和域名的映射
[root@localhost ~]# echo "192.168.72.135 www.account.com" >> /etc/hosts
# 测试配置是否正确
[root@localhost ~]# ping www.account.com
PING www.account.com (192.168.72.135) 56(84) bytes of data.
64 bytes from www.chengke.com (192.168.72.135): icmp_seq=1 ttl=64 time=0.050 ms
64 bytes from www.chengke.com (192.168.72.135): icmp_seq=2 ttl=64 time=0.127 ms
^C
--- www.account.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1019ms
rtt min/avg/max/mdev = 0.050/0.088/0.127/0.038 ms
创建nginx配置文件
server {listen 80;server_name www.account.com;root /opt/account;location /admin {auth_basic "input you password";auth_basic_user_file /etc/nginx/conf.d/passwdfile;}
}
创建目录和文件
# 创建目录
[root@localhost ~]# mkdir /opt/account
# 创建文件
[root@localhost ~]# echo account content > /opt/account/index.html
# 创建目录
[root@localhost ~]# mkdir /opt/account/admin
# 创建文件
[root@localhost ~]# echo account admin content > /opt/account/admin/index.html
功能测试
# 1. 启动服务
[root@localhost conf.d]# systemctl start nginx
# 2. 访问根下面的index.html是可以的。
[root@localhost conf.d]# systemctl start nginx
[root@localhost conf.d]# curl http://www.account.com
account content
# 3. 但是访问admin下的index.html则不能访问,需要有权限
[root@localhost conf.d]# curl http://www.account.com/admin/index.html
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
出现 401 Authorization Required 错误是因为你配置了 auth_basic 基本身份验证,而在使用 curl 访问时没有提供正确的用户名和密码信息,Nginx 拒绝了你的请求。
auth_basic 指令开启了基本身份验证功能,auth_basic_user_file 指令指定了包含用户名和密码信息的文件路径。当客户端发起请求时,Nginx 会检查请求中是否包含有效的身份验证凭据,如果没有或者凭据不正确,就会返回 401 错误。
如果你想使用 curl 进行身份验证并成功访问该资源,可以按照以下方式提供用户名和密码:
假设你在 auth_basic_user_file 指定的文件(比如 /root/password)中设置了用户名 user 和密码 password,你可以使用以下命令:curl -u user:password http://www.account.com
这里的 -u 选项用于指定用户名和密码,格式为 用户名:密码。这样 curl 就会在请求中带上身份验证信息,Nginx 验证通过后就会返回相应的内容。
另外,确保你的用户名和密码与 auth_basic_user_file 文件中设置的一致,并且该文件的权限设置正确,Nginx 能够读取该文件获取身份验证信息。
# 4.在访问时加上用户名和密码就可以成功访问了。
[root@localhost conf.d]# curl http://zhangsan:123456@www.account.com/admin/index.html
account admin content主播遇到的问题:输入账号后依然会出现500的情况。
tail -n 50 /var/log/nginx/error.log 查询错误日志
2025/03/24 18:37:31 [crit] 38975#38975: *13 open() "/etc/nginx/conf.d/passwdfile" failed (13: Permission denied), client: 192.168.182.129, server: www.account.com, request: "GET /admin/index.html HTTP/1.1", host: "www.account.com"
2025/03/24 18:39:23 [crit] 38975#38975: *14 open() "/etc/nginx/conf.d/passwdfile" failed (13: Permission denied), client: 192.168.182.129, server: www.account.com, request: "GET /admin/index.html HTTP/1.1", host: "www.account.com"
部分
显示没有权限,但是其实跟修改权限没有关系:以下方法可以解决,不过也不一定会遇到这个问题检查并调整 SELinux 或 AppArmor 配置
若你启用了 SELinux 或者 AppArmor,需要检查它们的配置是否对 Nginx 进程访问 /etc/nginx/conf.d/accounts 文件进行了限制。
SELinux:你可以临时禁用 SELinux 来验证是否是它导致的问题:setenforce 0不过,这只是临时解决办法,不建议长期禁用 SELinux。你可以通过修改 SELinux 策略来允许 Nginx 访问该文件:semanage fcontext -a -t httpd_sys_content_t "/etc/nginx/conf.d/accounts"
restorecon -v "/etc/nginx/conf.d/accounts"AppArmor:检查 AppArmor 配置文件(通常位于 /etc/apparmor.d/ 目录下),确保 Nginx 的配置文件允许访问 /etc/nginx/conf.d/accounts 文件。[root@localhost conf.d]# setenforce 0
[root@localhost conf.d]# curl http://zhangsan:123456@www.account.com/admin/index.html
account admin content
相关文章:
详细Linux中级知识(不断完善)
Nginx服务配置 基于主机名配置 映射IP和主机名 [rootlocalhost ~]# vim /etc/hosts 192.168.72.135 www.chengke.com chengke[rootlocalhost ~]# echo "192.168.72.135 www.xx.com" >> /etc/hosts以上是两种方法,前面是你的IP地址,后…...
Softmax温度调节与注意力缩放:深度神经网络中的平滑艺术
Softmax温度调节与注意力缩放:深度神经网络中的平滑艺术 在深度学习的精密机械中,有些细微的调整机制往往被视为理所当然,却实际上蕴含着深刻的数学洞察和巧妙的工程智慧。今天,我们将探讨两个看似独立却本质相通的机制ÿ…...
python打包辅助工具
python打包辅助工具 PyInstaller 是一个非常流行的 Python 应用程序打包工具,它可以将 Python 脚本及其依赖项打包成独立的可执行文件,方便在没有 Python 环境的机器上运行。关于PyInstaller,可参见:https://blog.csdn.net/cnds1…...
jangow靶机攻略
配置网卡 VMware需要配置,不配置扫不到ip,VirtualBox正常打开ip会直接显示出来 网卡配置都改成NAT 打开虚拟机,第一个框选第二行,回车 选第二个,按e键 进入下一个框后,将ro 后面的修改为 rw signin init/bin/bash 按…...
【大模型LLM第十四篇】Agent学习之anthropic-quickstarts Agent
前言 对于anthropic api的快速使用,在github上有几个example Customer Support Agent:由 Claude 提供支持的客户支持代理。该项目演示了如何利用 Claude 的自然语言理解和生成功能来创建可访问知识库的 AI 辅助客户支持系统。Financial Data Analyst &…...
MonIo部署
1、命令行安装 访问monio官网下载应用程序 # wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20250228095516.0.0-1.x86_64.rpm -O minio.rpm # sudo dnf install minio.rpm # mkdir ~/minio # minio server ~/minio --console-address :90012、dock…...
深入理解智能家居领域中RS485、Modbus、KNX 和 Zigbee协议概念
首先详细介绍一下 RS485 和 Modbus 这两个在工业自动化和数据通讯领域中非常重要的概念。 RS485 1. 定义与特点 RS485 标准:RS485 是一种串行通信标准,也称为TIA-485标准,主要用于数据传输。它规定了物理层的电气特性,与数据格式…...
Spring Boot深度解析:从核心原理到最佳实践
一、Spring Boot概述 Spring Boot作为Spring生态中的"游戏规则改变者",自2014年发布以来彻底改变了Java企业级应用的开发方式。它通过四大核心特性显著提升了开发效率: 自动配置:基于类路径和已有Bean的智能默认配置起步依赖:简化Maven/Gradle依赖管理的Starter…...
MapReduce过程中reduce task的数量是如何确定的?
在Hadoop MapReduce及Hive中,numReduceTasks(Reduce任务数量)的确定由用户显式设置、框架自动估算、作业特性约束三方面共同决定。以下是详细解析及示例: 1. 用户显式设置 用户可以通过代码或配置参数直接指定Reduce任务数&#…...
【euclid】21 3D包围盒模块(box3d.rs)
box3d.rs文件定义了一个三维轴对齐的矩形框(Box3D),使用最小和最大坐标来表示。矩形框在坐标类型(T)和单位(U)上是泛型的。代码提供了多种方法来操作和查询矩形框,包括求交集、并集、…...
用selenium+ChromeDriver豆瓣电影 肖申克的救赎 短评爬取(pycharm 爬虫)
一、豆瓣电影 肖申克的救赎 短评url=https://movie.douban.com/subject/1292052/comments 二、基本知识点讲解 1. Selenium 的基本使用 Selenium 是一个用于自动化浏览器操作的库,常用于网页测试和爬虫。代码中使用了以下 Selenium 的核心功能: webdriver.Chrome: 启动 Chr…...
mysql入门操作
目录 一,MySQL简述 1,什么是MySQL 2,什么是SQL 3,SQL的分类 二,数据库的数据存储类型 1,数值类型 2,字符串类型 3,时间和日期类型 三,数据库的基本操作 1&…...
机械臂【逆运动学】
回顾正运动学fk: IK: 几何法 代数法 六轴 456轴交再同一点 有解析解 下列公式为正运动学部分结论 a和d是长度 ,theta和alfa是角度 **疑问:alfa00? Z轴互相平行 ** 已知末端要在空间XYZ处如下 绿色项&#x…...
思库拉水厂开业庆典千人大会回顾
近日,思库拉离子水厂在广州隆重举办了开业盛典,现场汇聚了逾千名嘉宾。此次盛会不仅是对思库拉离子水厂正式投产的庆祝,更是对思库拉品牌未来蓝图的一次展示。 现场氛围热烈,洋溢着浓厚的喜庆气息。参与者来自五湖四海,既有思库拉的忠实拥趸,也有对思库拉产品充满兴趣的潜在消费…...
将Wi-Fi模块订阅MQTT主题以获取最新的固件版本推送信息
将Wi-Fi模块订阅MQTT主题以获取最新的固件版本推送信息,是一种常见的物联网(IoT)应用场景。这种设计可以实现远程监控和设备的OTA(Over-The-Air)升级功能。以下是详细的实现步骤和技术细节: 一、系统架构概…...
Netty源码—5.Pipeline和Handler一
大纲 1.Pipeline和Handler的作用和构成 2.ChannelHandler的分类 3.几个特殊的ChannelHandler 4.ChannelHandler的生命周期 5.ChannelPipeline的事件处理 6.关于ChannelPipeline的问题整理 7.ChannelPipeline主要包括三部分内容 8.ChannelPipeline的初始化 9.ChannelPi…...
Vue 中的nextTick函数的原理、作用及使用场景。
大白话Vue 中的nextTick函数的原理、作用及使用场景 在 Vue 里,nextTick 函数是个超实用的工具,它能让你在 DOM 更新完成之后再执行代码。为了能更好地理解 nextTick 函数的原理,咱们就来深入剖析一下。 核心思路 Vue 里的数据更新是异步执…...
详细讲解css的穿透方法
样式穿透(CSS穿透)的几种方法,包括在Vue中使用::v-deep、>>>、/deep/,还有pointer-events属性。还有关于Shadow DOM和::part伪元素的内容。接下来我会把这些方法分类,并详细说明每种方法的适用场景和注意事项…...
深入理解 tree 命令行工具:目录结构可视化的利器
文章目录 前言1. 什么是 tree 命令?安装 tree 2. tree 的基本用法显示当前目录的树状结构显示指定目录的树状结构 3. tree 的常用选项3.1 显示隐藏文件3.2 排除特定目录或文件3.3 限制递归深度3.4 显示文件大小3.5 显示文件的权限信息3.6 将输出保存到文件 4. 实际应…...
【QA】QT中事件和信号的区别以及联系是什么?
在 Qt 中,事件(Event) 和 信号与槽(Signals & Slots) 是 GUI 编程的核心机制,它们既有联系又有本质区别。以下从底层原理、触发流程、代码实现、适用场景四个维度展开对比,并通过大量示例说…...
C++实用函数:find与find_if
本篇来介绍C++中find和find_if函数的使用,通过多个实例来演示。 find用于基础的查找功能,find_if可以实现更复杂的匹配查找条件。 1 find 1.1 函数原型 template <class InputIterator, class T> InputIterator find ( InputIterator first, InputIterator last, c…...
全面了解 Cookies、Session 和 Token
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
酷淘商场项目【从零到一详解】Web端
✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…...
如何转移虚拟主机?最新虚拟主机迁移方法
转移网站并不困难,但选择正确的选项和最佳程序才是关键。网站托管服务被视为当今数字世界的基石,全球有18 亿个网站。网站所有者可以通过下载备份、将其上传到新服务器并指向域名来手动转移网站。他们还可以通过新网站托管商的助手请求来移动网站。对于初…...
JVM 核心知识点总结
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
无人机数据链技术详解,无人机图传数传技术,无人机数据传输技术原理
以下是对无人机数据链技术、无人机图传数传技术以及无人机数据传输技术原理的详细解释: 无人机数据链技术 无人机数据链是任务机、地面控制站之间,以及任务机与中继机、武器系统或其它操作平台之间,按照约定的通信协议和信息传输方式&#…...
【Linux】同步原理剖析及模拟BlockQueue生产消费模型
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
【AVRCP】GOEP互操作性深度解析:蓝牙封面艺术传输的技术实现与演进
目录 一、技术基础:协议架构与核心概念 1.1 GOEP协议体系解析 1.2 IrOBEX协议关键技术 1.3 版本强制性要求 1.4 关键特性对比(GOEP v2.0 vs v1.1) 1.5 关键技术实现细节 1.6 GOEP v2.0互操作性要求 1.7 IrOBEX v1.5互操作性要求 二、…...
三分钟读懂微服务
一、什么是微服务 微服务,简单来说,就是把一个庞大复杂的软件系统,拆分成一个个小型的、独立的服务模块。打个比方,一个大型商场就如同传统的单体架构软件系统,里面所有的店铺、设施都紧密关联在一起。而微服务架构下…...
《Oracle DBA入门实战:十大高频问题详解与避坑指南》
Oracle DBA 入门作业十问十答 本文为 Oracle DBA 入门作业整理,涵盖工具使用、配置管理及权限控制等核心知识点,适合新手快速上手。 如有疑问或补充,欢迎评论区交流! 1. DBA 常用工具有哪些? Oracle Universal Instal…...
深入剖析 Android Compose 框架的自动动画:AnimatedVisibility 与 AnimatedContent(二十四)
深入剖析 Android Compose 框架的自动动画:AnimatedVisibility 与 AnimatedContent 引言 在 Android 应用开发中,动画是提升用户体验的重要手段。它能够让界面元素的显示与隐藏、状态的切换变得更加自然和流畅,避免生硬的变化给用户带来不佳…...
【线程安全问题的原因和方法】【java形式】【图片详解】
在本章节中采用实例图片的方式,以一个学习者的姿态进行描述问题解决问题,更加清晰明了,以及过程中会发问的问题都会一一进行呈现 目录 线程安全演示线程不安全情况图片解释: 将上述代码进行修改【从并行转化成穿行的方式】不会出…...
Cocos Creator Shader入门实战(六):使用setProperty动态设置材质属性,以及材质常用接口
引擎:3.8.5 您好,我是鹤九日! 回顾 上篇文章,我们主要讲解了关于材质的使用,主要有这么几点: 一、没有Effect资源,材质无从说起。 二、材质的构建,支持编译器和代码的动态构建 三…...
编程题记录3
九宫幻方 题目链接:https://www.lanqiao.cn/problems/100/learning/?page1&first_category_id1&second_category_id3&tags%E7%9C%81%E8%B5%9B&tag_relationintersection 先旋转、镜像得到所有的情况,可以发现情况是可以暴力得出的。…...
Geotools自动识别SLD并生成图例图片实战-以Polygon数据为例
目录 前言 一、Geotools与SLD制图基础 1、SLD是什么 2、SLD有什么用 二、SLD文件的解析与读取 1、SLD结构介绍 2、SLD实例展示 3、SLD读取方法 三、图例生成与展示 1、图例生成流程 2、图例生成实战 3、图例生成展示 四、结论 前言 在地理信息系统(GIS&…...
windows docker如何修改 默认的Container memory usage
参考:https://forums.docker.com/t/docker-on-windows-11-with-wsl2-does-not-use-the-memory-i-set-in-wslconfig/144404/3 参考:https://learn.microsoft.com/en-us/windows/wsl/wsl-config...
LabVIEW液压传动系统教学仿真平台
本文介绍了一种基于LabVIEW的液压传动系统教学仿真平台,该平台采用“老师讲解、线上仿真、线下操作”的复合实验模式,旨在提高实验教学的效率与安全性。通过实例验证,展示了该平台在教学和实际操作中的应用效果,同时也为液压传动系…...
Java实习生面试题(2025.3.23 be)
一、v-if与v-show的区别 v-show 和 v-if 都是 Vue 中的条件渲染指令,它们的主要区别在于渲染策略:v-if 会根据条件决定是否编译元素,而 v-show 则始终编译元素,只是通过改变 CSS 的 display 属性来控制显示与隐藏。 二、mybatis-…...
OpenCV第2课 OpenCV的组成结构与图片/视频的加载及展示
1.OpenCV 的组成结构 2.OpenCV 的具体模块 3. 图像的读取 4. 视频的读取 1.OpenCV 的组成结构 OpenCV 是由很多模块组成的,这些模块可以分成很多层: 最底层是基于硬件加速层(HAL)的各种硬件优化。再上一层是opencv_contrib 模块所包含的OpenCV 由其他开发人员所贡献的代…...
Blender导出fbx到Unity找不到贴图的问题
fbx导入Unity材质能不能找到贴图是一件玄学的事情。常见的情况是有些材质能找到,有些找不到: 可能有用的方法 解决方法1:把贴图文件复制过去,模型reimport; 解决方法2:导出时路径模式选复制,内…...
kafka的文章
1.面试的问题 要点 至多一次、恰好一次数据一致性超时重试、幂等消息顺序消息挤压延时消息 1.1 kafaka 生产消息的过程。 在消息发送的过程中,涉及到了两个线程,一个是main 线程,一个是sender 线程。在main 线程中创建了一个双端队列 Reco…...
Go常见问题与回答(下)
文章目录 1、通过指针变量 p 访问其成员变量 name,有哪几种方式?2、代码,说出结果3、扩容提,代码,说出结果4、指出下面这段代码的错误之处5、是否通过编译6、关于字符串连接,下面语法正确的是7、关于iota&a…...
vue3中如何缓存路由组件
在 Vue3 中缓存路由组件,主要借助<keep-alive>组件来实现,具体方法如下: 1. 全局缓存路由组件 在 App.vue 等根组件中,直接将<router-view>包裹在<keep-alive>标签内,这样所有的路由组件都会被缓存…...
云服务器怎么防御ddos攻击呢?
防御DDoS攻击是保障云服务器稳定运行的关键措施,以下是综合多种防护策略的详细方案: 1. 启用云服务商提供的DDoS防护服务 高防IP/流量清洗: 将业务流量接入云服务商的高防IP,由专业清洗中心过滤恶意流量,仅放行正常请求…...
Log4j2 的核心实现和源码分析
Log4j2 的核心实现和源码分析 1. 核心组件 1.1 Logger 功能:负责记录日志信息。实现:org.apache.logging.log4j.Logger 接口,org.apache.logging.log4j.core.Logger 类。1.2 Appender 功能:负责将日志信息输出到不同的目的地,如文件、控制台等。实现:org.apache.loggin…...
【深度学习】【目标检测】【OnnxRuntime】【C++】YOLOV3模型部署
【深度学习】【目标检测】【OnnxRuntime】【C】YOLOV3模型部署 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【目标检测】【OnnxRuntime】【C】YOLOV3模型部署前言Windows平台搭建依赖环境模型转换--pytorch转onnxONNXRuntime推…...
四种跨模态行人重识别可视化方法
1.Gradcam 2.检索可视化 3.tsne图 4.距离分布 需要的私聊,代码需要付费...
8个DeepSeek文章润色指令
今天道叔给各位文字工作者安利DeepSeek的8个神仙级润色指令(附真实案例拆解),建议搭配冰美式食用更佳↓↓↓ 一、【学术黑话翻译器】 适用场景:给投资人看的BP/行业白皮书/专家访谈实录 指令公式:"将以下内容转化为通俗易懂的行业洞察…...
解决PowerShell下Git中文乱码问题
解决PowerShell下Git中文乱码问题 在使用Git进行版本控制时,许多开发者可能会遇到中文乱码的问题,尤其是在Windows环境下使用PowerShell时。这不仅影响代码的阅读和提交,还可能导致一些不可预见的错误。本文将详细探讨如何在PowerShell下解决…...
oracle数据库(数据库启动关闭/sqlplus登录及基本操作/设置字符集/distinct去重)
目录 1. Oracle数据库启动 2. Oracle数据库关闭 3. sqlplus登录Oracle数据库 3.1 使用sqlplus登录Oracle数据库 3.2 使用sqlplus登录Oracle数据库 3.3 远程登录 3.4 解锁用户 3.5 修改用户密码 3.6 查看当前语言环境 4. sqlplus基本操作 4.1 显示当前用户 4.2 查看当前用户…...