目录
1.1 修改 nginx.conf 配置文件,指定访问位置并添加 stub_status 配置代码(修改之前进行备份)
1.2 改完以后重启 nginx 服务,重启nginx服务,在浏览器中访问测试编辑
2.2 修改主配置文件 nginx.conf ,添加相应认证配置项
2.3 重启服务,浏览器访问http://192.168.10.19
引言
Nginx 是一款轻量级的 Web 服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。
一、Nginx 概述
1.什么是 Nginx
没有听过 Nginx?那么你一定听过 Apache 吧!Nginx 同 Apache 一样都是一种 Web 服务器,通过 HTTP 协议提供各种网络服务。
2.Nginx 特点
(1)Nginx 具有很高的稳定性
(2)系统资源消耗低,相比于 Apache 更加轻量级
(3)Nginx 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率
(4)Nginx支持热部署。它的启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在不间断服务的情况下,对软件版本进行进行升级。
(5)对 HTTP 并发连接的处理能力高,单台服务器可支持30000 ~ 50000个并发请求,在实际生产环境中约20000~30000并发连接数。
NG并发连接能力受以下二个因素的影响:
1.CPU个数
2.本地物理服务器系统的最大文件打开数
3.Nginx 应用场景
- 静态服务器(图片,视频服务)
- 动态服务
- 反向代理,负载均衡
- 缓存服务
二、Nginx 服务基础
1. 编译安装 Nginx
1.1 布置环境
[root@localhost /opt]#rz -E #上传安装包
rz waiting to receive.
[root@localhost /opt]#ls
nginx-1.12.2.tar.gz rh
[root@localhost /opt]#systemctl stop firewalld.service #关闭防火墙及开机自启功能
[root@localhost /opt]#systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
[root@localhost /opt]#systemctl disable firewalld.service
[root@localhost /opt]#setenforce 0 #关闭增强
setenforce: SELinux is disabled
[root@localhost /opt]#vim /etc/resolv.conf #定义DNS服务器的地址
[root@localhost /opt]#cat /etc/resolv.conf
nameserver 114.114.114.114
[root@localhost /opt]#ping baidu.com #确保网络连通
PING baidu.com (220.181.38.251) 56(84) bytes of data.
64 bytes from 220.181.38.251 (220.181.38.251): icmp_seq=1 ttl=128 time=32.0 ms
......
1.2 安装依赖包
Nginx 的配置及运行需要 pcre、zlib 等软件包的支持
yum -y install pcre-devel zlib-devel gcc gcc-c++ make
1.3 编译安装
[root@localhost /opt]#tar zxvf nginx-1.12.2.tar.gz
[root@localhost /opt]#ls
nginx-1.12.2.tar.gz nginx-1.12.2 rh
[root@localhost /opt]#cd nginx-1.12.2/
[root@localhost /opt/nginx-1.12.2]#ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE man README src
[root@localhost /opt/nginx-1.12.2]#./configure \
> --prefix=/usr/local/nginx \ #指定nginx安装路径
> --user=nginx \ #指定用户名
> --group=nginx \ #指定组名
> --with-http_stub_status_module #启用 httpd_stub_status_module 模块以支持状态统计
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
[root@localhost /opt/nginx-1.12.2]#make -j3 && make install
为了使 Nginx 服务器的运行更方便,可以为主程序 nginx 创建链接文件,以便管理员直接执行 “nginx” 命令就可以调用 Nginx 的主程序
[root@localhost /opt/nginx-1.12.2]#ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
[root@localhost /opt/nginx-1.12.2]#ls -l /usr/local/sbin/nginx
lrwxrwxrwx. 1 root root 27 5月 19 16:46 /usr/local/sbin/nginx -> /usr/local/nginx/sbin/nginx
创建运行用户、组
#Nginx 服务程序默认以nobody身份运行,建议为其创建专门的用户账号,以便更准确的控制其访问权限,增加灵活性、降低安全风险
[root@localhost /opt/nginx-1.12.2]#useradd -M -s /sbin/nologin nginx
#创建一个名为nginx的用户,不建立宿主目录,禁止登录到Shell环境中
2. Nginx 的运行控制
2.1 检查配置文件
[root@nginx /opt/nginx-1.12.2]#nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
#若要检查其他位置的配置文件,可以使用"-c"选项来指定路径
2.2 启动、停止 Nginx
直接运行 Nginx 即可启动 Nginx 服务器,这种方式将使用默认的配置文件,若要改用其他配置文件,需添加”-c 配置文件路径”选项来指定路径。
这里需要注意,如果服务器中已装有 httpd 等其他 Web 服务软件,应修改端口或停用、卸载,以免造成冲突。
nginx #启动服务
在浏览器中访问此 Web 服务,可以确认 Nginx 服务是否正常运行,默认页面为 “welcome to nginx!”
[root@localhost /opt/nginx-1.12.2]#yum install -y elinks.x86_64
[root@localhost /opt/nginx-1.12.2]#elinks http://nginx
查看 nginx 的 PID 号
[root@localhost /opt/nginx-1.12.2]#cat /usr/local/nginx/logs/nginx.pid
[root@localhost /opt/nginx-1.12.2]#netstat -antp |grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 15693/nginx: maste
通过 kill 命令发送 HUP 信息表示重载配置,发送 QUIT 信息表示退出进程,发送 kill 信息表示杀死进程。当Nginx 进程运行时,PID 号默认存放在 logs/ 目录下得 nginx.pid 文件中,因此若使用 kill 命令,可以根据 PID 号进行控制
kill -3 <PID号>
kill -s QUIT <PID号> #-s选项表示指定信号种类
killall -3 nginx
killall -s QUIT nginx #等同于-3
#重载配置
kill -1 <PID号>
kill -s HUP <PID号>
killall -1 nginx
killall -s HUP nginx #等同于-1
注意,这里谨慎使用 kill -9 选项,可能导致数据丢失,而 kill -3 并不会影响程序运行。
2.3 添加 Nginx 系统服务
方法 1
[root@localhost /opt/nginx-1.12.2]#vim /etc/init.d/nginx
vim /etc/init.d/nginx
#!/bin/bash
# chkconfig: - 99 20
# description: Nginx Service Control Script
COM="/usr/local/nginx/sbin/nginx"
PID="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
$COM
;;
stop)
kill -s QUIT $(cat $PID)
;;
restart)
$0 stop
$0 start
;;
reload)
kill -s HUP $(cat $PID)
;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
exit 0
#chkcofig – 99 20 “-” 表示不启用开机启动管理 (同时 若不加“#”, chkconfig add nginx 会加载不到配置)
COM=”/usr/local/nginx/sbin/nginx” 表示nginx命令程序文件位置
PID=”/usr/local/nginx/logs/nginx.pid” 表示pid号存放目录
chmod +x /etc/init.d/nginx #添加权限
chkconfig --add nginx #添加为系统服务
systemctl stop nginx #关闭服务器
systemctl start nginx #开启服务器
[root@localhost /opt/nginx-1.12.2]#netstat -antp |grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 15693/nginx: master
[root@localhost /opt/nginx-1.12.2]#systemctl status nginx.service
● nginx.service - SYSV: Nginx Service Control Script
Loaded: loaded (/etc/rc.d/init.d/nginx; bad; vendor preset: disabled)
Active: active (exited) since 四 2021-09-30 17:27:36 CST; 54s ago
......
方法2
[root@localhost /opt/nginx-1.12.2]#cd /usr/lib/systemd/system/
[root@localhost /usr/lib/systemd/system]#ls #里面都是启动脚本
abrt-ccpp.service plymouth-poweroff.service
abrtd.service plymouth-quit.service
abrt-oops.service plymouth-quit-wait.service
abrt-pstoreoops.service plymouth-read-write.service
.......
[root@localhost /usr/lib/systemd/system]#vim nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=£orking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/ki11 -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[Unit]
Description=nginx #描述
After=network.target #描述服务类别
[Service]
Type=forking #后台运行类型
PIDFile =/usr/local/nginx/logs/nginx.pid #PID文件位置
ExecStart=/usr/local/nginx/sbin/nginx #启动服务
ExecrReload=/bin/kill -s HUP $MAINPID #根据PID重载配置
ExecrStop=/bin/kill -s QUIT $MAINPID #根据PID终止进程
PrivateTmp=true
[Install]
WantedBy=multi-user.target #启动级别
chmod 754 /lib/systemd/system/nginx.service #设置754权限是一种安全优化
systemctl start nginx.service
systemctl enable nginx.service
systemctl daemon-reload #加载新的 unit 配置文件
watch -n 2 systemctl status nginx network #-n每2秒刷新一下服务运行状态
watch -n 2 systemctl status #查看多个服务状态
在浏览器可以查看服务是否运行
3. 配置文件 nginx.conf
在 Nginx 服务器的主配置文件 /usr/local/nginx/conf/nginx.conf 中,包括全局配置、I/O 事件配置和 HTTP 配置这三大块内容,配置语句的格式为 “关键字 值 ;”(末尾以分号表示结束),以“#”开始的部分表示注释
#作为一名合格的运维,需要有好的备份的习惯!!!
cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak
3.1 全局配置
由各种配置语句组成,不使用特定的界定标记。全局配置部分包括 Nginx 服务的运行用户、工作进程数、错误日志、PID存放位置等基本设置
[root@localhost /usr/local/nginx/conf]#cat nginx.conf
#user nobody; #运行用户
worker_processes 1; #工作进程数量
#error_log logs/error.log; #错误日志存放位置
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid; #PID文件的位置
3.2 I/O 事件配置
(1)使用 “events { } ” 界定标记,用来指定 Nginx 进程的 I/O 相应模型,每个进程的连接数等设置(默认为1024)
events {
worker_connections 1024;
}
(2)
linux 系统对文件打开的数量有最大的限制,通常设置为1024,这个数值很容易会达到,从而造成系统程序或者系统的瓶颈
[root@localhost /usr/local/nginx/conf]#ulimit -a #查看当前进程可以打开的最大文件数
pending signals (-i) 14984
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
......
[root@localhost /usr/local/nginx/conf]#ulimit -n #修改当前进程可以打开文件的最大数量
1024
[root@nginx /usr/local/nginx/conf]#cat /proc/sys/fs/file-max #查看当前系统的最大文件数
378925
#通过命令ulimit -n 65535可以进行更改
[root@localhost /usr/local/nginx/conf]#ulimit -a 65535
[root@localhost /usr/local/nginx/conf]#ulimit -n
65535
3.3 HTTP 配置
(1)使用 “http { } “界定标记,包括访问日志、HTTP 端口、网页目录、默认字符集、连接保持,以及虚拟Web主机、PHP解析等一系列设置,其中大部分配置语句都包含在子界定标记 “server { } ” 内
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; #此选项允许或禁止使用socket的TCP_CORK的选项( 发送数据包前先缓存数据),此选项仅在使用sendfile的时候使用
#keepalive_timeout 0; #连接保持超时时间,单位为秒
keepalive_timeout 65;
#gzip on; #压缩模块,on 表示开启
server { #web服务相关配置
listen 80; #默认监听的端口
server_name localhost; #站点域名 需改为www.gkd.com
#charset koi8-r; #字符集支持(修改为中文UTF-8)
#access_log logs/host.access.log main; #此web服务的主访问日志
location / { #根目录配置
root html; #网站根目录的位置(/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;
}
(2)配置本地映射
[root@localhost /usr/local/nginx/conf]#vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.10.19 www.gkd.com #这里格式必不能错,不然无法访问
或
echo "192.168.10.19 www.gkd.com" >> /etc/hosts
[root@localhost /usr/local/nginx/conf]#curl www.gkd.com #curl可以测试一台服务器是否可以到达一个网站
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@localhost /usr/local/nginx/conf]#cd /usr/local/nginx/html/
[root@localhost /usr/local/nginx/html]#ls
50x.html index.html
[root@localhost /usr/local/nginx/html]#mkdir test
[root@localhost /usr/local/nginx/html]#cd test/
[root@localhost /usr/local/nginx/html/test]#vim index.html
hello world!
[root@localhost /usr/local/nginx/html]#systemctl stop nginx.service
[root@localhost /usr/local/nginx/html]#systemctl start nginx.service
三、Nginx 访问控制
1. 访问状态统计
Nginx内置了 HTTP_STUB_STATUS 状态统计模块,用来反馈当前得 Web 访问情况,配置编译参数时可添加
–with-http_stup_status_dodule 来启用此模块支持。
可使用命令 /usr/local/nginx/sbin/nginx -V 来查看已安装的 Nginx 是否包含 HTTP_STUB_STATUS 模块。
要使用 Nginx 的状本统计功能,除了启用内建模块以外,还需要修改 nginx.conf 配置文件,指定访问位置并添加stub_status 配置代码。
1.1 修改 nginx.conf 配置文件,指定访问位置并添加 stub_status 配置代码(修改之前进行备份)
#先拷贝一份配置文件
[root@localhost conf]#cp /usr/local/nginx/conf/nginx.conf nginx.conf.bak
# 修改 nginx.conf 配置文件
[root@localhost conf]#vim /usr/local/nginx/conf/nginx.conf
events {
use epoll;
worker_connections 1024;
}
server {
listen 80;
server_name localhost;
charset utf-8;
location / {
root html;
index index.html index.htm;
}
location /status { ##访问位置为/status
stub_status on; ##打开状态统计功能
access_log off; ##关闭此位置的日志记录
}
#改完以后检查语句是否正确
nginx -t
1.2 改完以后重启 nginx 服务,重启nginx服务,在浏览器中访问测试
”Active connections“表示当前的活动连接数
”server accepts handled requests“表示已经处理的连接信息,三个数字依次表示:
已处理的连接数、成功的TCP握手次数、己处理的请求数
1.3 结合awk来写shell脚本,如果链接数过高报警
#/bin/bash
a=$(curl 192.168.10.19/status)
b=$(echo $a|awk '{print $3}')
if [ $b -ge 1000 ]
then
echo "连接数过高"|mail -s test 2354838711@qq.com
else
echo "运行良好"
fi
2. 基于授权密码的访问控制
① 生成用户密码认证文件
② 修改主配置文件相对应目录,添加认证配置项
③ 重启服务,访问测试
2.1 生成用户密码认证文件,
如果没有该命令,可使用 yum 安装 httpd-tools 软件包
修改密码文件的权限为400,将所有者改为 nignx ,设置 nginx 的运行用户有读取的权限
[root@localhost /opt]#yum install -y httpd-tools.x86_64
#在/usr/local/nginx/目录下生成passwd.db文件,用户名为 zhangsan
[root@localhost /opt]#htpasswd -c /usr/local/nginx/passwd.db zhangsan
New password: #输入二次密码
Re-type new password:
Adding password for user test #生成用户和密码的密文
[root@nginx /opt]#chown nginx /usr/local/nginx/passwd.db
[root@nginx /opt]#chmod 400 /usr/local/nginx/passwd.db
2.2 修改主配置文件 nginx.conf ,添加相应认证配置项
[root@localhost /usr/local/nginx/conf]#vim nginx.conf
......
location / {
auth_basic "secret"; #在主页配置项中添加认证
auth_basic_user_file /usr/local/nginx/passwd.db;
root html;
index index.html index.htm;
}
2.3 重启服务,浏览器访问http://192.168.10.19
[root@localhost /usr/local/nginx/conf]#nginx -t #检查语法有没有错误
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost /usr/local/nginx/conf]#systemctl restart nginx
3.
基于客户端的访问控制
基于客户端的访问控制是通过客户端 IP 地址,决定是否允许对页面访问。
规则如下:
① deny IP/IP段:拒绝某个 IP 或 IP 段的客户端访问
② allow IP/IP段:允许某个 IP 或 IP 段的客户端访问
③ 规则从上往下执行,如匹配则停止,不再往下匹配
3.1 修改配置文件
[root@localhost conf]#vim /usr/local/nginx/conf/nginx.conf
location / {
#auth_basic "secret";
#auth_basic_user_file /usr/local/nginx/passwd.db;
allow 192.168.10.19; ###客户端IP
deny all;
root html;
index index.html index.htm;
}
3.2 重启服务,使用前面设置允许的机器访问测试
4. 基于域名的Nginx虚拟主机
利用虚拟主机,不用为每个要运行的网站提供一台单独的 Nginx 服务器或单独运行一 组 Nginx 进程,虚拟主机提供了在同一台服务器,同一组 Nginx 进程上运行多个网站的功 能。跟 Apache 一样,Nginx 也可以配置多种类型的虚拟主机,分别是基于 IP 的虚拟主机、 基于域名的虚拟主机、基于端口的虚拟主机。 使用 Nginx 搭建虚拟主机服务器时,每个虚拟 Web 站点拥有独立的“server{}”配置段, 各自监听的 IP 地址、端口号可以单独指定,当然网站名称也是不同的。
4.1
为虚拟主机提供域名解析
4.2
为虚拟主机准备网页文档
4.3
修改 Nginx 的配置文件
server {
listen 80;
server_name www.zhangsan.com;
charset utf-8;
access_log logs/host.access.log;
location / {
root /usr/local/nginx/html/zhangsan;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name www.lisi.com;
charset utf-8;
access_log logs/host.access.log;
location / {
root /usr/local/nginx/html/lisi;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
4.4 重启服务,访问测试
修改IP等信息
修改C:\Windows\System32\drivers\etc\hosts配置文件
访问测试
5.基于IP的 Nginx 虚拟主机
5.1
创建临时虚拟网卡
5.2
修改 Nginx 配置文件
5.3 重启服务,访问测试
6.基于端口的Nginx虚拟主机
6.1
修改 Nginx 配置文件中的监听端口
6.2 重启服务,访问测试
总结
- Nginx 内建的访问统计功能由 stub_status 模块提供,需要在编译时启用 “- -with-http_stub_status_module” 选项
- Nginx 页面访问安全有基于授权和基于客户端两种方式
- Nginx 虚拟主机搭建可基于 IP、域名和端口