一、nginx
1. nginx简介
Nginx (engine x) 是一个高性能的http和方向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
2. nginx与apache的不同
(1)Apache处理速度很慢,占用很多内存资源,而nginx是轻量级的软件,占内存资源少
(2)功能上,Apache所有模块支持动静态编译,Nginx模块都是静态编译的,在等待过程中可以处理其他的请求,效率高
(3)处理连接方式:Nginx支持epoll,Apache不支持
(4)功能文档多,方便学习和部署
(5)抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
二、nginx的安装
1. 准备工作:下载nginx安装包并解压
tar zxf nginx-1.17.1.tar.gz
cd nginx-1.17.1/
vim auto/cc/gcc
# debug
#CFLAGS="$CFLAGS -g" #将debug功能关闭
2. 删除版本信息
#define NGINX_VER "nginx/" #将版本信息删除,注释没有用,在编译时仍会被识别
为了实验效果,这里就不删除版本信息了
3. nginx的编译和安装
因为我们需要对nginx进行编译,所以首先我们要安装gcc编译器用来编译源码
yum install -y gcc openssl-devel
./configure --prefix=/usr/local/nginx --with-file-aio #进行编译
make && make install #安装
4. 利用nginx自带的vim功能进行关键字检测
# vim检验关键字是否写错
mkdir ~/.vim
cp -r contrib/vim/* ~/.vim
5. nginx的相关命令
/usr/local/nginx/sbin/nginx #打开nginx
/usr/local/nginx/sbin/nginx -s reload #重新加载
/usr/local/nginx/sbin/nginx -s reopen #重新打开
/usr/local/nginx/sbin/nginx -s stop #关闭
/usr/local/nginx/sbin/nginx -v #查看版本信息
/usr/local/nginx/sbin/nginx -V #查看编译信息
使用打开命令,开启nginx,在浏览器中输入http://172.25.31.1,可以看到nginx的欢迎页面
6. 创建nginx用户(方便管理)
useradd -s /sbin/nologin nginx #创建用户
ps -ef | grep nginx #查看nginx的主进程及工作进程
cd /usr/local/nginx/
vim conf/nginx.conf #nginx配置文件
在未创建nginx进程时,我们看到nginx的worker进程用户所有人为nobody,为了方便识别和管理,我们创建该用户
三、nginx版本的更新和回退
假设nginx17版为旧版,nginx16版为新版
1. 下载nginx16版,进行解压和编译
tar zxf nginx-1.16.0.tar.gz
./configure --prefix=/usr/local/nginx --with-file-aio
make
cp -f nginx /usr/local/nginx/sbin/nginx #将16的objs/nginx放入该目录下
注意:由于之前已经安装过了nginx,所以在安装nginx16时,我们只使用make命令,就可以安装,make install命令会覆盖原有的z设置
2. 版本的更新
cp -f nginx /usr/local/nginx/sbin/nginx #将16的objs/nginx放入该目录下
ps -ef | grep nginx
kill -USR2 11522 #使16版本的master进程开启
kill -WINCH 11522 #17版的master控制的worker请求处理完成后,不再接收请求
/usr/local/nginx/sbin/nginx -v #查看版本是否更改
master进程在接到信号后,会先重新加载配置文件,然后再启动新的worker进程,并向所有老的worker进程发送信号,告诉他们可以退出了。新的worker在启动后,就开始接收新的请求,而老的worker在收到来自master的信号后,就不再接收新的请求,并且在当前进程中的所有未处理完的请求处理完成后,再退出。
3. 版本的回退
kill -HUP 11522 #是master进程,控制的worker开始接收请求
kill -WINCH 14094 #16版的worker不再接收请求
cp -f nginx /usr/local/nginx/sbin/nginx
/usr/local/nginx/sbin/nginx -v
容易出错的是,在版本回退时,要切换目录到旧版本中,让旧版本中的objs/nginx文件复制到/usr/local/nginx/sbin/nginx中
四、日志的切割
客户端对nginx的请求不断的增加,我们需要对日志进行切割,防止日志文件过大,在处理错误时不好分析
cd /usr/local/nginx/logs
mv access.log `date +%F -d -1day`_access.log #日志的备份
/usr/local/nginx/sbin/nginx -s reopen #重新打开
/usr/local/nginx/sbin/nginx -s reopen #重新加载
ab -c 1 -n 100000 http://172.25.31.1/index.html #请求100000,制造日志
1. 在测试端制造日志
2. 对日志进行备份
日志分割后如果重新打开后,日志信息没有存放在access.log文件中,可以重新加载,因为mv移动文件时,是重命名过程,进
程号不变,日志会存放在备份的文件中,重新加载,只是为了使它存放在access.log文件中
ab -c 1 -n 10 http://172.25.31.1/index.html
3. 在测试端请求10次观察新的日志是否存放在access.log
4. 日志自动备份脚本
需求:在每天的0点0分进行日志的自动备份
cd /usr/local/nginx/logs
vim backup.sh
chmod +x backup.sh
crontab -e #创建定时任务
crontab -l #查看定时任务
五、nginx启动脚本的制作
cp /usr/lib/systemd/system/httpd.service /etc/systemd/system/nginx.service
系统启动脚本 自定义启动脚本
vim /etc/systemd/system/nginx.service
/usr/local/nginx/sbin/nginx -s stop #关闭
systemctl start nginx
ps -ef | grep nginx #查看nginx的master和worker进程
正在运行的nginx进程必须先使用/usr/local/nginx/sbin/nginx -s stop命令关闭,再次开启,使用启动脚本可以生效
六、gzip压缩
cd /usr/local/nginx/html
cat /etc/passwd > index.html #导入内容到发布目录
du -sh index.html #查看大小
cd /usr/local/ngin/conf
/usr/local/nginx/sbin/nginx -s stop
vim nginx.conf
gzip on; #压缩
gzip_min_length 1; #压缩最小长度
gzip_comp_level 3; #压缩等级(0~9)
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; #压缩类型
1. 导入内容到发布目录,方便观察压缩效果
2. 配置压缩参数
3. 网页中进行测试
使用F12键可以调出控制台或者是鼠标右击选则inspect element选项
没有重新加载nginx,访问页面的大小
使用【systemctl reload nginx】命令重新加载后页面的大小
七、nginx并发数和连接速率的设置
cd /usr/local/nginx/conf
vim nginx.conf
limit_conn_zone $binary_remote_addr zone=addr:10m;
客户端ip 域名
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
#set $limit_rate 50k; #设置连接速率(对html目录下的文件生效)
index index.html index.htm;
}
location /download/ { #该目录是html下的目录
limit_conn addr 1; #连接限制为1
limit_rate 1k; #设置连接速率(对html/download下的文件生效)
limit_req zone=one burst=5; #设置并发数
}
mkdir /usr/local/nginx/html/download
systemctl reload nginx
将上一个实验gzip的配置信息注释
创建download目录,在该目录下写入index.html。
重新加载nginx,在网页端或测试机的命令行进行测试,我们会发现网页加载速度非常慢(速率的限制),如果访问的并发数超过定义的并发数,会有错误出现
ab -c 5 -n 1000 http://172.25.31.1/download/index.html #不会报错
ab -c 7 -n 1000 http://172.25.31.1/download/index.html #超过并发数,报错
http://172.25.65.1/index.html #网页缓慢加载
八、获取真实客户端的ip
./configure --prefix=/usr/local/nginx --with-file-aio --with-http_realip_module
make
cp -f nginx /usr/local/nginx/sbin/nginx
vim /usr/local/nginx/sbin/nginx/conf/nginx.conf
systemctl restart nginx
/usr/local/nginx/sbin/nginx -t #检验是否写错
编译后将编译好的objs/nginx文件复制到/usr/local/nginx/sbin/nginx中,重启nginx
编写配置文件,重启nginx服务
在server1中进行测试
systemctl restart nginx
vim /etc/hosts
172.25.31.1 server1 server1.example.com
curl -H "X-Forwarded-For: 2.2.2.2,172.25.31.1" server1.example.com
九、nginx实现端口转发
将获取客户端ip中的配置注释
目的:访问某一主机,该主机中没有该资源,通过端口转发,可以使用其他主机中的资源
server1中操作
vim /usr/local/nginx/sbin/nginx/conf/nginx.conf
server {
listen 80;
server_name localhost;
set_real_ip_from 172.25.31.2;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
systemctl reload nginx
systemctl reload nginx重新加载服务,并在html目录下写入默认发布文件
server2中操作
vim /usr/local/nginx/sbin/nginx/conf/nginx.conf
注释#user nginx nginx;
http {
upstream westos {
server 172.25.31.1:80;
}
include mime.types;
default_type application/octet-stream;
server {
listen 80;
server_name www.westos.org;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #设置后端的服务器获取用户的主机名或真实ip地址,以及代理者的真实ip地址
proxy_pass http://westos;
}
}
/usr/local/nginx/sbin/nginx/ -s reload
/usr/local/nginx/sbin/nginx -s reload 命令重新加载,然后在html目录下写默认发布文件
在测试机中测试
通过访问server2的域名,我们可以看到,访问到的页面内容是server1的
vim /etc/hosts
172.25.31.2 www.westos.org
curl www.westos.org
十、限制网页图片大小
重新进行编译,在编译时需要gd函数库,我们首先要安装该函数库,然后在进行编译和make安装
下载gd-devel-2.0.35-26.el7.x86_64.rpm
yum install -y gd-devel-2.0.35-26.el7.x86_64.rpm
cd nginx-1.17.1
./configure --prefix=/usr/local/nginx --with-file-aio --with-http_realip_module --with-http_image_filter_module=dynamic
make
进行编译和安装(这里就不重复了)
cp -f nginx /usr/local/nginx/sbin/nginx
mkdir /usr/local/nginx/modules
cp ngx_http_image_filter_module.so /usr/local/nginx/modules/
编辑配置文件,设置图片的大小
vim /usr/local/nginx/conf/nginx.conf
load_module modules/ngx_http_image_filter_module.so;
location /download/ {
limit_conn addr 1;
limit_rate 1k;
limit_req zone=one burst=5;
image_filter resize 150 100;
}
systemctl reload nginx
/usr/local/nginx/sbin/nginx -t #用于检验
测试
未重新加载nginx时测试结果如下
使用【systemctl reload nginx】命令,重新启动配置文件后,图片大小改变
十一、nginx网页安全认证
cd nginx-1.17.1
./configure --prefix=/usr/local/nginx --with-file-aio --with-http_realip_module --with-http_image_filter_module=dynamic --with-http_ssl_module
make
cp -f nginx /usr/local/nginx/sbin/nginx
cp ngx_http_image_filter_module.so /usr/local/nginx/modules/
编辑配置文件,开启ssl认证
vim /usr/local/nginx/conf/nginx.conf
生成安全认证文件
cd /etc/pki/tls/certs/
make cert.pem
cn --> shaanxi --> xi'an --> westos --> linux --> server1 --> [email protected]
将钥匙复制到/usr/local/nginx/conf配置文件中。创建默认发布目录/web和默认发布文件index.html
cp cert.pem /usr/local/nginx/conf
mkdir /web
vim /web/index.html
在真机中添加解析
vim /etc/hosts
172.25.31.1 server1 server1.example.org www.westos.org
浏览器中输入https://www.westos.org,首先需要在浏览器中添加证书