文章目录
1.Nginx的介绍
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
Nginx的三个主要功能:
<1>Nginx作为静态资源服务器:可以处理静态文件,索引文件以及自动索引;打开文件描述符缓冲。(缺点:不能处理动态页面)
<2>Nginx作为反向代理服务器:可以缓存和负载均衡服务。部署在不同的服务器上,但是通过统一的域名进入,nginx则对请求进行分发,减轻了服务器的压力。
<3>Nginx作为应用程序接口(API)
Nginx的优点:
Nginx具有高并发、高性能,可扩展性好,内存消耗少,配置文件简单,成本低(低于F5等硬件负载均衡),支持重写功能(http->https),具有健康检测功能,节省带宽,支持gzip压缩,模块化设计的特点。
2.Nginx的安装
环境:测试机中的firewalld、selinux、NetworkManager已关闭
tar zxf nginx-1.18.0.tar.gz
解压包
使配置文件字体有颜色:
mkdir ~/.vim
cp -r /soft/nginx-1.18.0/contrib/vim/* ~/.vim
解决依赖性
yum install -y gcc
yum install -y pcre-devel
yum install -y openssl-devel
编译安装
./configure --prefix=/usr/local/nginx --with-http_ssl_module
预编译
make
编译
make install
安装
运行Nginx
cd /usr/local/nginx/sbin/
./nginx
3.Nginx版本的热部署
Ngnix中的进程分为两类,一类是master进程,一类是worker进程。
其中master进程使用来管理监控控制其下边的worker进程的主进程,这个进程由root发起。。
worker进程是master进程的子进程,是真正处理请求的进程。
当通知ngnix重读配置文件的时候,master进程会进行语法错误的判断。如果存在语法错误的话,返回错误,不进行装载;如果配置文件没有语法错误,那么ngnix也不会将新的配置调整到所有worker中。而是,先不改变已经建立连接的worker,等待worker将所有请求结束之后,将原先在旧的配置下启动的worker杀死,然后使用新的配置创建新的worker。所以nginx 的热部署 ,是在不打断用户请求的情况下更新版本。
3.1 Nginx版本的查看
cd /usr/local/nginx/sbin/
./nginx -V
3.2 Nginx的版本的更新
实验环境:将nginx-1.18.0更新为nginx-1.17.10
1.备份旧版本(以访更新失败)
cd /usr/local/nginx/sbin/
cp nginx nginx.old
2.对新版本重新编译
./configure --prefix=/usr/local/nginx --with-http_ssl_module
对新版预编译时功能不变,参数不变
make
编译
注意:此时不需要再make installl,否则会覆盖原来的二进制程序,只有在第一次按装使需要
3.把新编好的二进制程序放安装目录覆盖原来的文件
cp -f objs/nginx /usr/local/nginx/sbin/nginx
如果程序正常运行强制复制
4.将原先在旧的配置下启动的worker杀死,然后使用新的配置创建新的worker
ps -ef |grep nginx
查看nginx进程
kill -USR2 20986
旧版本停止接收请求,并开启新的master产生新的worker
kill -WINCH 20986
等待旧版本处理完关闭worker进程
3.3 Nginx版本的回退
1.旧版本备份的二进制程序覆盖新版本
cp -f nginx.old nginx
2.关闭新版本的进程,开启旧版本进程
kill -HUP 20986
启动旧版本的worker进程
kill -USR2 21225
新版本不再接收请求
kill -WINCH 21225
关闭新版本的worker进程
kill -9 21225
关闭新版本的masterr进程
4.Nginx的日志切割
access.log: 记录哪些用户,哪些页面以及用户浏览器,IP等访问信息;
error.log: 记录服务器错误的日志
工作中 Nginx 日志基本为 access_log,配置启动后就开始产生日志文件,日积月累的,这个日志文件会越来越大。针对这种情况,采用日志切割防止日志过大。
用户端增加访问测试:
ab -c 1 -n 100000 http://192.168.43.10/index.html
一个并发十万次请求
日志切割
1.对日志备份
mv access.log `date +%F -d -1day`_access.log ###备份前一天日志
2.重新记录新日志
../sbin/nginx -s reopen ##重新打开一个access.log记录新日志
5.Nginx的gzip压缩
压缩前
设置gzip压缩
gzip on;
gzip_min_length 1;
gzip_comp_level 2;
gzip_types text/plainapplication/x-javascript test/css application/xml text/javascript application/x-httpd-php image/gif image/png;
压缩后
6.设置nginx的systemctl启动方式
vim /usr/lib/systemd/system/nginx.service
设置nginx的systemctl启动方式
[Unit]
Description=The Nginx HTTP Server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
重新加载systemctl命令
7.Nginx的配置参数
7.1 指定开启用户
vim /usr/local/nginx/conf/nginx.conf
user nginx nginx; ##指定开启用户
useradd nginx
建立nginx用户
systemctl restart nginx.service
重启nginx服务
ps -ef | grep nginx
查看nginx运行用户
7.2 指定worker进程数
vim /usr/local/nginx/conf/nginx.conf
worker_processes 2;
systemctl restart nginx.service
ps -ef | grep nginx
7.3 指定最大连接数
vim /usr/local/nginx/conf/nginx.conf
events {
worker_connections 65535;
}
7.4 限制并发连接数/速率/带宽
vim /usr/local/nginx/conf/nginx.conf
mkdir /usr/local/nginx/html/download/
建立目录并放置访问内容
systemctl restart nginx.service
user nginx nginx;
worker_processes 2;
events {
worker_connections 65535;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location /download/ {
limit_conn addr 1;
limit_req zone=one burst=5;
limit_rate 50k;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
测试:
1.限制并发数
2.限制传输速率
3.限制带宽
7.5 Nginx日志的设置
vim /usr/local/nginx/conf/nginx.conf
systemctl restart nginx.service
测试:
[root@rhel7 ~]# curl 192.168.43.10
8.Nginx获取真正的用户ip
1.编译real_ip模块
cd /soft/nginx-1.18.0/
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_realip_module
重新预编译
make
编译
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/nginx.old
备份二进制程序
cp -f nginx /usr/local/nginx/sbin/nginx
新的二进制程序覆盖旧的
2.配置nginx模块
vim /usr/local/nginx/conf/nginx.conf
http {
.......
server {
listen 80;
server_name servera.rhel7.com;
set_real_ip_from 192.168.43.10;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
location / {
return 200 "client real ip: $remote_addr\n";
}
}
}
systemctl restart nginx.service
测试
9.Nginx的图片压缩
1.编译图片过滤模块
yum install -y gd-devel-2.0.35-26.el7.x86_64.rpm
解决模块依赖性
cd /soft/nginx-1.18.0/
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_realip_module --with-http_image_filter_module=dynamic
重新预编译
make
编译
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/nginx.old
备份二进制程序
cp -f nginx /usr/local/nginx/sbin/nginx
新的二进制程序覆盖旧的
2.建立目录存放模块
mkdir /usr/local/nginx/modules
建立目录
cp /soft/nginx-1.18.0/objs/ngx_http_image_filter_module.so /usr/local/nginx/modules
3.编辑nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
systemctl restart nginx.service
load_module modules/ngx_http_image_filter_module.so;
user nginx nginx;
worker_processes 2;
events {
worker_connections 65535;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location /download/ {
limit_conn addr 1;
limit_req zone=one burst=5;
#limit_rate 50k;
image_filter resize 150 100;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
测试
10.Nginx实现https访问
1.支持ssl模块
2.生成证书
cd /etc/pki/tls/certs/
make cert.pem
生成证书
3.配置文件
# HTTPS server
#
server {
listen 443 ssl;
server_name servera.rhel7.com;
ssl_certificate cert.pem;
ssl_certificate_key cert.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root /web;
index index.html index.htm;
}
}
4.建立目录及发布内容
mkdir /web
vim /web/index.html
systemctl resatr nginx
测试
11.Nginx的重新功能
实现访问自动跳转到https
vim /usr/local/nginx/conf/nginx.conf
http {
...............
# HTTPS server
#
server {
listen 443 ssl;
server_name localhost;
ssl_certificate cert.pem;
ssl_certificate_key cert.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root /web;
index index.html index.htm;
}
}
server {
listen 80;
server_name servera.rhel7.com;
#rewrite ^/(.*)$ https://servera.rhel7.com/$1;
#rewrite ^/(.*)$ https://servera.rhel7.com/$1 permanent;
rewrite ^/bbs$ https://bbs.rhel7.com/$1 permanent;
}
server {
listen 80;
server_name bbs.rhel7.com;
location / {
root /bbs;
index index.html;
}
}
}
测试
1.临时重写
2.永久重写
3.访问以bbs结尾时重定向
11.Nginx防止盗链
实验环境:配置两台Nginx服务器(servera/serverd)
11.1 盗链的实现
servera:提供访问资源
serverd:进行盗链操作
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name daolian.rhel7.com;
charset utf-8;
location / {
root /web;
index index.html;
}
}
}
mkdir /web
vim /web/index.html
<html>
<body>
<br>盗链图片</br>
<img src="http://servera.rhel7.com/test.jpeg">
</body>
</html>
/usr/local/nginx/sbin/nginx -s reload
盗链测试
图片资源在servera,但是访问serverd可以访问到
11.2 防止盗链
在server中设置
vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name servera.rhel7.com;
location / {
root /web;
index index.html;
}
location ~*\.(gif|jpg|png|jpeg)$ {
root /web;
valid_referers none blocked servera.rhel7.com;
if ($invalid_referer) {
#return 403;
rewrite ^/ http://bbs.rhel7.com/daolian.jpg;
}
}
}
测试
12.Nginx图形化监控工具
解决依赖性
yum install -y GeoIP-1.5.0-14.el7.x86_64.rpm GeoIP-devel-1.5.0-14.el7.x86_64.rpm geoipupdate-2.5.0-1.el7.x86_64.rpm
yum install ncurses-devel -y
解压goaccess并安装
tar zxf goaccess-1.3.tar.gz
cd goaccess-1.3/
./configure --prefix=/usr/local/goaccess --enable-utf8 --enable-geoip=legacy --with-openssl
make && make install
做软连接
ln -s /usr/local/goaccess/bin/goaccess /usr/local/bin
配置nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
location / {
alias /usr/local/nginx/html/report.html;
}
启动goaccess
goaccess access.log -o /usr/local/nginx/html/report.html --real-time-html --time-format='%H:%M:%S' --date-format='%d/%b/%Y' --log-format=COMBINED
可打入后台
访问测试: