Linux之web服务器

一、web 服务器简介

  1. www 简介

    • www 是全球信息广播的意思,上网即使用 www 来查询信息,它结合多种多媒体,通过超链接以 Internet 传递信息。上网时,网站提供数据,客户端用浏览器解析数据。
    • www 所用协议为 HTTP(超文本传输协议)。
    • 主流 Web 服务器有 Apache、Microsoft 的 Internet 信息服务器(IIS)和 Unix nginx。
    • 服务器提供的数据主要是 HTML 和多媒体文件,HTML 用标记规范数据格式。
    • 著名浏览器有 Windows 内的 IE、Firefox 和 Google 的 chrome。
  2. 网址及 HTTP 简介

    • URL(统一资源定位符)是互联网上标准资源的地址,包括协议、主机或主机名、端口号和目录资源。
    • 浏览器常支持的协议有 http、https、ftp 等。主机地址是服务器 IP 地址或需域名解析的主机名。端口号方面,http 为 80,https 为 443。端口号分为特权端口(0 - 1023)、注册端口(1024 - 41951)和动态端口(41952 - 60000)。
    • http 请求方法告诉 web 服务器执行具体动作,状态代码由三位数字组成,分为五类表示不同响应情况。
    • HTTP 报文分为请求报文和响应报文。请求报文由请求行、请求头部、空行和请求报文主体组成;响应报文由起始行、响应头部、空行和响应报文主体组成。
    • MIME 用于描述数据并标记不同数据内容类型,存在于 HTTP 响应报文的响应头部信息里。
  3. http 协议请求的工作流程

    • 终端客户在浏览器输入访问地址。
    • 浏览器请求 DNS 服务器解析域名成 IP 地址。
    • 浏览器解析出端口号。
    • 浏览器与服务器建立 TCP 连接。
    • 浏览器向服务器发送 HTTP 请求报文。
    • 服务器响应并返回 HTTP 响应报文。
    • 服务器关闭连接,浏览器显示网站内容。

二、web 服务器的类型

  1. 单向静态网页

    • 服务器单向提供数据,用户只能浏览,无法上传数据。
  2. 提供用户互动接口的动态网站

    • 可让服务器与用户互动,如留言板、博客等。实现方式有服务器端网页程序语言(如 PHP 配合数据库系统)和客户端可执行程序代码(如 JavaScript、flash 动画)。
    • 搭建动态网站需求 LAMP(linux+Apache+MySQL+PHP),Apache 提供服务器平台,MySQL 是优化过读写的数据库系统,PHP 可建立动态网页且可直接在 HTML 网页中嵌入。

三、静态页面资源特征

  1. 处理文件类型包括.html 等多种格式。
  2. 地址中不含有问号或特殊符号。
  3. 保存在服务器文件系统上,是实体文件。
  4. 内容固定,易被搜索引擎收录。
  5. 交互性差,不能与数据库配合。
  6. 网页程序在客户端浏览器解析,服务器直接从磁盘文件系统返回数据。

四、动态网页资源

  1. URL 后缀为.asp 等形式。
  2. 页面交互性强,可与数据库配合。
  3. 地址中含有问号或特殊符号。
  4. 不便于被搜索引擎收录。

五、不同服务器特点

  1. Apache:模块化服务器,支持模块多,性能稳定,可支持多种语言,本身静态解析,可扩展支持动态页面,使用 java 需 tomcat 后台支持。
  2. Tomcat:应用服务器,是 servlet 容器,可独立运行或作为 Apache 的扩展。
  3. Nginx:轻量级服务器,高性能的 http 和反向代理服务器,同时也是 IMAP/POP3/SMTP 代理服务器,相对 Apache 占用更少内存及资源。

web服务基本配置

使用nginx提供web服务

[root@server ~]# yum install nginx -y
[root@localhost ~]# nginx -v
[root@localhost ~]# nginx -V
[root@localhost ~]# rpm -ql nginx
[root@localhost httpd]# tree /etc/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
[root@localhost ~]# tree /usr/share/nginx/html/ #默认的nginx网站根目录
[root@localhost ~]# tree /var/log/nginx/ #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 notice;  #错误日志存放路径
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
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive      #每次启动虚拟机时都需要做以上操作后才能开启服务器,也可以/etc/selinux/config修改 SELINUX=enforcing为SELINUX=permissive
[root@localhost ~]# systemctl restart nginx
#测试可以使用curl命令访问web服务器或者使用浏览器访问
[root@localhost ~]# curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Sun, 03 Nov 2024 07:26:42 GMT
Content-Type: text/html
Content-Length: 2713881
Last-Modified: Tue, 04 Jun 2024 22:57:12 GMT
Connection: keep-alive
ETag: "665f9bc8-296919"
Accept-Ranges: bytes
虚拟主机配置实战
搭建静态网站--基于HTTP协议

实验1:搭建一个web服务器,访问该服务器时显示"hello world"欢迎界面。

[root@localhost ~]# echo "hello world" > /usr/share/nginx/html/index.html
[root@localhost ~]# curl localhost
hello world
[root@localhost ~]# curl 192.168.121.10
hello world

实验2:建立两个基于ip地址访问的网站,要求如下

该网站ip地址的主机位为100,设置首页目录为/www/ip/100,网页内容为:this is 100。

该网站ip地址主机位为200,设置首页目录为/www/ip/200,网页内容为:this is 200。

#添加ip地址
[root@localhost ~]# nmcli connection modify ens33 +ipv4.addresses 
192.168.121.100/24 +ipv4.gateway 192.168.121.2 ipv4.dns 114.114.114.114 
ipv4.method manual autoconnect yes
[root@localhost ~]# nmcli connection modify ens33 +ipv4.addresses 
192.168.121.200/24
[root@localhost ~]# nmcli connection up ens33
#创建两个网页文件根目录,并定义网页内容
[root@localhost ~]# mkdir -pv /www/ip/{100,200}
[root@localhost ~]# echo this is 100 > /www/ip/100/index.html
[root@localhost ~]# echo this is 200 > /www/ip/200/index.html
#设置selinux,必须设置,否则无法看到网页页面内容
[root@server html]# setenforce 0
[root@server html]# getenforce
Permissive
#定义基于不同ip地址来访问网站的配置文件
#新建文件,写入如下配置
[root@localhost ~]# vim /etc/nginx/conf.d/test_ip.conf
server {
        listen 192.168.121.100:80;
        root /www/ip/100;
        location / {
        }
}
server {
        listen 192.168.121.200:80;
        root /www/ip/200;
        location / {
        }
}

[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# curl 192.168.121.100
this is 100
[root@localhost ~]# curl 192.168.121.200
this is 200

实验3:建立两个基于不同端口访问的网站,要求如下:

建立一个使用web服务器默认端口的网站,设置网站首页目录为/www/port/80,网页内容为:the

port is 80。

建立一个使用10000端口的网站,设置网站首页目录为/www/port/10000,网页内容为:the port

is 10000。

[root@localhost ~]# mkdir -pv /www/port/{80,10000}
[root@localhost ~]# echo the port is 80 > /www/port/80/index.html
[root@localhost ~]# echo the port is 10000 > /www/port/10000/index.html
[root@localhost ~]# nmcli connection modify ens33 +ipv4.addresses 
192.168.121.153/24  
[root@localhost ~]# nmcli connection up ens33
[root@localhost ~]# cat /etc/nginx/conf.d/test_port.conf
server {
        listen 192.168.121.153:80;
        root /www/port/80;
        location / {
        }
}
server {
        listen 192.168.121.153:10000;
        root /www/port/10000;
        location / {
        }
}

[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# curl 192.168.121.153:10000
the port is 10000
[root@localhost ~]# curl 192.168.121.153
the port is 80

实验4:建立两个基于域名访问的网站,要求如下:

新建一个网站,域名为www.ceshi.com,设置网站首页目录为/www/name,网页内容为this is

test。

新建一个网站,域名为rhce.first.day,同时可通过ce.first.day访问,设置网站首页目录

为/www/ce,网页内容为:today is first day of class。

基于域名的网站,需要用到域名解析。 复制代码
浏览器如何通过域名去查询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域名服务器,依次类
推) 
[root@localhost conf.d]# nmcli connection modify ens33 +ipv4.addresses 
192.168.121.154/24
[root@localhost conf.d]# nmcli connection up ens33
[root@localhost ~]# mkdir /www/{name,ce}
[root@localhost ~]# echo this is test > /www/name/index.html
[root@localhost ~]# echo today is first day of class > /www/ce/index.html
[root@localhost ~]# vim /etc/nginx/conf.d/test_servername.conf
server {
        listen 192.168.121.154:80;
        server_name www.ceshi.com;  #server_name 指令用于指定该服务器块处理的域名
        root /www/name;
        location / {
        }
}
server {
        listen 192.168.121.154:80;
        server_name rhce.first.day ce.first.day;
        root /www/ce;
        location / {
        }
}

[root@localhost ~]# vim /etc/hosts
192.168.121.154 www.ceshi.com rhce.first.day ce.first.day
[root@localhost ~]# systemctl restart nginx
[root@localhost ~]# curl www.ceshi.com
this is test
[root@localhost ~]# curl rhce.first.day
today is first day of class
[root@localhost ~]# curl ce.first.day
today is first day of class

实验5:基于虚拟目录和用户控制的web网站

#虚拟目录实现
[root@localhost conf.d]# nmcli connection modify ens33 +ipv4.addresses 
192.168.121.155/24
[root@localhost conf.d]# nmcli connection up ens33
[root@localhost ~]# vim   /etc/nginx/conf.d/test_virtualdir.conf
server {
        listen 192.168.121.155:80;
        root /usr/share/nginx/html;
        location /real {    #指令用于定义如何处理特定的 URL 路径。在这个例子中,它定义了对路径 /real 的处理方式
                alias /www/real;    #alias 指令将指定的路径映射到另一个文件系统路径。在这个例子中,当客户端请求 /real 路径时,Nginx 会将其映射到 /www/real 目录
                auth_basic on;    #auth_basic 指令启用基本认证(Basic Authentication)。这意味着访问该路径需要用户名和密码。
                auth_basic_user_file /etc/nginx/conf.d/auth-password;    #auth_basic_user_file 指令指定存储用户名和密码的文件
        }
}
[root@localhost ~]# mkdir /www/real/
[root@localhost ~]# echo real-virtual > /www/real/index.html
[root@localhost ~]# yum install httpd-tools -y
[root@localhost ~]# htpasswd -cb /etc/nginx/conf.d/auth-password user1 
123
[root@localhost ~]# systemctl restart nginx
[root@server ~]# curl 192.168.121.155/real/
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.26.1</center>
</body>
</html>
[root@server ~]# curl 192.168.121.155/real/ -u user1
Enter host password for user 'user1':
real-virtual
[root@server ~]# curl user1:123@192.168.121.155/real/
real-virtual
[root@server ~]# 
搭建静态网站--基于https协议的静态网站
(一)https 简介
  1. HTTP 协议以明文方式发送内容,存在安全缺陷,不适合传输敏感信息。
  2. HTTPS 是以安全为目标的 HTTP 通道,并非新协议,而是 HTTP + SSL(TLS)。
  3. SSL 被嵌在 HTTP 和 TCP 之间,分为两层:
    • SSL 记录协议:为高层协议提供数据封装、压缩、加密等基本功能。
    • SSL 握手协议:用于通讯双方进行身份认证、协商加密算法、交换加密密钥等。
  4. SSL 协议提供的服务包括认证用户和服务器、加密数据、维护数据完整性。
(二)https 协议加密所使用的算法
  1. HASH 算法是一种单向算法,常用于不可还原的密码存储、信息完整性校验等。常见的 HASH 算法有 MD2、MD4、MD5 等。
  2. 共享密钥加密(对称密钥加密):加密和解密使用相同密钥。常见对称加密算法有 DES、AES 等。
  3. 公开密钥加密(非对称密钥加密):使用一对非对称的密钥,一把私有密钥,一把公开密钥。常见非对称加密算法有 RSA、ECC 等。
  4. HTTPS 采用综合对称密钥加密和非对称密钥加密的方式,在交换密钥阶段使用公开密钥加密方式,之后建立通信交换报文阶段则使用共享密钥加密方式。
  5. 为证明公开密钥的真实性,需要第三方公证单位 CA。客户端浏览器向 CA 单位确认服务器证书是否合法注册,若合法则建立连接,否则发出警告信息。
(三)浏览器访问 https 网站的通信过程
  1. 客户端浏览器向服务器端发送:
    • 客户端支持的 SSL/TLS 协议的版本号。
    • Cipher Suite(密钥算法套件)。
    • 客户端产生的随机数,用于生成"对话密钥"。
  2. 服务器端向客户端发送:
    • 确认使用的加密通信协议版本,若不一致则关闭加密通信。
    • 确认使用的加密方法。
    • 服务器证书。
    • 服务器生成的随机数,用于生成"对话密钥"。
  3. 客户端利用服务器传过来的信息验证服务器的合法性:
    • 若合法性验证未通过,通讯断开。
    • 若通过,则可知认证服务器的公开密钥是真实有效的数字证书认证机构,且服务器的公开密钥值得信赖。多数浏览器开发商发布版本时,会事先在内部植入常用认证机关的公开密钥。
  4. 客户端随机产生一个对称密钥,用服务器的公钥对其加密后传给服务器。
  5. HTTPS 的安全通信工作流程分为三个阶段:
    • 认证服务器:浏览器内置受信任的 CA 机构列表,若服务器证书的 CA 机构在列表中且证书信息与当前访问网站一致,则认为服务端可信,从服务器证书中取得服务器公钥。否则,提示用户决定是否继续。
    • 协商会话密钥:客户端获得服务器公钥后,利用该公钥与服务器进行加密通信,协商出客户端会话密钥和服务端会话密钥。使用对称密钥加密可节省计算资源,且会话密钥随机生成,安全性高。
    • 加密通讯:客户端和服务器双方有了会话密钥后,所有 http 数据通过会话密钥加密,保证数据的私密性和完整性。
https网站配置
#https功能由ngx_http_ssl_module模块提供
[rootlocalhost ~]# nmcli connection modify ens33 +ipv4.addresses 
192.168.121.156/24
[root@localhost ~]# nmcli connection up ens33
[root@localhost ~]# mkdir -pv /www/https/
[root@localhost ~]# echo https > /www/https/index.html
[root@localhost conf.d]# cd /etc/pki/tls/certs/
#key是私钥文件
[root@localhost certs]# openssl genrsa -out https.key
#crt是由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持
有人的公钥,以及签署者的签名等信息
[root@localhost 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 {    #定义一个新的服务器块。Nginx 使用这种结构来组织和管理不同的虚拟主机(Virtual Host)
        listen 192.168.121.156:443 ssl; #指定服务器监听的 IP 地址和端口。在这里,服务器监听 192.168.88.150 的 443 端口,并且启用了 SSL(HTTPS)
        root /www/https;  #指令设置服务器的根目录。当客户端请求一个文件时,Nginx 会从这个目录中查找文件
        ssl_certificate /etc/pki/tls/certs/https.crt;  #指令指定 SSL 证书文件的位置
        ssl_certificate_key /etc/pki/tls/certs/https.key;  #指令指定 SSL 私钥文件的位置
        location / {    #指令用于定义如何处理特定的 URL 路径
        }
}
[root@localhost ~]# systemctl restart nginx
[root@server certs]# curl --insecure https://192.168.121.156
https
[root@server certs]# curl -k https://192.168.121.156
https
[root@server certs]# 
搭建动态网站

动态网站并不是指具有动画功能的网站,而是指网站内容可根据不同情况动态变更的网站,一般情况下

动态网站通过数据库进行架构。 动态网站除了要设计网页外,还要通过数据库和编程序来使网站具有更

多自动的和高级的功能。

动态网页:使用网页脚本语言,比如php、JSP等,通过脚本将网站内容动态存储到数据库,用户访问网

站是通过读取数据库来动态生成网页的方法。

[root@localhost nginx]# nmcli connection modify ens33 +ipv4.addresses 
192.168.121.157/24
[root@localhost nginx]# nmcli connection up ens33
[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
#使用浏览器访问

完成!!

相关推荐
~甲壳虫7 分钟前
react中得类组件和函数组件有啥区别,怎么理解这两个函数
前端·react.js·前端框架
重生之我是数学王子12 分钟前
网络编程 UDP编程 Linux环境 C语言实现
linux·c语言·开发语言·网络·网络协议·udp
.net开发22 分钟前
WPF使用Prism框架首页界面
前端·c#·.net·wpf
名字越长技术越强42 分钟前
vue--vueCLI
前端·javascript·vue.js
是个热心市民44 分钟前
构建一个导航栏web
前端·javascript·python·django·html
搬砖的小码农_Sky1 小时前
如何在Linux中比较两个文件的差异?
linux
wanhengwangluo1 小时前
弹性裸金属服务器和传统裸金属服务器有什么区别?
运维·服务器
J不A秃V头A1 小时前
报错:npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。
前端·npm·node.js
GDAL1 小时前
npm入门教程14:npm依赖管理
前端·npm·node.js
余生H1 小时前
即时可玩web小游戏(二):打砖块(支持移动端版) - 集成InsCode快来阅读并即时体验吧~
前端·javascript·inscode·canvas·h5游戏