Linux - web服务器
四、web服务器
1、基础知识
URL:Uniform Resource Locator,统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。
网址格式:<协议>://<主机或主机名>[:port]/<目录资源,路径>
-
浏览器常支持的协议有:http、https、ftp等。
-
主机地址或者主机名:主机地址就是服务器在因特网所在的IP地址。如果是主机名的话,那么 就需要域名解析了。
-
端口号(port):http为80,https为443 (IANA:互联网数字分配机构)
- 其中,0-1023属于特权端口(只有管理员有权限 启用并让进程监听),永久地分配给固定的应用程序使用。
- 1024-41951为注册端口,但要求不是特别严格,分配给程序注册为某应用使用: 3306/TCP。
- 41952-60000为客户端程序随机使用的端口,动态端口,或私有端口 。
-
http请求方法:在http通信中,每个http请求报文都包含一个方法,用以告诉web服务器端需要执 行哪些具体的动作,这些动作包括:获取指定web页面、提交内容到服务器、删除服务器上资源文 件等。
序号 方法 描述 1 GET 请求指定的页面信息,并返回实体主体 2 HEAD 与GET相似,但返回的响应内容中没有具体的内容(获取报头) 3 POST 向指定资源提交数据进行处理的请求(表单或者文件),数据被包含在请求体中,该请求可能会导致新的资源的建立或已有资源的修改 4 PUT 客户端向服务端传送的数据取代指定的文档的内容 5 DELETE 请求删除指定页面 6 CONNECT HTTP1.1协议中预留给能够将连接改为管道方式的代理服务器 7 OPTIONS 允许客户端查看服务器的性能 8 TRACE 回显服务器收到的请求,主要用于测试或诊断 -
状态代码:由三位数字组成,第一个数字定义了响应的类别。
- 1xx:指示信息 — 表示请求已接收,继续处理
- 2xx:成功 — 表示请求已被成功接收、理解、接受
- 3xx:重定向 — 要完成请求必须进行更进一步的操作
- 4xx:客户端错误 — 请求有语法错误或请求无法实现
- 5xx:服务器端错误 — 服务器未能实现合法的请求
-
常见状态代码
- 200 OK:客户端请求成功。
- 400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
- 401 Unauthorized:请求未经授权,这个状态代码必须和 WWW-Authenticate 报头域 一起使用。
- 403 Forbidden:服务器收到请求,但是拒绝提供服务。
- 404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
- 500 Internal Server Error:服务器发生不可预期的错误 。
- 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常 。
-
HTTP报文:http报文中有很多行内容,这些行的字段内容都是由一些ASCII码串组成,但各个字段 的长度是不同的。http报文可分为两种,一种是从web客户端发往web服务器的http报文,称为请 求报文。另外一种是从web服务器发往web客户端的报文,称为响应报文 。
-
http协议请求的工作流程:
1、终端客户在web浏览器地址栏输入访问地址(一般是域名,也可以直接使用IP)。
2、web浏览器请求DNS服务器把域名解析成web服务器的IP地址(域名访问)。
3、web浏览器将端口号(http协议默认是80)从访问地址(URL)中解析出来。
4、web浏览器通过解析后的ip地址及端口号与web服务器之间建立一条TCP连接。
5、建立TCP连接后,web浏览器向web服务器发送一条HTTP请求报文。
6、web服务器响应并读取浏览器的请求信息,然后返回一条HTTP响应报文。
7、web服务器关闭HTTP连接,关闭TCP连接,web浏览器显示访问的网站内容到屏幕上。
-
web服务器类型
- 静态网页 — 单纯是由服务器单向提供数据给客户端,Server不需要与client端有互动,所以你可以到该网站上去浏 览,但是无法进行数据的上传。
- 动态网站 — 这种类型的网站可以让服务器与用户互动。
2、Nginx基础
web服务器提供的这些数据大部分都是文件,那么我们需要在服务器端先将数据文件写好,并且放置在 某个特殊的目录下面,这个目录就是我们整个网站的首页,在nginx中,这个目录默认 在/usr/share/nginx/html/。浏览器是通过你在地址栏中输入你所需要的网址来取得这个目录的数据的。
安装
yum install nginx -y
配置文件结构
#以树状结构查看文件
[root@server ~]# 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
2 directories, 15 files
配置文件默认内容
[root@server ~]# 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 {
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 = /404.html {
} #使用location定义用户请求的uri
error_page 500 502 503 504 /50x.html; #500、502、503、504返回的页面
location = /50x.html {
}
}
#server区块结束
}
#http区块结束
3、web静态页面配置流程
配置前准备工作
#关闭防火墙
[root@server ~]# systemctl stop firewalld
#关闭selinux
[root@server ~]# setenforce 0
[root@server ~]# getenforce
Permissive
1、简单静态页面
创建自己的Nginx配置文件并编写
[root@server ~]# vim /etc/nginx/conf.d/self.conf
#self.conf就是我们新创建的配置文件
内容:
server {
listen 192.168.5.100:80; #网页IP以及监听的端口号
root /self/hello; #提供网页的文件
location / {
}
}
编写网页页面文件
[root@server ~]# mkdir -pv /self/hello
mkdir: 已创建目录 '/self'
mkdir: 已创建目录 '/self/hello'
[root@server ~]# echo hello > /self/hello/index.html
测试
#重启Nginx服务并获取网页内容
[root@server ~]# systemctl restart nginx
[root@server ~]# curl 192.168.5.100
hello
2、添加域名
编辑配置文件
server {
listen 192.168.5.100:80;
server_name www.hello.com;
root /self/hello;
location / {
}
}
测试
#因为我们的域名不存在于DNS服务器中,所以不能作DNS解析。这里手动添加在解析文件中
[root@server ~]# vim /etc/hosts
添加:
192.168.5.100 www.hello.com
#测试
[root@server ~]# curl www.hello.com
hello
3、修改监听端口号
编辑配置文件
server {
listen 192.168.5.100:10000;
server_name www.hello.com;
root /self/hello;
location / {
}
}
测试
#现在我们直接访问
[root@server ~]# curl www.hello.com
#将会默认使用80端口来访问,因为我们改了端口号,所以访问不到我们的页面。这里将会访问到Nginx默认的页面/usr/share/nginx/html/index.html中的内容
#需要加上端口号访问
[root@server ~]# curl www.hello.com:10000
hello
4、单服务器多网页
添加IP地址
#使用图形化界面:nmtui
#编辑网卡并添加新的IP地址:192.168.5.110
#激活网卡
[root@server ~]# nmcli con up ens160
#添加域名解析信息
192.168.5.110 www.haha.com
编辑配置文件
server {
listen 192.168.5.100:80;
server_name www.hello.com;
root /self/hello;
location / {
}
}
server {
listen 192.168.5.110:80;
server_name www.haha.com;
root /self/haha;
location / {
}
}
添加页面文件
[root@server ~]# mkdir /self/haha -v
mkdir: 已创建目录 '/self/haha'
[root@server ~]# [root@server ~]# vim /self/haha/index.html
#文件内容:hahahahaha
测试
#重启服务
[root@server ~]# systemctl restart nginx
#获取网页内容
[root@server ~]# curl www.haha.com
hahahahaha
[root@server ~]# curl www.hello.com
hello
5、基于虚拟目录和用户控制的web网站
-
虚拟目录
-
编辑配置文件
server { listen 192.168.5.100:80; server_name www.hello.com; root /self/hello; location / { } location /test1 { alias /test1; } } server { listen 192.168.5.110:80; server_name www.haha.com; root /self/haha; location / { } location /test2 { alias /test2; } }
-
创建页面文件
[root@server ~]# mkdir /test{1,2} [root@server ~]# echo this is a test1 > /test1/index.html [root@server ~]# echo this is a test2 > /test2/index.html
-
测试
[root@server ~]# curl www.hello.com/test1/ this is a test1 [root@server ~]# curl www.haha.com/test2/ this is a test2
-
-
用户控制
-
安装用户管理工具
yum install httpd-tools -y
-
编辑配置文件
server { listen 192.168.5.100:80; server_name www.hello.com; root /self/hello; location / { } location /test1 { alias /test1; auth_basic on; #开启限制用户访问 auth_basic_user_file /etc/nginx/users; #允许访问用户目录 } }
-
添加可访问用户
[root@server ~]# htpasswd -c /etc/nginx/users zhangsan New password: Re-type new password: Adding password for user zhangsan
-
测试
-
6、基于https的静态页面
生成私钥密钥
[root@server ~]# openssl genrsa -out /etc/pki/tls/private/openlab.key
#储存私钥文件地址:/etc/pki/tls/private/openlab.key
基于私钥生成公钥密钥
[root@server ~]# openssl req -utf8 -new -key /etc/pki/tls/private/openlab.key -x509 -days 365 -out /etc/pki/tls/certs/openlab.crt
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CH
State or Province Name (full name) []:SC
Locality Name (eg, city) [Default City]:CD
Organization Name (eg, company) [Default Company Ltd]:WL
Organizational Unit Name (eg, section) []:TEST
Common Name (eg, your name or your server's hostname) []:LW
Email Address []:ADMIN@outlook.com
#储存公钥的文件地址:/etc/pki/tls/certs/openlab.crt
将文件写入配置文件
server {
listen 192.168.5.100:443 ssl; #https协议使用443端口
server_name www.hello.com;
root /self/hello;
ssl_certificate /etc/pki/tls/certs/openlab.crt;
ssl_certificate_key /etc/pki/tls/private/openlab.key;
location / {
}
location /test1 {
alias /test1;
}
}
重启服务测试
ab.crt
将文件写入配置文件
~~~bash
server {
listen 192.168.5.100:443 ssl; #https协议使用443端口
server_name www.hello.com;
root /self/hello;
ssl_certificate /etc/pki/tls/certs/openlab.crt;
ssl_certificate_key /etc/pki/tls/private/openlab.key;
location / {
}
location /test1 {
alias /test1;
}
}
重启服务测试
[外链图片转存中…(img-ZQp0IBLl-1732951972551)]
这里是因为我们在CA机构认证CA证书,所以存在风险。