nginx是一款高性能而且轻量级的web服务软件,提供静态页面服务,也就是纯文本格式的文件,一般是以.html或者.htm为后缀的文件
特点:
-
稳定性一般(bug很多,所以更新迭代也快)
-
开源(免费),可以做二次封装(二次开发)
-
对系统资源的消耗非常低,而且可以处理http协议(单台物理服务器可以支撑30000-50000的并发请求,工作中一般设为20000台,为了保持服务器的稳定)
nginx的功能:
- 处理静态页面,可以直接提供静态页面的文件服务。html、图片、动画也可以。能够高效地处理并且响应静态页面的请求
- 反向代理,通过反向代理实现负载均衡和高可用
- 处理动态请求(非强项),nginx是把动态请求转发到后端服务器,由专门处理动态请求的服务器进行处理,然后动态请求处理完之后,还是由nginx响应给客户端
- 支持加密的http协议(https)
- 支持虚拟主机
- 支持URL的重定向(页面跳转)
- nginx自带缓存机制,可以缓存静态页面的内容,减轻后端服务器的压力
- nginx自带日志记录,访问记录(哪些主机访问了本机的nginx服务),报错日志(访问失败的记录;配置文件的错误;nginx启动失败的记录)
- 可以支持模块扩展,可以加载不同的模块和自定义配置
- 低内存消耗
- 支持热部署,可以不停机更新配置文件、升级版本
nginx在工作中的主要应用场景:
- 静态页面服务
- 转发动态请求
- 反向代理,负载均衡
- 缓存服务
- 连接保持和会话保持
nginx的安装
- 安装依赖环境:
yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
- 创建一个用户:
useradd -M -s /sbin/nologin nginx
-M 不创建家目录
-s 指定shell - 解压:
tar -xf nginx-1.22.0.tar.gz
- 进入软件包目录进行安装配置:
#指定安装位置 ./configure --prefix=/usr/local/nginx \ #指定用户名 --user=nginx \ #指定所在组 --group=nginx \ #支持https协议 --with-http_ssl_module \ #支持http2.0协议 --with-http_v2_module \ #支持从客户端获取真实IP --with-http_realip_module \ #支持访问nginx状态信息的方法 --with-http_stub_status_module \ #支持对页面进行压缩的功能 --with-http_gzip_static_module \ #支持pcre库 --with-pcre \ #支持stream模块,可以支持四层代理 --with-stream \ #支持加密传输的四层代理 --with-stream_ssl_module \ #允许nginx从代理(proxy协议)的头部获取客户端的真实IP地址 --with-stream_realip_module
- 编译安装:
make && make install
- 进入/usr/local/目录,把其下的nginx/目录的所属用户和所属组改变为nginx:
cd /usr/local chown -R nginx:nginx nginx/
对/usr/local/nginx/目录下的文件做一下解释:
conf:nginx的配置文件目录,nginx.conf是主配置文件
html:保存的是nginx的web文件,也就是工作目录
logs:日志文件目录
sbin:nginx的二进制启动的脚本文件 - 为nginx设置一个软链接,方便使用命令:
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
- 为nginx添加启动项服务:
vim /lib/systemd/system/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 Wants=network-online.target [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
- 为运行文件创建一个目录:
mkdir /usr/local/nginx/run
- 修改nginx的配置文件:
vim /usr/local/nginx/conf/nginx.conf
暂时只改一个pid位置:
- 启动服务:
systemctl daemon-reload systemctl restart nginx
- 在页面文件里写一点东西:
vim /usr/local/nginx/html/index.html
之前的内容可以全部删掉:
-
在浏览器输入虚拟机IP地址就可以看到写的内容了,没显示记得关防火墙:
systemctl stop firewalld setenforce 0
nginx命令的用法:
- nginx -t 检查配置文件语法和配置项是否正确
- nginx -v 显示版本
- nginx -V 显示版本同时显示配置项
nginx.conf配置详解:
稍微看一下,后面会经常用到
#运行用户,如果编译时没指定,默认就是nobody
#user nobody;
#工作进程数量,一般是CPU内核数量的两倍,访问量不大的话1就足够了
worker_processes 2;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#指定nginx的pid文件的位置
pid /usr/local/nginx/run/nginx.pid;
#以上为全局配置,对所有用户都生效
events {
#每个进程可以支持的并发连接数
worker_connections 10000;
}
#可以配置代理、缓存、定义日志、虚拟主机和第三方的模块功能
http {
include mime.types;
default_type application/octet-stream;
#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 logs/access.log main;
#支持下载功能
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
#连接保持,默认65秒
keepalive_timeout 65;
#开启gzip的压缩模式,可以对页面进行压缩
gzip on;
#server就是nginx的虚拟主机模块,只能写在http模块中,不能写在全局中
server {
#虚拟主机的监听端口
listen 80;
#虚拟主机的域名,可以有多个,但是要用","隔开
server_name localhost;
#指定虚拟服务器的默认编码(网页的默认字符集)
charset utf-8;
#access_log logs/host.access.log main;
#指定虚拟主机的默认工作目录,一个server中可以有多个location
location / {
root 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指的是uri,这里我改成了/test
location = /test {
#root指的是url,如果写成root /opt/html,就会去/opt/html/底下找test/下的index.html文件
#如果root html,那么就是从nginx默认位置找test/下的index.html文件
#这里也可以写alias /opt/html/就是找/opt/html/目录下的.html文件,如果想要找到/opt/html/test/下的.html文件,必须精确到/opt/html/test
root html;
#页面的名称
index index.html index.htm;
}
#底下还有,但不重要了
Linux限制了能打开的最大文件数,所以worker_connections的数量不能超过它,想要增加worker_connections的数量,必须先改vim /etc/security/limits.conf(要重启虚拟机才能生效)
配置文件的重点:
- events模块:配置连接数
- http模块:代理地址、日志、虚拟主机都在http
- 一个http模块可以有多个server块,server模块只能在http模块中
- location模块只能写在server模块当中,一个server模块可以有多个location(匹配工作目录)
- root和alias指定工作目录的区别:root是一个拼接的过程;alias是精确匹配,root可以在server块中,但是alias只能在location中,alias匹配的uri如果是/则必须用/结尾,root不需要
实验一:访问状态统计
- 先使用命令nginx -V 查看已安装的 Nginx 是否包含 HTTP_STUB_STATUS 模块
- 修改 nginx.conf 配置文件,指定访问位置并添加 stub_status 配置
- 重启服务:
systemctl restart nginx
- 在浏览器中访问 IP/status
Active connections :表示当前的活动连接数;
server accepts handled requests:表示已经处理的连接信息,
三个数字依次表示已处理的连接数、成功的TCP握手次数、 已处理的请求数。
Reading: 当前正在读取客户端请求的连接数。这表示服务器正在从客户端读取请求数据。
Writing: 当前正在向客户端写入响应的连接数。这表示服务器正在将响应数据发送给客户端。
Waiting: 当前等待客户端请求的连接数。这表示有连接处于空闲状态,等待新的请求。
实验二:基于授权的访问控制
- 先安装httpasswd工具:
yum install -y httpd-tools
- 创建一个用户,并在passwd.db中存储用户信息:
htpasswd -c /usr/local/nginx/passwd.db zhangsan
- 只有root和nginx用户可以读,这里的权限只能写400:
chown nginx /usr/local/nginx/passwd.db chmod 400 /usr/local/nginx/passwd.db
- 修改nginx.conf:
- 检查语法,重启服务:
- 此时在浏览器中访问时就需要输入账户密码了:
输入正确后可以正常访问:
实验三:基于客户端的访问控制
- 先说一下访问控制规则:
deny IP/IP 段:拒绝某个 IP 或 IP 段的客户端访问。
allow IP/IP 段:允许某个 IP 或 IP 段的客户端访问。
规则从上往下执行,如匹配则停止,不再往下匹配。 - 重启服务,然后进行验证:
在192.168.188.13(被禁止访问的客户端)上使用curl访问页面时出现了403报错
在192.168.188.11(允许)上访问时则正常
实验四:基于域名的 Nginx 虚拟主机
- 为虚拟主机提供域名解析,注意用谁做客户端就写在谁的配置里:
echo "192.168.233.21 www.kgc.com www.accp.com" >> /etc/hosts
- 为虚拟主机准备网页文档:
mkdir -p /var/www/html/kgc mkdir -p /var/www/html/accp echo "<h1>www.kgc.com</h1>" > /var/www/html/kgc/index.html echo "<h1>www.accp.com</h1>" > /var/www/html/accp/index.html
- 修改Nginx的配置文件:
- 在客户端上进行访问:
实验五:基于IP 的 Nginx 虚拟主机
- 先创建一个虚拟网卡作为另外的服务器的IP:
ifconfig ens33:0 192.168.188.100 netmask 255.255.255.0
- 修改配置文件:
- 重启并测试:
实验六:基于端口的 Nginx 虚拟主机
- 修改配置文件:
- 重启服务并测试: