1. 关于Nginx
-
一款高性能、
轻量级Web服务软件- 稳定性高
- 系统资源消耗低
- 对HTTP并发连接的处理能力高
- 单台物理服务器可支持30000~50000个并发请求
Nginx是一个轻量级/高性能的反向代理Web服务器,用于暂HTTP、HTTPS、SMTP、POP3和IMAP协议。他实现非常高效的反向代理、负载平衡,他可以处理2-3万并发连接数,官方监测能支持5万并发,现在中国使用nginx网站用户有很多,例如:新浪、网易、腾讯等。
1.2. Nginx有哪些优点?
- 跨平台、配置简单。
- 非阻塞、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发。
- 内存消耗小:开启10个Nginx才占150M内存。
- 成本低廉,且开源。
- 稳定性高,宕机的概率非常小。
- 内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其他的节点上
1.3. Nginx应用场景
- http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
- 虚拟主机。可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机。
- 反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。
- nginx中也可以配置安全管理、比如可以使用Nginx搭建API接口网关,对每个接口服务进行拦截.
1.4. Nginx和Apache的区别
- nginx更轻量比apache 占用更少的内存资源
- nginx抗并发能力更强
- nginx是模块化设计,配置相对简单,组件也比较apache少
- nginx处理请求是异步非阻塞,epache是阻塞性的
- nginx可以多个连接对应一个进程,apache是一个连接对应一个进程
- nginx是基于事件的web服务器,apache是基于流程的web服务器
2 编译安装nginx服务
1 关闭防火墙,将nginx所需压缩包上传到/opt目录下
nginx-1.12.0.tar.gz
[root@localhost ~]#systemctl stop firewalld.service
[root@localhost ~]#setenforce 0
[root@localhost opt]#ls
nginx-1.12.0.tar.gz rh
2 安装依赖包
#nginx的配置及运行需要pcre、zlib、openssl等软件包的支持,因此需要安装这些软件的开发包,以便提供相应的库和头文件。
[root@localhost yum.repos.d]#yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make
#各程序作用解释如下:
gcc #C语言的编译器
gcc-c++ #C++的编译器
make #源代码编译器(源代码转换成二进制文件)
pcre-devel #perl的接口开发包,提供正则表达式
zlib-devel #提供压缩功能
3 创建运行用户、组(Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)
[root@localhost ~]#useradd -M -s /sbin/nologin nginx
4 编译安装Nginx
[root@localhost ~]#cd /opt
[root@localhost opt]#ls
nginx-1.12.0.tar.gz rh
[root@localhost opt]#tar zxvf nginx-1.12.0.tar.gz
[root@localhost opt]#ls
nginx-1.12.0 nginx-1.12.0.tar.gz rh
cd nginx-1.12.0/
./configure \
--prefix=/usr/local/nginx \ #指定nginx的安装路径
--user=nginx \ #指定用户名
--group=nginx \ #指定组名
--with-http_stub_status_module
#启用 http_stub_status_module 模块以支持状态统计
[root@localhost nginx-1.12.0]#make -j 4 && make install
[root@localhost nginx-1.12.0]#cd /usr/local/nginx/
[root@localhost nginx]#ls
conf html logs sbin
conf #nginx的配置文件
html #nginx的网页根目录
logs #nginx的日志文件
sbin #nginx的管理程序
[root@localhost sbin]#cd /usr/local/nginx/
[root@localhost nginx]#cd sbin/
[root@localhost sbin]#ls
nginx
将nginx的操作指令放入环境变量PATH的目录下
将nginx的可执行文件做个软链接,放入环境变量PATH的目录下,让系统识别nginx的操作指令。
[root@localhost nginx-1.12.0]#ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin
#让系统识别nginx的操作命令
[root@localhost sbin]#nginx -V
nginx version: nginx/1.12.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with- http_stub_status_module
[root@localhost sbin]#nginx -v
nginx version: nginx/1.12.0
5.检查、启动、重启、停止 nginx服务
检查配置文件是否配置正确
[root@localhost sbin]#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 sbin]#nginx
查看nginx的PID号
[root@localhost sbin]#cat /usr/local/nginx/logs/nginx.pid #查看nginx的PID号
60536
[root@localhost sbin]#pgrep nginx -l #查看nginx的主进程号和工作进程号
[root@localhost sbin]#lsof -i :80 #查看nginx的主进程号和工作进程号
[root@localhost sbin]#ss -ntap | grep nginx #查看nginx的主进程号和工作进程号
[root@localhost sbin]#netstat -ntap | grep nginx #查看nginx主进程的PID
停止nginx服务 注意:nginx有主进程和工作进程,一定要杀死主进程(即父进程)。
[root@localhost sbin]#kill -3 7344 //通过主进程的PID号杀死nginx进程
[root@localhost sbin]#netstat -ntap | grep nginx //此时已查不到进程
#杀死nginx进程的多种方式
kill -3 <PID号> //"kill -3"杀死进程时可以记录事故现场的信息(打印进程各个线程的堆栈信息)
kill -s QUIT <PID号>
killall -3 nginx
killall -3 QUIT <PID号>
重载nginx服务
[root@localhost sbin]#nginx //启动nginx服务
[root@localhost sbin]#cat /usr/local/nginx/logs/nginx.pid
60798
[root@localhost sbin]#kill -1 60798 //重载nginx服务
[root@localhost sbin]#ss -ntap | grep nginx
LISTEN 0 128 *:80 *:* users:(("nginx",pid=60828,fd=6),("nginx",pid=60798,fd=6))
[root@localhost sbin]#kill -s HUP 60798 //重载nginx服务
[root@localhost sbin]#ss -ntap | grep nginx
LISTEN 0 128 *:80 *:* users:(("nginx",pid=60874,fd=6),("nginx",pid=60798,fd=6))
#重载nginx服务的多种方式
kill -1 <PID号>
kill -s HUP <PID号>
killall -1 nginx
killall -s HUP <PID号>
日志分割,重新打开日志文件
kill -USR1 <PID号>
[root@localhost sbin]#cd /usr/local/nginx/logs/ //切换到日志目录
[root@localhost logs]#ls
access.log error.log nginx.pid
[root@localhost logs]#mkdir log.bak
[root@localhost logs]#mv *.log log.bak/ //将原有日志移走
[root@localhost logs]#ls
log.bak nginx.pid
[root@localhost logs]#kill -USR1 60798 //重新生成日志文件
[root@localhost logs]#ls
access.log error.log log.bak nginx.pid
新版本升级
#平滑升级:
kill -USR2 <PID号>
#新版本升级:
tar zxvf nginx-XX.XX.tar.gz #XX代表新版本号
cd nginx-XX.XX
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_ssl_module
#重新编译:
make #重新编译
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_old #备份旧文件,方便回滚
cp objs/nginx /usr/local/nginx/sbin/nginx #将新的运行文件放入安装的运行目录
make upgrade #编译升级
#或者先 killall -3 nginx ,再 /usr/local/nginx/sbin/nginx
6 添加 Nginx 系统服务
方法一:
[root@localhost logs]#vim /etc/init.d/nginx
#!/bin/bash
#chkconfig: 35 99 20
#description:This is nginx control script
RUN="/usr/local/nginx/sbin/nginx"
PID=`cat /usr/local/nginx/logs/nginx.pid`
case "$1" in
start)
$RUN
;;
stop)
kill -3 $PID
;;
restart)
kill -3 $PID
$RUN
;;
reload)
kill -1 $PID
;;
*)
echo "正确用法为:$0 {start|stop|restart|reload}"
esac
[root@localhost logs]#chmod +x nginx //给nginx赋予权限
[root@localhost logs]#chkconfig --add nginx //将nginx加入chkconfig
[root@localhost logs]#chkconfig --list //查看chkconfig列表
[root@localhost logs]#service nginx start //开启服务,或 systemctl start nginx
[root@localhost logs]#ss -natp | grep nginx //查看服务
方法二:
[root@localhost logs]#cd /lib/systemd/system/
[root@localhost system]#vim nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[root@localhost system]#systemctl daemon-reload //重载配置
[root@localhost system]#systemctl start nginx //启动服务
[root@localhost system]#netstat -natp | grep nginx //查看服务
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 19193/nginx: master
#之后可以使用systemctl start|stop|restart|enable nginx 来管理服务
[Unit] #服务的说明
Description #描述服务
After #依赖,当依赖的服务启动之后再启动自定义的服务
[Service] #服务运行参数的设置
Type=forking #是后台运行的形式,使用此启动类型应同时指定
PIDFile= #以便systemd能够跟踪服务的主进程
Execstart #为服务的具体运行命令
ExecReload #为重启命令
ExecStop #为停止命令
PrivateTmp=true #表示给服务分配独立的临时空间
#注意:启动、重启、停止命令全部要求使用绝对路径
[Install] #服务安装的相关设置,指定运行级别,可设置为多用户(即字符界面)
默认首页文件位置在 /usr/local/nginx/html/ 目录下。
[root@localhost nginx-1.12.0]#cd /usr/local/nginx/html/
[root@localhost html]#ls
50x.html index.html //index.html是默认首页文件
3 认识Nginx服务的主配置文件
主配置文件位置:/usr/local/nginx/conf/nginx.conf
/usr/local/nginx/conf/ 目录下:
- nginx.conf 是主配置文件
- nginx.conf.default 是主配置文件的备份文件
主配置文件中有六个主要模块: 1、全局块:全局配置,对全局生效。
2、events块:配置影响Nginx服务器与用户的网络连接。
3、http块:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。
4、server块:配置虚拟主机的相关参数,一个http块中可以有多个server 块。每个 server 块就相当于一个虚拟主机。。
5、location块:用于配置匹配的url,一个server块中可以有多个location块。
6、upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分。
1.全局配置
vim /usr/local/nginx/conf/nginx.conf
#user nobody; //运行用户,若编译时未指定则默认为nobody,若编译指定了用户则会写到二进制程序里变成默认配置。此前编译时指定了"--user=nginx",所以现在二进制程序中的运行用户为nginx
worker_processes 1; //工作进程数量,一般设置为和CPU核数一样
#error_log logs/error.log; //错误日志文件的位置
#pid logs/nginx.pid; //PID文件的位置
2.I/O 事件配置
events {
use epoll; #使用epoll模型。2.6及以上版本的系统内核,建议使用epo11模型以提高性能,实现I/O多路复用
worker_connections 4096; #每个工作进程处理4096个连接。默认值为1024。一般设置为2的次方
}
#epoll是Linux内核为处理大批句柄而作改进的poll,是Linux 下多路复用IO接口select/poll的增强版本,它能显著的减少程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
#如提高每个进程的连接数还需执行“ulimit -n 65535”命令临时修改本地每个进程可以同时打开的最大文件数。
#在Linux平台上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是个文件句柄)。
#可使用"ulimit -a"命令查看系统允许当前用户进程打开的文件数限制。
例如现在CPU有两核,想要实现支持30000并发量 。
软件配置支持多少并发量,由主配置文件nginx.conf决定:理论上支持的并发量=工作进程数量×每个工作进程处理的连接数。
将工作进程数设置为2(与CPU核数一致),每个工作进程处理15000个连接(一般设置为2的次方),那么软件支持的最大并发数量是30000个。
系统会限制本地每个用户进程可以同时打开的最大文件数量,即系统会限制每个进程的连接数。
查看系统支持多少并发量:
- 使用"ulimit -a"可查看系统允许当前用户进程打开的文件数限制。
修改系统支持的最大并发量:
- “ulimit -n 65535”命令可临时修改本地每个用户进程可以同时打开的最大文件数。
- vim /etc/security/limits.conf,编辑该文件可永久修改。
nginx hard nofile 30000
#第一列为用户和组
#第二列为磁盘限额,软硬限制。hard表示硬限制。
#第三列为项目。nofile表示最大可打开文件数量。
#第四列为相应项目的数量
3.HTTP 配置
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" "S$http_x_forwarded_for"' ;
##访问日志位置
#access_log logs/access.1og main;
##开启文件传输模式
sendfile on;
##减少网络报文段的数量
#tcp_nopush on;
##连接保持超时时间,单位是秒
#keepalive_timeout 0;
keepalive_timeout 65;
##gzip模块设置,设置是否开启gzip压缩输出
#gzip on;
##Web服务的监听配置
server {
##监听地址及端口
listen 80;
##站点域名,可以有多个,用空格隔开
server_name www.yuji.com;
##网页的默认字符集
charset utf-8;
##根目录配置
location / {
##网站根目录的位置/usr/1ocal/nginx/html
root html ;
##默认首页文件名
index index.html index.php;
}
##内部错误的反馈页面
error_page 500 502 503 504 /50x.html;
##错误页面配置
location = /50x.html {
root html ;
}
}
}
------------------------------------------------
日志格式设定:
$remote_addr与$http_x_forwarded_for 用以记录客户端的ip地址。
$remote_addr:记录上一个请求消息发送端的IP(代理服务器的IP)。
$http_x_forwarded_for :会记录所有经过的服务器的IP地址。
$remote_user:用来记录客户端用户名称。
$time_local:用来记录访问时间与时区。
$request:用来记录请求的url与http协议。
$status:用来记录请求状态;成功是200。
$body_bytes_sent:记录发送给客户端文件主体内容大小。
$http_referer:用来记录从哪个页面链接访问过来的。
$http_user_agent: 记录客户浏览器的相关信息。
通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
查看nginx支持的文件类型
location常见配置指令:root、alias、proxy_pass
- root(根路径配置):root /var/www/html 请求www.wang.com/test/1.html,会返回文件/var/www/html/test/1.html
- alias(别名配置,即虚拟路径):alias /var/www/html 请求www.wang.com/test/1.html,会返回文件/var/www/html/1.html
- proxy_pass(反向代理配置)
访问状态统计配置
1.先使用命令/usr/local/nginx/sbin/nginx -V 查看已安装的 Nginx 是否包含 HTTP_STUB_STATUS 模块
[root@localhost conf]#cat /opt/nginx-1.12.0/auto/options |grep YES
#可查看 nginx 已安装的所有模块
[root@localhost conf]#cd /usr/local/nginx/conf
[root@localhost conf]#cp nginx.conf nginx.conf.bak //备份原配置文件
[root@localhost conf]#vim nginx.conf //编辑配置文件
http {
server {
listen 80;
server_name www.wang.com;
charset utf-8;
location / {
root html;
index index.html index.php;
}
##添加 stub_status 配置
location / status { #访问位置为/status
stub_status on; #打开状态统计功能
access_log off; #关闭此位置的日志记录
}
}
}
3.重启服务,访问测试
[root@localhost 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 conf]#systemctl restart nginx
浏览器访问 http://192.168.85.50/status Active connections :表示当前的活动连接数; server accepts handled requests :表示已经处理的连接信息,三个数字依次表示已处理的连接数、成功的TCP握手次数、 已处理的请求数。
可 curl -Ls http://192.168.85.50/status 结合 awk与if 语句进行性能监控。
4 基于授权的访问控制
1.生成用户密码认证文件
[root@localhost conf]#yum install -y httpd-tools
[root@localhost conf]#htpasswd -c /usr/local/nginx/passwd.db nancy //文件名自拟。-c表示生成passwd.db文件,如果该文件已存在,则不需要加-c
New password: //密码自拟
Re-type new password:
Adding password for user nancy
[root@localhost conf]#chown nginx /usr/local/nginx/passwd.db //文件属主必须修改为nginx,否则会报错
[root@localhost conf]#chmod 400 /usr/local/nginx/passwd.db //文件权限必须设置为400,否则会报错
2.修改主配置文件相对应目录,添加认证配置项
[root@localhost conf]#vim /usr/local/nginx/conf/nginx.conf
......
server{
location / {
root html;
index index.html index.htm;
##添加认证配置##
auth_basic "secret"; #设置密码提示框文字信息
auth_basic_user_file /usr/local/nginx/userlist.txt; #指定密码验证文件
}
}
3.重启服务,访问测试
[root@localhost conf]#nginx -t //检查配置文件的配置项是否有误
[root@localhost conf]#systemctl restart nginx //重启服务
浏览器访问http://192.168.85.50
5 基于客户端的访问控制
访问控制规则如下:
- deny IP/IP段:拒绝某个IP或IP段的客户端访问。(黑名单)
- allow IP/IP段:允许某个IP或IP段的客户端访问。(白名单)
- 规则从上往下执行,匹配到则停止,不再往下匹配。
[root@localhost conf]#vim /usr/local/nginx/conf/nginx.conf
server {
location / {
root html;
index index.html index.htm;
##添加控制规则
allow 192.168.85.0/24; #允许192.168.85.0网段的客户端ip访问
deny all; #拒绝其他ip客户端访问
}
}
[root@localhost conf]#nginx -t
[root@localhost conf]#systemctl restart nginx
使用192.168.85.40 客户端,访问http://192.168.85.50
6 基于域名的 Nginx 虚拟主机
1.为虚拟主机提供域名解析
[root@localhost conf]#echo "192.168.85.50 www.wang.com www.benet.com" >> /etc/hosts
2.为虚拟主机准备网页文档
[root@localhost conf]#mkdir -p /var/www/html/benet
[root@localhost conf]#mkdir -p /var/www/html/kgc
[root@localhost conf]#echo "<h1>www.wang.com</h1>" > /var/www/html/kgc/index.html
[root@localhost conf]#echo "<h1>www.benet.com</h1>" > /var/www/html/benet/index.html
3.修改Nginx的配置文件
vim /usr/local/nginx/conf/nginx.conf
http {
server {
listen 80;
server_name www.wang.com; #设置域名www.wang.com
charset utf-8;
access_log logs/www.wang.access.log; #设置日志名
location / {
root /var/www/html/kgc; #设置www.wang.com 的工作目录
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
server {
listen 80;
server_name www.benet.com; #设置域名www.benet.com
charset utf-8;
access_log logs/www.benet.access.log;
location / {
root /var/www/html/benet;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
}
4.重启服务,访问测试
[root@localhost conf]#systemctl restart nginx
浏览器访问
7 基于IP 的 Nginx 虚拟主机
[root@localhost conf]#ifconfig ens33:0 192.168.85.52 netmask 255.255.255.0
vim /usr/local/nginx/conf/nginx.conf
http {
server {
listen 192.168.85.50:80; #设置监听地址192.168.85.50
server_name www.kgc.com;
charset utf-8;
access_log logs/www.wang.access.log;
location / {
root /var/www/html/kgc;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
server {
listen 192.168.85.52:80; #设置监听地址192.168.85.52
server_name www.benet.com;
charset utf-8;
access_log logs/www.benet.access.log;
location / {
root /var/www/html/benet;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
}
[root@localhost conf]#systemctl restart nginx
浏览器访问
8 基于端口的 Nginx 虚拟主机
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
server {
listen 192.168.85.50:8080; #设置监听 8080 端口
server_name www.wang.com;
charset utf-8;
access_log logs/www.wang.access.log;
location / {
root /var/www/html/kgc;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
server {
listen 192.168.85.50:6666; #设置监听 8888 端口
server_name www.benet.com;
charset utf-8;
access_log logs/www.benet.access.log;
location / {
root /var/www/html/benet;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
}
[root@localhost conf]#systemctl restart nginx
浏览器访问
##Nginx 和 Apache 的差异: 轻量级,nginx比apache 占用更少的内存及资源; 静态处理,Nginx 静态处理性能比 Apache 高 ; Nginx可以实现无缓存的反向代理加速,提高网站运行速度; Nginx的性能和可伸缩性不依赖于硬件,Apache依赖于硬件; Nginx支持热部署,启动速度迅速,可以在不间断服务的情况下,对软件版本或者配置进行升级; nginx是异步进程,多个连接可以对应一个进程 ;apache是同步多进程,一个连接对应一个进程; Nginx高度模块化,编写模块相对简单,且组件比Apache少 高并发下nginx 能保持低资源低消耗高性能; Nginx 配置简洁, Apache配置复杂;
总结
nginx web网站服务应用
轻量级 系统资源消耗较少
高性能 抗并发能力较强,一般可以处理2万~3万并发连接数,理论上最多可支持5万并发请求
稳定性高 宕机概率小
应用场景
-
http web网站服务器
-
可以做虚拟主机 (基于域名 IP 端口)
-
可以做方向代理 负载均衡
-
web前端缓存
nginx_和apache区别
- nginx更轻量比apache 占用更少的内存资源
- nginx抗并发能力更强
- nginx是模块化设计,配置相对简单,组件也比较apache少
- nginx处理请求是异步非阻塞,epache是阻塞性的
- nginx可以多个连接对应一个进程,apache是一个连接对应一个进程
- nginx是基于事件的web服务器,apache是基于流程的web服务器
root 和 alias
location /status{
root html; 根路径目录下的子目录 html /atatus/xxxx
alias html; /status/xxx 指定的目录实际路径为 html/xxx
}