本章结构
Nginx服务基础
Nginx访问控制
Nginx虚拟主机
原理:
关于Nginx
一款高性能、轻量级Web服务软件
稳定性高
系统资源消耗低 apache多线程或多进程实现连接(多线程比多线程稍微好些,切换资源浪费少) Nginx单线程
对HTTP并发连接的处理能力高
单台物理服务器可支持30 000 ~ 50 000个并发请求apahce就一两万。面试的时候都说两三万不要太高,理论值
Nginx相对于Apache的优点:
轻量级,同样是 web 服务,比Apache 占用更少的内存及资源,高并发,Nginx 处理请求是异步非塞的,而Apache 则是阻塞型的,在高并发下Nginx 能保持低资源低消耗高性能;高度模块化的设计
编写模块相对简单;社区活跃,各种高性能模块出品迅速.
Apache 相对于Nqinx 的优点:
rewrite,比Nginx 的rewrite强大; 模块超多,基本想到的都可以找到; 少bug,Nginx 的bug 相对较多; 超稳定存在就是理由,一般来说,需要性能的web 服务,用Ninx 。如果不需要性能只求稳定,那就Apache。Nginx处理动态一般动态请求要Apache去做,Nginx只适处理静态网页或反向代理
阻塞型:一个链接请求过来,必须处理完该请求后才能处理第二个链接请求。
异步非阻塞:可以同时接受多个请求,请求之间不是相互阻塞的交给别人处理,别人处理完后再返回。链接请求之间没有阻塞功能
nginx作为网关只负责接受请求转发给后台服务器处理。返回结果。
手动清理Swap和buffers/cache
(1)清理Swap I
swapoff -a && swapon -a
操作说明:如果已经使用了Swap,且当前清空下+buffers/cache还有空间,在执行 swapoff -a操作时,会触发把Swap中的内容交换到内存中,数据不会丢失。
(2)清理buffers/cache:
sync; sync; sync;&& echo 3 >/proc/sys/vm/dropcaches
sleep 2
echo 0 >/proc/sys/vm/drop_caches
操作说明
sync-->将缓存的内从写回到硬盘中echo 3 >/proc/sys/vm/drop_caches--> 修 改drop_caches的值为3,默认为0,改为3系统会清理缓存的内容;
Nginx有几种进程以及作用:
master进程:用来管理worker进程,用于读取配置文件 只有一个
worker进程:用于处理用户链接请求的 可以有多个,配置文件可以修改
网站应用一版推荐使用最新版本,bug最少,功能最全
反向代理:网关服务器
退出进程
kill -3:发送信号给进程让进程关闭服务(会做日志记录)
kill -3 $(cat /usr/local/nginx/logs/nginx.pid)
netstat -Intp | grep nginx
也可:killall -s QUIT nginx(肯能误杀)
不中断服务情况加载配置文件:kill -1 PID号
做计划性定时任务
Nginx日志分割通过mv方式将文件移走
管理服务使用绝对路径nginx允许,关闭服务使用kill指定PID号杀掉
习惯于使用systemctl管理
方法一:
在 /etc/init.d中创建一个脚本,再加入到系统管理管理服务。
vim nginx
#!/bin/bash
#chkconfig: 35 20 99
#desc: this is nginx service control script
NGINX_CMD="/usr/local/nginx/sbin/nginx"
NGINX_PID=" /usr/local/nginx/logs/nginx.pid"
case $l in
start)
$NGINX_CMD
;;
stop)
kill -3 $(cat SNGINX_PID)
;;
restart)
$0 stop
$0 start
;;
reload)
kill -1 $(cat SNGINX_PID)
;;
status)
if ss -Intp | grep nginx &> /dev/null
then
echo 'nginx is running!'
else
echo 'nginx is not running!'
fi
;;
*)
echo "Usage: $o {startlstoplrestart|reload status}'
exit 1
esac
exit 0
chmod +x nginx
chkconfig --add nginx
chkconfig --list nginx
之后可以使用service nginx
方法二:
在 /etc/systemd/system 下创建以.service结尾的文件创建服务脚本
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forkingPIDFile=/usr/local/nginx/logs/nginx.pidExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -S HUP SMAINPID
ExecStop=/bin/kil1 -S OUIT SMAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
-------
[Unit]:服务的说明
Description:描述服务After:依赖,当依赖的服务启动之后再启动自定义的服务
[Service]服务运行参数的设置Type=forking是后台运行的形式,使用此启动类型应同时指定PIDFile=,以便systemd能够跟踪服务的主进程ExecStart为服务的具体运行命令ExecReload为重启命令Execstop为停止命今
PrivateTmmp=True表示给服务分配独立的临时空间注意:启动、重启、停止命令全部要求使用绝对路径
[Instal1]服务安装的相关设置,可设置为多用户
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service
Nginx编译安装
安装支持软件(依赖包)
yum -y install pcre-devel(正则表达式) zlib-devel(压缩功能) openssl-devel(支持HTTPS ) (Nginx使用c语言开发的)
创建运行用户、组(专门为Nginx创建一个账号用户,便于访问)
useradd -M -s /sbin/nologin nginx
.编译安装Nqinx
cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/
cd nginx-1.12.0/
./configure
--prefix=/usr/local/nginx #指定nginx的安装路径
--user=nginx #指定用户名
--group=nginx #指定组名
--with-http stub status module #启用 http stub status module 模块以支持状态统计
make && make install
nginx命令执行路径优化(软连接)
In -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
ls -I /usr/local/sbin/nginx
实现升级操作:
nginx -V
cd /opt
tar -zxvf nginx-1.xx.xx.tar.gz
cd nginx-1.XX.XX
./configure
-prefix=/usr/local/nginx-user=nginx
-group=nginx
--with-http stub status module-with-http ssl module
make 升级软件包时这里不要make install objs中生产新的二进制文件
mv /usr/local/nginx/sbin/nginx /usr/local/nqinx/sbin/nginx_old
cp objs/nginx /usr/local/nginx/sbin/nginx
不中断的方式杀进程:kill -uer2 PID 号或者 到软件包所在位置 make upgrade
make upgrade#或者先 killall nginx ,
再/usr/local/nginx/sbin/nginx
/usr/local/nginx/sbin/nginx (启动nginx)
nginx -V
筛选出nginx配置文件中没有使用的行过滤出来
^$ 空行 ^#以#号开头 \s表示空格或tab等空字符 不止一个多个空字符\s+
cat nginx.conf egrep -v "^$I^\s*#"
认识Nqinx服务的主配置文件 nginx.conf
1、全局块:全局配置,对全局生效:
2 events块:配置影响 Nqinx 服务器与用户的网络连接:
3http块:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置:
4、server块:配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块:
5 location块:用于配置匹配的 uri :
6 upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分。
vim /usr/local/nginx/conf/nginx.conf,全局配置
#user nobody; #运行用户,若编译时未指定则默认为 nobody
worker processes 1; #工作进程数量,一般设置为和 CPT 核数一样
#error log logs/error.log; #错误日志文件的位置
#pid logs/nginx.pid; #PID 文件的位置
2.I/0 事件配置
events [
use epoll; #使用 epoll 模型,2.6及以上版本的系统内核,建议使用epoll模型以提高性能
worker_connections 4096; #每个进程处理 4096 个连接
}
#如提高每个进程的连接数还需执行"limt n5535”命今临时修改本地每个进程可以同时打开的最大文件数。
#在linux平台上,在进行高发CP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制 (这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄
#可使用ulimit -a命令查看系统允许当前用户进程打开的文件数限制。
#epoll是Linux内核为处理大批句柄而作改进的poll,是Linx下多路复用I0接口selet/poll的增强版本,它能显著的减少程序在大量并发连按中只有少量活跃的情况下的系统CPU利用率
HTTP 配置
http{
##文件扩展名与文件类型映射表
include mime .types ;
##默认文件类型
default type application/octet-stream;
##日志格式设定
#log format main '$remote addr - $remote user [Stime local] "$request"'
$status $body_bytes_sent "$http_referer"
'"$http user agent" "$http_x_forwarded for"';
##访问日志位置
#access 1og logs/access.1ogmain;
##开启文件传输模式
sendfile on;
##减少网络报文段的数量
#tcp nopush on:
##连接保持超时时间,单位是秒
#keepalive timeout 0;
keepalive timeout 65;
##gzip模块设置,设置是否开启qzip压缩输出
#qzip on;
##web 服务的监听配置
server
##监听地址及端口
listen 80;
##站点域名,可以有多个,用空格隔开
server name www.kgc.com;
##网页的默认宁符集
charset utf-8;
##根目录配置
location / {
##网站根目录的位置/usr/local/nginx/htmlroot html;
##默认首页文件名
index index.html index.php;
}
##内部错误的反馈页面
error page 500 502 503 504 /50x.html;
##错误页面配置
location = /50x.html {
root html;
}
}
Nigix和apache的区别:
Nigix:轻量级,能处理的并发量更大,异步非阻塞(基于事件)处理进程
apache:资源占用率更高,处理的并发量较低,阻塞的处理进程
怎么查看nginx最大并发数:
查看配置文件有多少工作进程和每个进程能处理的连接数两者相乘为最大并发数
worker_process 与CPU核数一样(auto)
worker_connection 每个进程允许的最大并发数
uname -a 查看
nginx有几种进程和做啥的
master 管理工作进程,管理配置文件
worker 处理用户链接请求
日志格式设定:
$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址:
$remote_addr:对于客户端记录客户端地址,对于后端服务器记录网关服务器地址。只记录上一个节点的地址
$http_x_forwarded_for: 将沿途经过的客户端地址都记录下来,后端服务器可以看到原始客户端地址,也可看到中间转发的网关地址。
$remote_user:用来记录客户端用户名称;
$time_local:用来记录访问时间与时区:
$request:用来记录请求的url与http协议:
$status:用来记录请求状态:成功是200,
$body_bytes_sent :记录发送给客户端文件主体内容大小;
$http_referer: 用来记录从哪个页而链接访问过来的; 直接访问服务器的话该值为空
$http_user_agent: 记录客户浏览器的相关信息:
通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过Sremote add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加 forwarded for信息,用以记录原有客户端的IP地址和原来客户端的适求的服务器地址
location常见配置指令,root、alias、proxy pass
root(根路径配置): root /var/www/html
请求www.kqccom/test/lhtml,会返回文件/var/www/html/test/1.html
alias (别名配留) : alias /var/www/html
请求www.kgc.com/test/l.html,会返回文件/var/www/html/l.html
proxy_ pass (反向代理配留)
访问状态统计配置
1.先使用命令/usr/local/nginx/sbin/nginx -V 查看已安装的 Nginx 是否包含 HTTP_STUB_STATUS 模块
cat /opt/nginx-1.12.0/auto/options l grep YES #可查看 nginx 已安装的所有模块
2.修改 nginx.conf 配置文件,指定访问位置并添加 stub_status配置
cd /usr/local/nginx/conf
cp nginx.conf nginx.conf.bak
vim /usr/local/nginx/conf/nginx.conf
http {
......
server {
listen 80:
server_name www.kgc.comf
charset utf-8;
location / {
root html;
index index.html index.php;
}
##添加 stub_status配置##
location /status { #访问位置为/status
stub status on; #打开状态统计功能
access log off; #关闭此位置的日志记录
}
}
}
重启服务,访问测试:
systemctl restart nginx
刘华器访间 http;//192168.80.10/status
Active connections : 表示当前的活动连接数:
server accepts handled requests ;表示已经处理的连接信息,三个数字依次表示已处理的连接数,成功的TCP提手次数、 已处理的请求数
设置一个脚本,监控服务并发数,每一秒监控当前网站的并发数超过10000(这里用1方便验证)及时报警
#!/bin/bash
count=$(curl -Ls 192.168.80.20/state l grep 'Active connections' awk '(print $3)')
while true
do
if [ scount -ge 1 ];then
echo '警告当前并发负载过高,,并发数为:Scount'
fi
sleep 1
done
基于授权的访问控制
1.生成用户密码认证文件
yum install -y httpd-tools
htpasswd-c /usr/local/nginx/passwd.db zhangsan
chown nginx /usr/local/nginx/passwd.db
chmod 400 /usr/local/nqinx/passwd.db
2.修改主配置文件相对应目录,添加认证配置项
vim /usr/local/nginx/conf/nginx.conf
server {
location / {
......##添加认证配置##
auth basic "secret"; #设置密码提示框文字信息
auth basic user file /usr/ocal/nginx/passwd.db;
}
}
3.重启服务,访问测试
nginx -t
systemctl restart nginx
浏览器访问 http://192,168,80,10
基于客户端的访问
控制访问控制规则如下:
deny IP/IP 段:拒绝某个 IP 或IP 段的客户端访问。
allow IP/IP 段:允许某个 IP 或IP 段的客户端访问。
规则从上往下执行,如匹配则停止,不再往下匹配。
vim /usr/local/nginx/conf/nginx.conf
server {
location / {
......##添加控制规则##
deny all;
allow 192.168.80.200;
}
}
#允许访问的客户端 IP#拒绝其它IP客户端访问
systemctl restart nginx
基于IP,基于域名,基于端口部署虚拟主机
一。什么是虚拟主机
把一台物理服务器划分成多个 “虚拟” 的服务器,我们的一台物理服务器就可以当做多个服务器来使用,从而可以配置多个网站。Nginx 提供虚拟主机的功能,就是为了让我们不需要安装多个 Nginx,就可以运行多个域名不同的网站。
每台虚拟主机都可以是一个独立的网站,可以具有独立的域名,具有完整的Intemet服务器功能(WWW、FTP、Email等),同一台主机上的虚拟主机之间是完全独立的。
Nginx 下,一个 server 标签就是一个虚拟主机。nginx 的虚拟主机就是通过主配置文件 nginx.conf 中 server 节点指定的,想要设置多个虚拟主机,配置多个server节点即可。
配置虚拟主机的方法
配置虚拟主机有三种方法:
基于域名的虚拟主机 : 不同的域名、相同的IP(此方式应用最广泛)。
基于IP地址的虚拟主机 : 不同的域名、不同的IP ( 需要加网络接口 ,应用的不广泛), 基于IP地址。
基于端口的虚拟主机 : 不使用域名、IP来区分不同站点的内容,而是用不同的TCP端口号。
二。基于域名的 Nginx 虚拟主机
为虚拟主机提供域名解析
echo "192.168.92.30 www.wt.com www.nan.com" >> /etc/hosts
为虚拟主机准备网页文档
mkdir -p /var/www/html/wt
mkdir -p /var/www/html/nan
echo '<h1>www.wt.com</h1>' > /var/www/html/wt/index.html
echo '<h1>www.nan.com</h1>' > /var/www/html/nan/index.html
vim /usr/local/nginx/conf/nginx.conf
server_name www.yuji.com;
access_log logs/www.wt.access.log;
root /var/www/html/wt;
server_name www.nan.com;
access_log logs/www.nan.access.log;
root /var/www/html/nan;
http {
server {
listen 80;
server_name www.wt.com;
charset utf-8;
access_log logs/www.wt.access.log;
location / {
root /var/www/html/yuji;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html {
root html;
}
}
server {
listen 80;
server_name www.nan.com;
charset utf-8;
access_log logs/www.nan.access.log;
location / {
root /var/www/html/nan;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html {
root html;
}
}
}
重启服务,访问测试
nginx -t
systemctl restart nginx
三、基于ip地址的nginx虚拟主机
设置临时ip,以达到一台服务器拥有多个ip地址,不同ip访问不同的服务页面
ifconfig ens33:0 192.168.92.30/24
修改配置文件,之后重启服务,访问测试
vim /usr/local/nginx/conf/nginx.conf
listen 192.168.92.30:80;
access_log logs/www.wt.access.log;
root /var/www/html/wt;
listen 192.168.92.30:80;
access_log logs/www.nan.access.log;
root /var/www/html/nan;
nginx -t
systemctl restart nginx
四。基于端口的nginx虚拟主机
vim /usr/local/nginx/conf/nginx.conf
listen 192.168.72.10:666;
access_log logs/www.yuji.access.log;
root /var/www/html/yuji;
listen 192.168.72.10:888;
access_log logs/www.nant.access.log;
root /var/www/html/nan;
nginx -t
systemctl restart nginx