一、web服务器
一般提到web服务器,就是指httpd或Nginx服务。
httpd就是Apache,在国内用的较少。
Nginx在国内使用的比较广泛。
1.1 Nginx
Nginx是开源的,是一款高性能,轻量级的web服务软件。
Nginx稳定性高,而且版本迭代比较快。目前主流的是22、24版本。修复bug比较快,安全性好。
Nginx消耗系统资源很低。http的请求并发连接,单台服务器可以支持30000-50000个并发请求(系统资源全部分配给Nginx使用的情况下)。单个节点的Nginx分配的资源一般支持10000-20000个并发。
1.2 Nginx的功能
Nginx的功能介绍
- 静态文件服务 :静态页面,可以直接提供静态文件服务,
html
css
jsp
等。处理静态页面的响应速度很快,效率很高。 - 代理功能 :正向代理,反向代理。可以实现负载均衡,高可用和故障转移。
- 动态内容处理 :Nginx并不能直接处理动态请求,可以通过中间件(如
php
Tomcat
)把动态请求转发给后端服务器。 - 支持http和https。
- 可以实现重定向。
- 虚拟主机 :一个Nginx可以配置多个域名和站点。
- Nginx自带缓存机制。
- 性能可扩展 :处理能力可以随时调整。
Nginx的应用场景
- 静态页面
- 转发动态请求
- 反向代理、负载均衡
- 缓存服务
二、Nginx源码安装
准备:关闭防火墙及安全机制,准备接收文件
systemctl stop firewalld #关闭防火墙
setenforce 0 #关闭安全机制
rz -E #接收文件
第一步:把源码包放入到系统之中。
使用ssh远程终端的可以直接从本机拖进虚拟机
第二步:安装编译过程中需要的依赖环境。
yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
第三步:创建Nginx程序运行需要的用户和组
useradd -M -s /sbin/nologin nginx #不创建家目录,指定/sbin/nologin
第四步:编译安装
- 解压源码包
tar -xf nginx-1.22.0.tar.gz
cd nginx-1.22.0/
- 开始配置,配置程序的安装路径,安装基于程序需要的安装组件
./configure --prefix=/usr/local/nginx \ #配置安装路径
--user=nginx \ #配置用户
--group=nginx \ #配置组
--with-http_ssl_module \ #支持https的加密功能ssl/tsl
--with-http_v2_module \ #支持http2.0协议
--with-http_realip_module \ #支持Nginx获取客户端的真实IP地址
--with-http_stub_status_module \ #支持Nginx获取访问状态信息的功能
--with-http_gzip_static_module \ #支持页面压缩文本
--with-pcre \ #支持pcre库
--with-stream \ #支持4层代理的模块
--with-stream_ssl_module \ #支持对tcp连接的加密
--with-stream_realip_module #持从代理协议中获取客户端的真实ip地址
#无注释的命令
./configure --prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
- 编译和安装
make -j 4 && make install #第一个make:编译;第二个make install:安装
#make -j 4 启动4个CPU进行处理(加快安装速度)
第五步:后续配置,设置权限和系统管理配置
- 配置权限
cd /usr/local
chown -R nginx.nginx nginx #对/usr/local目录下nginx目录更改所属
-
/usr/local/nginx
目录下的四个目录的解释
conf
:配置文件目录,主配置文件nginx.conf
html
:工作目录:50x.html
默认的访问操作打开的页面,index.html
logs
:日志目录:访问日志、报错日志
sbin
:二进制启动脚本nginx
-
做一个软连接,让系统能够识别nginx的指令
ln -s /usr/local/nginx/sbin/nginx /usr/sbin (/usr/bin也行)
- 设置系统控制,系统能够对nginx这个软件的运行状态进行控制。
vim /lib/systemd/system/nginx.service
#对 nginx.service 内容进行修改如下
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
#表示支持dns解析以及该软件依赖于网络。
Wants=network-online.target
#先启动网络服务,才能启动nginx
[Service]
Type=forking
PIDFile=/usr/local/nginx/run/nginx.pid
#注意文件位置,如果不对 启动不了
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
#注意启动文件位置
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
#支持多用户模
- 修改nginx的配置文件,把pid文件的位置指向到设置的位置
cd /usr/local/nginx
mkdir run
chown -R nginx.nginx /usr/local/nginx/run #递归修改run目录所属
cd /usr/local/nginx/conf
vim nginx.conf #编辑要修改的配置文件
修改 nginx.conf 文件的内容中 pid 指向的位置
pid /usr/local/nginx/run/nginx.pid;
修改完后
nginx -t #检测nginx.conf当中的语法是否正确,提示OK则正常
systemctl daemon-reload #重新加载systemd守护进程
systemctl restart nginx #重启nginx服务
nginx -v #查看nginx版本号
systemctl stop nginx #停止nginx服务
在web页面访问虚拟机IP地址,可以看到“welcome to nginx”
三、Nginx介绍
Nginx的常用命令
nginx -t :检测配置文件的语法是否正确
nginx -v :显示Nginx的版本
nginx -V :显示Nginx的版本和配置项
nginx -s :signal,信号:
- stop :关闭Nginx
- reload :重新加载Nginx,如果更改了配置文件,
nginx -s reload
无需重启服务。
三、Nginx的配置
nginx.conf
配置文件,在/usr/local/nginx/conf/
目录下修改这个配置文件
3.1 全局模块
#user nobody;
#默认程序用户就是Nginx,这里可以保持注释无需修改
worker_processes 1; #1位置的数字可自定义
工作进程组,一般设置为系统内核数量的两倍,但一般不超过8个,超过8个性能反而会下降
pid ......
#pid文件的位置
events {
worker_connections 1024;
}
events
模块 :决定了Nginx能够处理的连接数,连接数和worker_processes
的数值相乘。
处理进程的过程必然涉及配置文件和展示以页面,也就是涉及打开文件的数量。Linux默认打开的文件数就是1024个。如果不修改Linux打开文件数量的默认配置,那这里设置的再高也无效。
注:修改默认打开的文件数的方法
vim /etc/security/limits.conf
#添加以下行
* soft nproc 65535
#能打开的进程最大数量的软限制为65535,65535是最大数
* hard nproc 65535
* soft nofile
#进程打开文件数的最大值为65535
* hard nofile
这个配置要生效,只能重启系统,所以这是系统初始化时要做好的配置。
3.2 http
模块
http
模块 :转发和处理http
请求,设置代理(正向代理和反向代理),缓存,定义日志格式,重定向配置。
在http
模块当中,包含:
server
模块 :http
模块里面可以有多个server
模块
在server
模块中包含:
location
模块
在server
模块当中可以有多个location
模块
http {
include mime.types;
#文件扩展名与问价类型的映射表。Nginx能够打开的文件和支持的文件类型
default_type application/octet-stream;
#默认支持的文件类型:.html .jsp .js .php
#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访问日志的格式和error.log错误日志的格式
#access_log logs/access.log main;
#默认的访问日志的存放路径
sendfile on;
#支持文件发送或者下载
#tcp_nopush on;
#默认就是异步非阻塞模式
#keepalive_timeout 0;
keepalive_timeout 65;
#连接保持的时间,默认65秒,单位是秒
#gzip on;
#gzip模块,设置是否开启页面压缩
#server:开启web服务的模块
server {
#server模块的内容见下文
}
}
3.3 server
模块
server
模块包含location
模块,可以包含多个location
模块
server
模块内容的解释:
server {
listen 80;
#Nginx默认监听端口
server_name localhost;
#配置站点的域名
#charset koi8-r;
#网页的默认字符集
#access_log logs/host.access.log main;
#server默认访问日志的地址,在/usr/local/nginx/logs下
#location模块:网页匹配的工作目录的地址和支持打开页面的文件类型
location / {
# / 表示对家目录下所有的请求进行处理
root html;
#root表示Nginx工作目录的家目录,即/usr/local/nginx/html
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
其中,可以用charset uft-8;
表示支持中文
3.4 location
模块
location
模块:配置打开网页匹配的工作目录的地址和支持打开页面的文件类型
#location模块:网页匹配的工作目录的地址和支持打开页面的文件类型
location / {
# location后面的 / 表示对家目录下所有的请求进行处理
root html;
#root表示Nginx工作目录的家目录,即/usr/local/nginx/html
index index.html index.htm;
}
解释:
root 表示 Nginx工作目录的家目录,默认从Nginx的根目录(安装路径)/usr/local/nginx
出发;
所以root html;
就表示工作目录的家目录为Nginx根目录下的html
;
location 后面跟的路径表示URL的匹配规则,上文中后面跟的是 /
,表示对访问家目录(工作目录)下的所有请求进行处理,不指定URI时(比如访问20.0.0.10,而不是20.0.0.10/test1),默认返回index.html
location 后面跟的路径不是/
时,比如:
location /ykw {
root /var/www/html;
index index.html index.htm;
}
此时定义工作目录的家目录为 /var/www/html
location /ykw
表示可以对家目录下的ykw
这个目录进行匹配,如IP地址为20.0.0.10
curl 20.0.0.10/ykw
就会返回/var/www/html/ykw
这个目录下的index.html
如果这个目录下没有可返回的文件,Nginx会返回状态码404
此外,alias
也可以指定家目录,指定的模式和root略有区别:
- root的匹配模式,拼接root后的路径和location后的路径
- alias的匹配模式,匹配Nginx的工作目录,路径是绝对路径
- alias只能写在http模块当中server模块的location模块当中
- root可以写在server模块,也可以在http,也可以在location中
- alias匹配工作目录,不能使用重定向功能
工作中一般会使用root来指定家目录,alias要看情况使用。
四、Nginx服务的优化
4.1 隐藏版本号
方法一 :在http
模块中添加行
#隐藏版本号
server_tokens off;
方法二 :修改版本信息
进入源码安装包
cd /安装包根目录/src/core
vim nginx.h
解注释以下行并修改
define NGINX_VERSION "Don't you guess!"
difine NGINX_VER "Gotcha!/" NGINX_VERSION
回到安装包根目录,重新编译安装
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
make -j 4 && make install
五、实验
5.1 实验一:统计Nginx访问状态
vim nginx.conf
location /status {
stub_status on;
#打开状态统计的功能
access.log off;
#关闭status的访问日志
}
Active connections: 1
#当前活动的连接数
server accepts handled requests
#服务端已经处理的连接数
1 1 1
Reading: 0 writing: 1 waiting: 0
三个数子从左到右:已经处理的连接数,成功的tcp握手次数(连接数),已经处理的请求数
reading :表示服务端正在从客户端读取请求的数据
writing :表示服务端正在将响应数据发送给客户端
waiting :表示有连接处于空闲状态,等待新的请求
5.2 实验二:对访问进行控制
-
基于密码的授权进行访问控制
yum -y install httpd-tools #htpasswd的工具,要先安装
htpasswd -c /usr/local/nginx/passwd.db ykw 输入两次密码 #设置登录Nginx的用户 ykw 和 密码 chown nginx passwd.db chmod 400 passwd.db #passwd.db 的权限为只读
vim nginx.conf #添加/修改以下内容 location / { root html; index index.html; auth_basic "secret"; #开启用户密码验证 auth_basic_user_file /usr/local/nginx/passwd.db; #使用指定的加密文件 }
-
基于客户端的访问控制,根据IP地址进行控制
vim nginx.conf #添加/修改以下内容 location / { root html; index index.html; #添加一个控制规则 deny 20.0.0.20; #也可以屏蔽网段,如 deny 20.0.0.0/24; #allow all; #allow 可以不写,默认就是allow }
-
基于域名的访问控制
vim nginx.conf #添加/修改以下内容 server { listen 80; server_name www.ykw.com; #定义域名为www.ykw.com charset utf-8; #支持中文 access_log logs/www.ykw.com.access.log; #server默认访问日志的地址 #网页匹配的工作目录的地址和支持打开页面的文件类型 location / { root /var/www/html/ykw; index index.html index.htm; } } server { listen 80; server_name www.test1.com; charset utf-8; access_log logs/www.test1.com.access.log; location / { root /var/www/html/test1; index index.html index.htm; } }
编辑默认访问页面
mkdir -p /var/www/html/xxx echo "Show me the money! " > /var/www/html/ykw/index.html echo "自律使你自由!" > /var/www/html/test1/index.html
在另一台主机
test2
20.0.0.20
的/etc/hosts
文件中作dns映射20.0.0.10 www.ykw.com www.test1.com
在
test2
上操作curl www.ykw.com Show me your money! curl www.test1.com 自律使你自由!
-
基于IP地址的访问控制
创建虚拟主机
ifconfig ens33:0 20.0.0.101
以3中的server为例,修改server模块中listen 后面为 IP地址:端口
server { listen 20.0.0.10:80; server_name www.ykw.com; charset utf-8; access_log logs/www.ykw.com.access.log; location / { root /var/www/html/ykw; index index.html index.htm; } } server { listen 20.0.0.101:80; server_name www.test1.com; charset utf-8; access_log logs/www.test1.com.access.log; location / { root /var/www/html/test1; index index.html index.htm; } }
在
test2
上操作curl 20.0.0.10 Show me your money! curl 20.0.0.101 自律使你自由!
-
基于端口的访问控制
修改server模块中listen 后面的端口号
同一个IP地址可以对多个端口提供服务server { listen 20.0.0.10:80; server_name www.ykw.com; charset utf-8; access_log logs/www.ykw.com.access.log; location / { root /var/www/html/ykw; index index.html index.htm; } } server { listen 20.0.0.10:8080; server_name www.test1.com; charset utf-8; access_log logs/www.test1.com.access.log; location / { root /var/www/html/test1; index index.html index.htm; } }
在
test2
上操作curl www.test1.com Show me your money! curl www.ykw.com Show me your money! #实际上都是默认访问的20.0.0.10:80的服务 curl www.ykw.com:8080 自律使你自由! curl www.test1.com:8080 自律使你自由! #访问的是20.0.0.10:8080的服务
5.3 独立文件配置server模块
把server模块的配置保存在单独的文件中
vim nginx.conf
#添加以下内容
include /usr/local/nginx/conf.d/*.conf;
#可以识别到conf.d目录下。只包含server模块的conf文件
被识别到的conf文件里只写有server模块的配置,被nginx.conf识别到以后,会自动调用nginx.conf文件中的http模块的配置。