不是所有的网站都是www开头,也不是所有网站都以.com结尾。
比如:
QQ:im.qq.com
一、简介
1、什么是www

1 、 www 所用的协议:浏览器怎样向 web 服务器请求数据以及服务器怎样把文档传送给浏览器呢?这就是由http 协议来定义的,( HyperTextTransportProtocol , HTTP ,超文本传输协议)。2 、 www 服务器需要提供可让客户端浏览的平台。目前最主流的 Web 服务器是 Apache 、 Microsoft 的Internet信息服务器( InternetInformationServices , IIS )和 unixnginx 。3、服务器所提供的最主要数据是超文本标记语言( HyperTextMarkupLanguage, HTML)、多媒体文件(图片、影像、声音、文字等,都属于多媒体或称为超媒体),HTML只是一些纯文本数据,通过所谓的标记来规范所要显示的数据格式。4 、客户端收到服务器的数据之后需要软件解析服务器所提供的数据,最后将效果呈现在用户的屏幕上。那么著名的浏览器就有内建在Windows 操作系统内的 IE 浏览器了,还有 Firefox 浏览器和 Google 的chrome浏览器。
2、网址及HTTP简介
- URL:Uniform Resource Locator ,统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。
URL区别于URI:URI是网址地下更详细的信息,URI包含URL,范围更广。比如:http://www.baidu.com/haha/xiix/test,其中/haha/xixi/test 是URI。
- 网址格式:<协议>://<主机或主机名>[:port]/<目录资源,路径>
- 浏览器常支持的协议有:http、https、ftp(明文传输不安全)等。
- 主机地址或者主机名:主机地址就是服务器在因特网所在的IP地址。如果是主机名的话,那么就需要域名解析了。
- 端口号(port):http为80,https为443 (IANA:互联网数字分配机构
- 0-1023:众所周知,永久地分配给固定的应用程序使用,特权端口(只有管理员有权限启用并让进程监听)
- 1024-41951 :亦为注册端口,但要求不是特别严格,分配给程序注册为某应用使用: 3306/TCP(3306端口是数据库的)
- 41952-60000:客户端程序随机使用的端口,动态端口,或私有端口
- http请求方法:在http通信中,每个http请求报文都包含一个方法,用以告诉web服务器端需要执行哪些具体的动作,这些动作包括:获取指定web页面、提交内容到服务器、删除服务器上资源文件等。
-
HTTP方法
作用描述 GET 客户端请求指定资源i信息,服务器返回指定资源
HEAD 只请求响应报文中的HTTP首部
POST 将客户端的数据提交到服务器,例:注册表单 PUT 用从客户端向服务器传送的数据取代指定的文档内容。 DELETE 请求服务器删除Request-UR所表示的资源。 MOVE 请求服务器讲指定的页面移至另一个网络地址。
-
- 状态代码:由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。
- 1xx:指示信息一一表示请求已接收,继续处理
- 2xx:成功一一表示请求已被成功接收、理解、接受
- 3xx:重定向一一要完成请求必须进行更进一步的操作
- 4xx:客户端错误一一请求有语法错误或请求无法实
- 5xx:服务器端错误一一服务器未能实现合法的请求现
常见状态代码、状态描述说明如下:
代码 代码说明 200 ok 客户端请求成功 301 Moved Permanently 请求的网页已永久跳转到新位置 400 Bad Request 客户端请求语法错误,不能被服务器所理解 401 Unauthorized 请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域一起使用; 403 Forbidden(禁止访问) 服务器收到请求,但是拒绝提供服务 404-Not Found 服务器找不到请求的页面,请求资源不存在,例如:输入了错误的URL 500 - Internal Server Error 内部服务器错误,服务器发生了不可预期的错误 502 - Bed Gateway 坏的网关,一般是网关服务器请求后服务时,后端服务没有按照http协议正确返回结果 503 - Service Unavailable 服务不可用 可能因为超载或停机维护,服务器当前不能处理客户端的请求,一段时间后可能恢复正常 504 - Gateway Timeout(网关超时) 一般是网关服务器请求后端服务时,后端服务没有在特定的时间内完成服务。
反向代理——代理服务器;
正向代理——代理客户端;
#查看网站状态码信息
#访问百度,curl将该页面下载下来,-s是静默模式,-w是显示后后面http_code的参数,-o是将输出写入黑洞中;
[root@master0101 ~]curl -s -w "%{http_code}\n" -o /dev/null www.baidu.com
200
- HTTP 报文: http 报文中有很多行内容,这些行的字段内容都是由一些 ASCII 码串组成,但各个字段的长度是不同的。
- http 报文分类:(1)请求报文:从web 客户端发往 web 服务器的 http报文;(2)响应报文:从web服务器发往web客户端的http报文
- http 请求报文由请求行、请求头部、空行和请求报文主体几个部分组成:
- http 响应报文由起始行、响应头部、空行和响应报文主体这几个部分组成:、
#-v显示响应报文的具体信息 [root@master0101 html]#curl 192.168.168.34 -v
- MIME(Multipurpose Internet Mail Extension,多用途因特网邮件扩展)最初是为了解决在不同的电子邮件系统之间搬移报文时存在的问题。后来http也支持了这个功能,用它来描述数据并标记不同的数据内容类型。 当 web 服务器响应 http 请求时,会为每一个 http 对象数据加一个 MIME 类型。当 web 浏览器获取到服务器返回的对象时,会去查看相关的MIME 类型,并进行相应的处理。MIME 类型存在于 HTTP 响应报文的响应头部信息里,它是一种文本标记,表示一种主要的对象类型和一个特定的子类型。常见的MIME 类型:
3、http协议请求的工作流程
( 1 )终端客户在 web 浏览器地址栏输入访问地址 http://www.ceshi.com:80/index.html( 2 ) web 浏览器请求 DNS 服务器把域名 www.ceshi.com 解析成 web 服务器的 IP 地址( 3 ) web 浏览器将端口号(默认是 80 )从访问地址( URL )中解析出来( 4 ) web 浏览器通过解析后的 ip 地址及端口号与 web 服务器之间建立一条 TCP 连接( 5 )建立 TCP 连接后, web 浏览器向 web 服务器发送一条 HTTP 请求报文( 6 ) web 服务器响应并读取浏览器的请求信息,然后返回一条 HTTP 响应报文。( 7 ) web 服务器关闭 HTTP 连接,关闭 TCP 连接, web 浏览器显示访问的网站内容到屏幕上。
二、web服务器的类型
1、仅提供用户浏览的单向静态网页
静态解析web服务软件:
- Apache:中小型web服务的主流,web服务器中的老大哥。http://www.apache.org/
- Nginx:大型网站web服务的主流,曾经web服务器中的初生牛犊,现已长大。http://www.ninx.org/
- Nginx的分支Tengine(http://tengine.taobao.org/),目前也在飞速发展。
- Lighttpd:不温不火的优秀web软件,社区不活跃,静态解析效率很高。在Nginx流行前,它是大型并发静态业务的首选,国内百度贴吧、豆瓣等总舵网站都有Lighttpd奋斗的身影。
2、提供用户互动接口的动态网站
- 这种类型的网站可以让服务器与用户互动。
- 常见的例如留言板,博客。
- 常见的动态网页的URL后缀:不是.html 、.htm 、.xml 、.shtml 、 .js css等静态网页的常见扩展名形式,而是 .asp 、.aspx 、.php 、.js 、.do、.cg等形式。
- 这种类型的网站需要通过“网页程序语言”来实现与用户互动的行为。常见的例如:PHP网页程序语言,配合数据库系统来进行数据的读、写。——理解:比如 客户端访问服务器的动态网站,服务器去执行php网页程序语言这个文件,去调用mysql数据库中的信息为html网页发给客户端。a
- 当你在向服务器请求数据时,其实是通过服务器端同一个网页程序在负责将数据读出或写入数据库,变动的是数据库的内容,网页程序并没有任何改变。
- 一种交互式的动态网页主要是在客户端实现。服务端将可执行的程序代码(JavaScript)传送给客户端,客户端的浏览器如果提供JavaScript的功能,那么该程序就可以在客户端的计算机上面工作了;
- 另外一种可在客户端执行的就是flash动画格式,在这种动画格式内还可以进行程序设计。
搭建动态网站的需求:
- LAMP(linux+Apache+MySQL+PHP)
- lnmp(linux+nginx+Mysql+php)
Apache:主要提供www的服务器平台
MySQL:传统的文件读取是很麻烦的,如果你只要读取该文件当中的一小部分,系统还是会将整 个文件读出来,若又有人同时读取同一个文件时,那就会造成效率与系统上的问题,所以才会有数 据库系统的推出。数据库其实是一种特殊格式的文件,这种文件要通过特殊接口(数据库软件)来 进行读写。由于这个特殊接口已经针对数据的查询、写入做过优化设计,因此很适合多人同时写入 与查询工作。
PHP:PHP可以被用来建立动态网页,PHP程序代码可以直接在HTML网页当中嵌入,就像编辑 HTML网页一样简单。PHP是一种“程序语言”,这种程序语言可以直接在网页当中编写,不需要经 过编译即可执行。
3、 伪静态网页资源
(1)伪静态页面资源:即将动态网页伪造成静态网页,便于被搜索引擎收录。
(2)三种方法:
①rewrite 正则表达式;
②去掉动态也米娜URI地址中的?和&字符,伪造成静态页面URI信息;
③开发的时候完成;
三、web服务器基本配置
#安装nginx
[root@server ~]# dnf install nginx -y#重启nginx服务,并查看防火墙是否关闭
[root@server ~]# systemctl restart nginx
[root@server ~]# systemctl status firewalld
○ firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; preset: >Active: inactive (dead)Docs: man:firewalld(1)#查看nginx当前的版本号
[root@server ~]# nginx -v
nginx version: nginx/1.20.1#显示 nginx 的版本,编译器版本和配置参数
## 因为有的参数用不着,所以一般自己编译参数。
### --prefix=/usr/share/nginx::显示的是网站的根目录和模块目录
### --sbin-path=/usr/sbin/nginx :nginx的程序路径
### --conf-path=/etc/nginx/nginx.conf:存放nginx的配置文件
### --error-log-path=/var/log/nginx/error.log:存放nginx的错误日志
### --http-log-path=/var/log/nginx/access.log:存放nginx的访问日志
[root@server ~]# nginx -V
nginx version: nginx/1.20.1
built by gcc 11.4.1 20231218 (Red Hat 11.4.1-3) (GCC)
built with OpenSSL 3.2.2 4 Jun 2024 (running with OpenSSL 3.0.7 1 Nov 2022)
TLS SNI support enabled
configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-compat --with-debug --with-file-aio --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_degradation_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_mp4_module --with-http_perl_module=dynamic --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-http_xslt_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-stream_ssl_preread_module --with-threads --with-cc-opt='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64-v2 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' --with-ld-opt='-Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -Wl,-E'#列出nginx软件包生成的哪些文件
[root@server ~]# rpm -ql nginx
/usr/bin/nginx-upgrade
/usr/lib/systemd/system/nginx.service
/usr/share/man/man3/nginx.3pm.gz
/usr/share/man/man8/nginx-upgrade.8.gz
/usr/share/man/man8/nginx.8.gz
/usr/share/nginx/html/404.html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/icons
/usr/share/nginx/html/icons/poweredby.png
/usr/share/nginx/html/index.html
/usr/share/nginx/html/nginx-logo.png
/usr/share/nginx/html/poweredby.png
/usr/share/nginx/html/system_noindex_logo.png
/usr/share/vim/vimfiles/ftdetect/nginx.vim
/usr/share/vim/vimfiles/ftplugin/nginx.vim
/usr/share/vim/vimfiles/indent/nginx.vim
/usr/share/vim/vimfiles/syntax/nginx.vim#列出nginx所有依赖的包
[root@server ~]# yum deplist nginx#列出nginx的配置文件
[root@server ~]# rpm -qc nginx-core
/etc/logrotate.d/nginx
/etc/nginx/fastcgi.conf
/etc/nginx/fastcgi.conf.default
/etc/nginx/fastcgi_params
/etc/nginx/fastcgi_params.default
/etc/nginx/koi-utf
/etc/nginx/koi-win
/etc/nginx/mime.types
/etc/nginx/mime.types.default
/etc/nginx/nginx.conf
/etc/nginx/nginx.conf.default
/etc/nginx/scgi_params
/etc/nginx/scgi_params.default
/etc/nginx/uwsgi_params
/etc/nginx/uwsgi_params.default
/etc/nginx/win-utf#tree 列出nginx的文件
[root@localhost ~]# tree /etc/nginx/
/etc/nginx/
├── conf.d #子配置文件目录
├── default.d
├── fastcgi.conf
├── fastcgi.conf.default
├── fastcgi_params #用以翻译nginx的变量供php识别
├── fastcgi_params.default
├── koi-utf
├── koi-win
├── mime.types #用以配置支持的媒体文件类型
├── mime.types.default
├── nginx.conf #主配置文件
├── nginx.conf.default
├── scgi_params
├── scgi_params.default
├── uwsgi_params #用以配置nginx的变量供python识别
├── uwsgi_params.default
└── win-utf
#默认的nginx网站根目录
[root@localhost ~]# tree /usr/share/nginx/html/
#nginx的日志文件所在目录
[root@localhost ~]# tree /var/log/nginx/
#nginx服务主配置文件nginx.conf的结构
[root@localhost nginx]# grep ^[^#] /etc/nginx/nginx.conf
=========全局配置(无{}标志)=======================
user nginx; #进程所属用户
worker_processes auto; #worker数量
error_log /var/log/nginx/error.log; #错误日志存放路径
pid /run/nginx.pid; #pid文件路径
include /usr/share/nginx/modules/*.conf; #include导入的功能模块配置文件
=========全局配置(无{}标志)=======================
==========性能配置(有{}标志)=================
events {
worker_connections 1024; #TCP连接数
}
==========性能配置(有{}标志)=================
=========http模块配置(有{}标志)==================
http { #http区块开始
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 /var/log/nginx/access.log main; #访问日志路径
sendfile on; #开启高效文件传输模式
tcp_nopush on; #性能优化参数
tcp_nodelay on; #性能优化参数
keepalive_timeout 65; #持久连接时间或超时时间
types_hash_max_size 4096; #性能优化参数
include /etc/nginx/mime.types; #可解析的静态资源类型
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf; #子配置文件存放路径
server { #server区块开始
listen 80; #监听端口
listen [::]:80;
server_name _; #服务器的名字
root /usr/share/nginx/html; #主页存放路径
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf; #子配置文件存放路径
error_page 404 /404.html; #404错误返回的页面
location = /40x.html { #使用location定义用户请求的uri
}
error_page 500 502 503 504 /50x.html; #500、502、503、504返回的页面
location = /50x.html {
}
} #server区块结束
} #http区块结束
=========http模块配置(有{}标志)==================
以下为较为常见的配置文件:
#现在关闭防火墙
[root@localhost ~]#systemctl disable firewalld --now#修改 SELinux 的当前运行模式为 “宽容(permissive)” 模式。
[root@localhost ~]# setenforce 0#显示SElinux当前运行的模式
- Enforcing(强制)模式:如果返回结果是 “enforcing”,这意味着 SELinux 正在严格执行安全策略。例如,当一个进程试图访问一个文件或者网络资源时,SELinux 会根据其预先定义的安全策略来检查这个访问是否被允许。如果访问违反了策略,操作将会被阻止。这种模式提供了最高级别的安全性,可以有效防止许多安全漏洞,如恶意软件对系统资源的未授权访问。
- Permissive(宽容)模式:若返回 “permissive”,表明 SELinux 处于宽容模式。在这种模式下,SELinux 不会阻止任何违反安全策略的操作,但是会把这些违规操作记录下来。这些记录通常存储在系统的审计日志中(如
/var/log/audit/
目录下),可以用于分析系统中的潜在安全问题或者应用程序与 SELinux 策略之间的兼容性问题。- Disabled(禁用)模式:当返回 “disabled” 时,SELinux 在系统中是完全停用的状态。这意味着系统不会执行任何 SELinux 相关的安全策略检查,系统的安全性可能会降低,因为没有了 SELinux 的访问控制保护。不过在某些特定场景下,比如在一些对性能要求极高且对安全性有其他保障措施的系统中,可能会选择禁用 SELinux。
[root@localhost ~]# getenforce
Permissive#执行nginx命令
[root@localhost ~]#nginx
#重启 (如果启动过,重启会报错,所以两个命令任选一个)
[root@localhost ~]# systemctl restart nginx#关掉nginx服务,或者直接杀掉进程
[root@server ~]# nginx -s stop
[root@server ~]# killall nginx
[root@server ~]# nginx
[root@server ~]# ps -ef | grep nginx
root 3496 1 0 16:53 ? 00:00:00 nginx: master process nginx
nginx 3497 3496 0 16:53 ? 00:00:00 nginx: worker process
nginx 3498 3496 0 16:53 ? 00:00:00 nginx: worker process
root 3500 3255 0 16:53 pts/1 00:00:00 grep --color=auto nginx
[root@server ~]# kill -9 3497
#测试可以使用curl命令访问web服务器或者使用浏览器访问,-I 只获得头部信息
[root@localhost ~]# curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.21.5
Date: Fri, 17 Nov 2023 08:40:28 GMT
Content-Type: text/html
Content-Length: 3510
Last-Modified: Mon, 23 Oct 2023 15:48:29 GMT
Connection: keep-alive
ETag: "653695cd-db6"
Accept-Ranges: bytes
四、虚拟主机配置实战
1、 搭建静态网站--基于http协议的静态网站
实验1:搭建一个web服务器,访问该服务器显示“hello word”欢迎界面。
[root@server ~]# echo hello word > /usr/share/nginx/html/index.html[root@server ~]# curl Localhost
hello word
[root@server ~]# curl 192.168.58.101
hello word
实验2:(多ip配置网站)建立两个基于ip地址访问的网站,要求如下:
-
该网站ip地址的主机位为100,设置首页目录为/www/ip/100,网页内容为:this is 100。
-
该网站ip地址主机位为200,设置首页目录为/www/ip/200,网页内容为:this is 200。
#先查询,再添加ip地址(或者nmtui添加IP地址等信息)
[root@server ~]# nmcli connection
NAME UUID TYPE DEVICE
ens160 95862df2-bba3-3f97-ac09-2b857854a5f0 ethernet ens160
lo cba296dc-687b-48fc-85fb-f8b395dc3ddc loopback lo##连接修改ens160,并且新增一个IP地址,设置网关和dns(已经设置过,可以不用设置),手动配置ipv4,并且开机的时候,自动加载这个配置.以下两种写法都可以,建议使用短的那种。
[root@localhost ~]# nmcli connection modify ens160 +ipv4.addresses 192.168.58.100/24 +ipv4.gateway 192.168.58.2 ipv4.dns 114.114.114.114 ipv4.method manual autoconnect yes
[root@localhost ~]# nmcli connection modify ens160 +ipv4.addresses 192.168.58.200/24
[root@localhost ~]# nmcli connection up ens160#创建两个网页文件根目录,并定义网页内容
[root@server ~]# mkdir -pv /www/ip/{1,2}00
mkdir: 已创建目录 '/www'
mkdir: 已创建目录 '/www/ip'
mkdir: 已创建目录 '/www/ip/100'
mkdir: 已创建目录 '/www/ip/200'#设置selinux,必须设置,否则无法看到网页页面内容
[root@server html]# setenforce 0
[root@server html]# getenforce
Permissive
单独写一个server模块,可以在/etc/nginx/nginx.conf 下写,也可以在/etc/nginx/conf.d (写在子配置目录更好)下写。
#定义基于不同ip地址来访问网站的配置文件
#新建文件,写入如下配置
[root@localhost ~]# vim /etc/nginx/conf.d/test_ip.conf
server {listen 192.168.58.100:80;root /www/ip/100;location / {}
}
server {listen 192.168.58.200:80;root /www/ip/200;location / {}
}[root@server ~]# systemctl restart nginx[root@server ~]# curl 192.168.58.100
hello word[root@server ~]# curl 192.168.58.200
hello word
实验3::建立两个基于不同端口访问的网站,要求如下:
- 建立一个使用web服务器默认端口的网站,设置网站首页目录为/www/port/80,网页内容为:the port is 80。
- 建立一个使用10000端口的网站,设置网站首页目录为/www/port/10000,网页内容为:the port is 10000。
[root@server ~]# mkdir -pv /www/port/{80,10000}
mkdir: 已创建目录 '/www/port'
mkdir: 已创建目录 '/www/port/80'
mkdir: 已创建目录 '/www/port/10000'[root@server ~]# echo the port is 80 > /www/port/80/index.html[root@server ~]# echo the port is 10000 > /www/port/10000/index.html[root@server ~]# nmtui #添加一个192.168.58.10的IP地址[root@server ~]# nmcli connection up ens160
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/5)[root@server ~]# cd /etc/nginx/conf.d
[root@server conf.d]# vim tets_post.conf[root@server conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
实验4:建立两个基于域名访问的网站,要求如下:
- 新建一个网站,域名为www.ceshi.com,设置网站首页目录为/www/name,网页内容为this is test。
- 新建一个网站,域名为rhce.first.day,同时可通过ce.first.day访问,设置网站首页目录 为/www/ce,网页内容为:today is first day of class。
[root@server conf.d]# nmtui #添加一个192.168.58.20/24的IP地址
[root@server conf.d]# nmcli connection up ens160
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)
[root@server conf.d]# mkdir -pv /www/{ce,name}
mkdir: 已创建目录 '/www/ce'
mkdir: 已创建目录 '/www/name'
[root@server conf.d]# echo this is a test > /www/name/index.html
[root@server conf.d]# echo this is first day of class > /www/ce/index.html
[root@server conf.d]# vim test_servername.conf
[root@server conf.d]# vim /etc/hosts
[root@server conf.d]# cat test_servername.conf
server{listen 192.168.58.20:80;server_name www.ceshi.com;root /www/ce;location / {}}server{listen 192.168.58.20:80;server_name ce.first.com rhce.first.com;root /www/name;location / {}}[root@server conf.d]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.58.20 www.ceshi.com ce.first.com rhce.first.com
[root@server conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@server conf.d]# pkill -9 nginx
[root@server conf.d]# nginx
[root@server conf.d]# curl www.ceshi.com
this is first day of class
[root@server conf.d]# curl ce.first.com
this is a test
[root@server conf.d]# curl rhce.first.com
this is a test
基于域名的网站,需要用到域名解析。 域名------->ip地址 浏览器如何通过域名去查询URL对应的IP(对应服务器地址):
1、浏览器缓存:浏览器会按照一定的频率缓存DNS记录。
2、操作系统缓存:如果浏览器缓存中找不到需要的DNS记录,那就去操作系统中的hosts文件 找。hosts是一个没有扩展名的系统文件,其作用就是将一些常用的网址域名与其对应的IP地址建 立一个关联"数据库",当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文 件中寻找对应的IP地址,一旦找到,系统会立即打开对应网页,如果没有找到,则系统会再将网址 提交DNS域名解析服务器进行IP地址的解析。
windows下的hosts文件路径:C:\Windows\System32\drivers\etc\hosts Linux下的hosts文件路径:/etc/hosts
3、路由缓存:路由器也有DNS缓存。
4、ISP的DNS服务器:ISP是互联网服务提供商(Internet Service Provider)的简称,ISP有专门的 DNS服务器应对DNS查询请求。
5、根服务器:ISP的DNS服务器还找不到的话,它就会向根服务器发出请求,进行递归查询(DNS服务器先问根域名服务器.com域名服务器的IP地址,然后再问.com域名服务器,依次类推)
实验5、基于虚拟目录和用户控制的web网站
[root@server conf.d]# nmtui
[root@server conf.d]# nmcli connection up ens160
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/7)
[root@server conf.d]# vim test_virtualdir.conf
[root@server conf.d]# cat test_virtualdir.confserver{listen 192.168.58.30:80;root /usr/share/nginx/html;location /real{alias /www/real;}
}[root@server conf.d]# mkdir -pv /www/real
mkdir: 已创建目录 '/www/real'
[root@server conf.d]# echo real_virtual > /www/real/index.html
[root@server conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@server conf.d]# pkill -9 nginx
[root@server conf.d]# nginx
[root@server conf.d]# curl 192.168.58.30
hello word
[root@server conf.d]# curl 192.168.58.30/real/
real-virtual#用户访问控制
[root@server conf.d]# vim test_virtualdir.conf
[root@server conf.d]# cat test_virtualdir.confserver{listen 192.168.58.30:80;root /usr/share/nginx/html;location /real{alias /www/real;auth_basic on;auth_basic_user_file /etc/nginx/conf.d/auth_password;}}[root@server conf.d]# dnf install httpd-tools -y
正在更新 Subscription Management 软件仓库。
无法读取客户身份本系统尚未在权利服务器中注册。可使用 subscription-manager 进行注册。上次元数据过期检查:0:24:58 前,执行于 2024年11月30日 星期六 18时04分55秒。
软件包 httpd-tools-2.4.62-1.el9.x86_64 已安装。
依赖关系解决。
无需任何处理。
完毕!
[root@server conf.d]# htpasswd -cb /etc/nginx/conf.d/auth_password user1 123456
Adding password for user user1
[root@server conf.d]# pkill -9 nginx
[root@server conf.d]# nginx[root@server conf.d]# curl 192.168.58.30/real/
<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>
[root@server conf.d]# curl 192.168.58.30/rarl/ -u uer1
Enter host password for user 'uer1':
<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>
2、搭建静态网站——基于https协议的静态网站
(1)https简介
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送 内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可 以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。为了解决 HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext Transfer Protocol Secure,超文本传输安全协议),是以安全为目标的HTTP通道。HTTPS并不是一个新协议,而是HTTP+SSL(TLS)。原本HTTP先和TCP(假定传输层是TCP协议)直接通信,而加了SSL后,就变 成HTTP先和SSL通信,再由SSL和TCP通信,相当于SSL被嵌在了HTTP和TCP之间。
SSL 是“Secure Sockets Layer”的缩写,中文叫做“安全套接层”。它是在上世纪90年代中期,由网景公司 设计的。到了1999年,SSL 应用广泛,已经成为互联网上的事实标准。IETF 就把SSL 标准化。标准化之 后SSL被改为 TLS(Transport Layer Security传输层安全协议)。
SSL协议分为两层:
- SSL记录协议 (SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提 供数据封装、压缩、加密等基本功能。
- SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输 开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
SSL协议提供的服务:
- 认证用户和服务器,确保数据发送到正确的客户机和服务器
- 加密数据以防止数据中途被窃取
- 维护数据的完整性,确保数据在传输过程中不被改变
(2)https协议加密所使用的算法
HASH是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就 是散列值。Hash算法特别的地方在于它是一种单向算法,用户可以通过hash算法对目标信息生成一段 特定长度的唯一hash值,却不能通过这个hash值重新获得目标信息。因此Hash算法常用在不可还原的 密码存储、信息完整性校验等。
常见的HASH算法:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMACSHA1。
共享密钥加密(对称密钥加密):加密和解密使用相同密钥。
对称加密算法:DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6和AES。
公开密钥加密(非对称密钥加密):公开密钥加密使用一对非对称的密钥。一把叫做私有密钥,一把叫 做公开密钥。私有密钥不能让其他任何人知道,而公开密钥则可以随意发布,任何人都可以获得。使用 此加密方式,发送密文的一方使用公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私 有密钥进行解密。利用这种方式,不需要发送用来解密的私有密钥,也不必担心密钥被攻击者窃听盗走。
常见的非对称加密算法:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名 用。
但由于公开密钥比共享密钥要慢,所以我们就需要综合一下他们两者的优缺点,使他们共同使用,而这 也是HTTPS采用的加密方式。在交换密钥阶段使用公开密钥加密方式,之后建立通信交换报文阶段则使 用共享密钥加密方式。 如何证明公开密钥本身是货真价实的公开密钥?如,正准备和某台服务器建立公开密钥加密方式下的通 信时,如何证明收到的公开密钥就是原本预想的那台服务器发行的公开密钥。或许在公开密钥传输过程 中,真正的公开密钥已经被攻击者替换掉了。这个时候就需要第三方公证单位来帮忙啦。
CA就是一个公认的公证单位,你可以自行产生一把密钥且制作出必要的证书数据并向CA单位注册,那么 当客户端的浏览器在浏览时,该浏览器会主动向CA单位确认该证书是否为合法注册过,如果是,那么该 次连接才会建立,如果不是,浏览器会发出警告信息,告知用户应避免建立连接。所以说,如此一来 WWW服务器不但有公证单位的证书,用户在建立连接时也比较有保障。
(3)浏览器访问https网站的通信过程
- 客户端浏览器向服务器端发送如下信息
1、客户端支持的SSL /TLS协议的版本号。
2、Cipher Suite(密钥算法套件)。
3、客户端产生的随机数,稍后用于生成"对话密钥"。
- 服务器端向客户端发送如下信息
1、确认使用的加密通信协议版本,如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
2、确认使用的加密方法。
3、服务器证书。
要使数字证书有用,它的结构必须采用一种可理解且可靠的形式,以便人们可以轻松地检索并 理解证书内的信息。例如,护照采用这样一种结构:人们可以轻松地理解以前从未见过的那一 类护照中的信息。同样,只要数字证书是标准化的,则无论颁发该证书的是哪个机构,人们都 可以阅读并理解该证书。
S/MIME 标准规定:用于 S/MIME 的数字证书应遵守国际电信同盟 (ITU) X.509 标准。S/MIME 版本 3 明确要求数字证书应遵循 X.509 的第 3 版。由于 S/MIME 依赖于已建立的数字证书结 构公认标准,因此 S/MIME 标准建立在该标准的发展之上,从而提高了它的认可度。 X.509 标准规定数字证书应包含标准化信息。具体地说,X.509 版本 3 证书包含下列字段:
版本号 证书所遵循的 X.509 标准的版本。
序列号 唯一标识证书且由证书颁发机构颁发的编号。
签名算法 CA用于对证书进行数字签名的hash算法。
颁发者名称 实际颁发该证书的证书颁发机构的标识。
有效期 数字证书保持有效的时间段,并包含起始日期和过期日期。
使用者名称 数字证书所有者的姓名。
使用者公钥信息 与数字证书所有者关联的公钥以及与该公钥关联的特定公钥算法。
颁发者唯一标识符 可以用来唯一标识数字证书颁发者的信息。
使用者唯一标识符 可以用来唯一标识数字证书所有者的信息。
扩充信息 与证书的使用和处理有关的其他信息。
证书颁发机构的数字签名 使用指纹算法中指定的HASH算法以及证书颁发机构的私钥进行加密的数字签名。
4、 服务器生成的随机数,稍后用于生成"对话密钥
- 客户端利用服务器传过来的信息验证服务器的合法性。如果合法性验证没有通过,通讯将断开;如 果合法性验证通过,则可以知道认证服务器的公开密钥的是真实有效的数字证书认证机构,并且服 务器的公开密钥是值得信赖的。(此处认证机关的公开密钥必须安全地转交给客户端。使用通信方 式时,如何安全转交是一件很困难的事,因此,多数浏览器开发商发布版本时,会事先在内部植入 常用认证机关的公开密钥。)
- 客户端随机产生一个用于后面通讯的对称密钥,然后用服务器的公钥对其加密,然后将加密后的对 称密钥传给服务器。
HTTPS的安全通信工作流程可大致分为三个阶段:
认证服务器:浏览器内置一个受信任的CA机构列表,并保存了这些CA机构的证书。第一阶段服务器会提 供经CA机构认证颁发的服务器证书,如果认证该服务器证书的CA机构,存在于浏览器的受信任CA机构 列表中,并且服务器证书中的信息与当前正在访问的网站(域名等)一致,那么浏览器就认为服务端是 可信的,并从服务器证书中取得服务器公钥,用于后续流程。否则,浏览器将提示用户,根据用户的选择,决定是否继续。当然,我们可以管理这个受信任CA机构列表,添加我们想要信任的CA机构,或者移 除我们不信任的CA机构。
协商会话密钥:客户端在认证完服务器,获得服务器的公钥之后,利用该公钥与服务器进行加密通信, 协商出两个会话密钥,分别是用于加密客户端往服务端发送数据的客户端会话密钥,用于加密服务端往 客户端发送数据的服务端会话密钥。在已有服务器公钥,可以加密通讯的前提下,还要协商两个对称密 钥的原因,是因为非对称加密相对复杂度更高,在数据传输过程中,使用对称加密,可以节省计算资 源。另外,会话密钥是随机生成,每次协商都会有不一样的结果,所以安全性也比较高。
加密通讯:此时客户端服务器双方都有了本次通讯的会话密钥,之后传输的所有http数据,都通过会话 密钥加密。这样网路上的其它用户,将很难窃取和篡改客户端和服务端之间传输的数据,从而保证了数 据的私密性和完整性。
#https功能由ngx_http_ssl_module模块提供[root@server conf.d]# mkdir -pv /www/https
mkdir: 已创建目录 '/www/https'
[root@server conf.d]# echo https > /www/https/index.html
[root@server conf.d]# cd /etc/pki/tls/certs
#key是私钥文件
[root@server certs]# openssl genrsa -out https.key
#crt是由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持
有人的公钥,以及签署者的签名等信息
[root@server certs]# openssl req -utf8 -new -key https.key -x509 -days 100 -out https.crt[[root@localhost ~]# cat /etc/nginx/conf.d/test_https.conf
server {# listen 80;listen 192.168.58.40:443 ssl;root /www/https;ssl_certificate /etc/pki/tls/certs/https.crt;ssl_certificate_key /etc/pki/tls/certs/https.key;location / {}
}
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# curl --insecure https://192.168.58.40
https
[root@localhost ~]# curl -k https://192.168.58.40
https
3、搭建动态网站
动态网站并不是指具有动画功能的网站,而是指网站内容可根据不同情况动态变更的网站,一般情况下 动态网站通过数据库进行架构。 动态网站除了要设计网页外,还要通过数据库和编程序来使网站具有更 多自动的和高级的功能。 动态网页:使用网页脚本语言,比如php、JSP等,通过脚本将网站内容动态存储到数据库,用户访问网 站是通过读取数据库来动态生成网页的方法。
[root@Server certs]# nmtui #添加一个192.168.58.40的IP地址
[root@Server certs]# nmcli connection up ens160
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/10)
[root@localhost ~]# dnf install php php-fpm -y
[root@localhost ~]# systemctl restart nginx php-fpm
[root@ntp-server ~]# echo "<?php phpinfo(); ?>" >
/usr/share/nginx/html/index.php#使用浏览器访问