高性能、轻量级web服务软件——Nginx


关于详细的Nginx-N ginx 从入门到实践

一. Nginx概述

Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。
性能是 Nginx最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发连接数,最重要的是,Nginx 是免费的,并可以商业化,配置使用也比较简单。

Nginx 的最重要的几个使用场景

  1. 静态资源服务,通过本地文件系统提供服务;
  2. 反向代理服务,延伸出包括缓存、负载均衡等;
  3. API 服务,OpenResty ;

Nginx 配置语法

Nginx 的主配置文件是/etc/nginx/nginx.conf,你可以使用 cat -n nginx.conf 来查看配置。

  • nginx.conf 结构图可以这样概括:
main        # 全局配置,对全局生效
├── events  # 配置影响 Nginx 服务器或与用户的网络连接
├── http    # 配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置
   ├── upstream # 配置后端服务器具体地址,负载均衡配置不可或缺的部分
   ├── server   # 配置虚拟主机的相关参数,一个 http 块中可以有多个 server 
   ├── server
      ├── location  # server 块可以包含多个 location 块,location 指令用于匹配 uri
      ├── location
      └── ...
   └── ...
└── ...
  • 一个 Nginx 配置文件的结构就像 nginx.conf 显示的那样,配置文件的语法规则:
  1. 配置文件由指令与指令块构成;
  2. 每条指令以 ; 分号结尾,指令与参数间以空格符号分隔;
  3. 指令块以 {} 大括号将多条指令组织在一起;
  4. include 语句允许组合多个配置文件以提升可维护性;
  5. 使用 # 符号添加注释,提高可读性;
  6. 使用 $ 符号使用变量;

Nginx 的典型配置

user  nginx;                        # 运行用户,默认即是nginx,可以不进行设置
worker_processes  1;                # Nginx 进程数,一般设置为和 CPU 核数一样
error_log  /var/log/nginx/error.log warn;   # Nginx 的错误日志存放目录
pid        /var/run/nginx.pid;      # Nginx 服务启动时的 pid 存放位置
 
events {
    use epoll;     # 使用epoll的I/O模型(如果你不知道Nginx该使用哪种轮询方法,会自动选择一个最适合你操作系统的)
    worker_connections 1024;   # 每个进程允许最大并发数
}
 
http {   # 配置使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置
    # 设置日志模式
    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  /var/log/nginx/access.log  main;   # Nginx访问日志存放位置
 
    sendfile            on;   # 开启高效传输模式
    tcp_nopush          on;   # 减少网络报文段的数量
    tcp_nodelay         on;
    keepalive_timeout   65;   # 保持连接的时间,也叫超时时间,单位秒
    types_hash_max_size 2048;
 
    include             /etc/nginx/mime.types;      # 文件扩展名与类型映射表
    default_type        application/octet-stream;   # 默认文件类型
 
    include /etc/nginx/conf.d/*.conf;   # 加载子配置项
    
    server {
    	listen       80;       # 配置监听的端口
    	server_name  localhost;    # 配置的域名
    	
    	location / {
    		root   /usr/share/nginx/html;  # 网站根目录
    		index  index.html index.htm;   # 默认首页文件
    		deny 172.168.22.11;   # 禁止访问的ip地址,可以为all
    		allow 172.168.33.44# 允许访问的ip地址,可以为all
    	}
    	
    	error_page 500 502 503 504 /50x.html;  # 默认50x对应的访问页面
    	error_page 400 404 error.html;   # 同上
    }
}

server 块可以包含多个 location 块,location 指令用于匹配 uri,语法:

location [ = | ~ | ~* | ^~] uri {
	...
}

指令后面:

  • = 精确匹配路径,用于不含正则表达式的 uri 前,如果匹配成功,不再进行后续的查找;

  • ^~ 用于不含正则表达式的 uri 前,表示如果该符号后面的字符是最佳匹配,采用该规则,不再进行后续的查找;

  • ~ 表示用该符号后面的正则去匹配路径,区分大小写;

  • ~* 表示用该符号后面的正则去匹配路径,不区分大小写。跟 ~ 优先级都比较低,如有多个location的正则能匹配的话,则使用正则表达式最长的那个;

如果 uri 包含正则表达式,则必须要有 ~ 或 ~* 标志。

二. Nginx的安装部署

2.1 关闭防火墙,将安装nginx所需软件包传到/opt目录下

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

nginx-1.12.0 .tar.gz

在这里插入图片描述

2.2 安装依赖包

  • nginx的配置及运行需要pcre、zlib等软件包的支持,因此需要安装这些安装的开发包,以便提供相应的库和头文件。
yum -y install pcre-devel zlib-devel gcc gcc-c++ make

在这里插入图片描述

2.3 创建运行用户、组

  • (Nginx服务程序默认以nobody身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)
useradd -M -s / sbin/nologin nginx

在这里插入图片描述
2.4 编译安装Nginxcd

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

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
#让系统识别nginx的操作命令

在这里插入图片描述
在这里插入图片描述
2.5 检查、启动、重启、停止 nginx服务

nginx -t
#检查配置文件是否配角
#启动
nginx
#停止

cat /usr/local/nginx/logs/nginx.pid
#先查看nginx的PID号

kill -3 <PID号>
kill -s QUIT<PID号>
killall -3 nginx
killall -s QUIT nginx
#重载

kill -1<PID号>
kill -s HUP <PID号>
killall -1 nginx
killall -s HUP nginx
#日志分隔,重新打开日志文件

kill -USR1 <PID号>
#平滑升级
kill -USR2 <PID号>

在这里插入图片描述
在这里插入图片描述
新版本升级:

tar -zxvf nginx-1.xx.xx.tar.gzcd nginx-1.xx.xx

./ configure \
--prefix=/usr/ local/nginx l--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 nginx ,再/usr/local/nginx/sbin/nginx

2.6 添加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


chmod +x /etc/init.d/nginx
chkconfig --add nginx
#添加为系统服务
systemctl stop nginx
systemctl start nginx

方法二

vim /lib/systemd/system/nginx.service

[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target

chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service
[Unit]:服务的说明
Description:描述服务
After:依赖,当依赖的服务启动之后再启动自定义的服务

[Service]服务运行参数的设置
Type=forking是后台运行的形式,使用此启动类型应同时指定PIDFile=,以便systemd能够跟踪服务的主进程。
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:启动、重启、停止命令全部要求使用绝对路径

[Install]服务安装的相关设置,可设置为多用户

在这里插入图片描述
在这里插入图片描述

三. 认识Nginx服务的主配置文件nginx.conf

vim /usr/locai/nginx/conf/nginx.conf

3.1 全局配置

#user nobody;
#运行用户,若编译时未指定则默认为nobody
worker_processes 1;
#工作进程数量,可配置成服务器内核数*2,如果网站访问量不大,一般设为1就够用 
#error_1og 1ogs/error.log;
#错误日志文件的位置
#pid logs/nginx.pid;
#PID文件的位置

在这里插入图片描述

3.2 I/O 事件配置

events {
    use epoll;
    #使用epoll模型,2.6及以上版本的系统内核,建议使用epol1模型以提高性能
    worker_connections 4096;
    #每个进程处理4096 个连接
}
#如提高每个进程的连接数还需执行“ulimit-n65535”命令临时修改本地每个进程可以同时打开的最大文件数。
#在Linux平台上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)
#可使用ulimit-a命令查看系统允许当前用户进程打开的文件数限制。

在这里插入图片描述

3.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"
   #                '"Shttp_user_agent" "$http_x_forwarded_for"' ;
   ##访问日志位置
   #access_log logs/access.log  main;
   ##支持文件发送(下载)
   sendfile   on;
   ##此选项允许或禁止使用socket的TCP_CORK的选项(发送数据包前先缓存数据),此选项仅在使用sendfile的时候使用
   #tcp_nopush  on;
   ##连接保持超时时间,单位是秒
   #keepalive_timeout 0;
   keepalive_timeout 65;
   ##gzip模块设置,设置是否开启gzip压缩输出
   #gzip on;

   ##Web服务的监听配置
   server {
       ##监听地址及端口
       listen 80;
       ##站点域名,可以有多个,用空格隔开
       server name Www.kgc.com;
       ##网页的默认字符集
       charset utf-8;
       ##根目录配置
       location / {
         ##网站根目录的位置/usr/local/nginx/html
         root html ;
         ##默认首页文件名
         index index.html index.php;
       }
       ##内部错误的反馈页面
       error_page 500 502 503 504 /50x.html;
       ##错误页面配置
       location = /50x.html {
          root html;
       }
   }
}


3.4 日志格式设定

$remote_addr$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地址和原来客户端的请求的服务器地
址。

location常见配置指令,root、 alias、 proxy_pass
root (根路径配置) :请求www.kgc.com/test/1.jpg,会返回文件/usr/1ocal/nginx/html/test/1.jpg
alias (别名配置) :请求www.kgc.com/test/1.jpg,会返回文件/usr/local/nginx/html/1.jpg

proxy_pass (反向代理配置) :
proxy_pass http://127.0.0.1:8080/; 会转发请求到http://127.0.0.1:8080/1.jpg
proxy_pass http://127.0.0.1:8080; 会转发请求到http://127.0.0.1:8080/test/1.jpg

四. 访问状态统计配置

4.1 先使用命令/usr/local/nginx/sbin/nginx -V查看已安装的Nginx 是否包含HTTP_STUB_STATUS模块
在这里插入图片描述
4.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.com; 
     charset utf-8;
     location / {
         root html ;
         index index.html index.php;
     }
     ##添加stub_status 配置##
     location /status {     #访问位置为/status
     stub status on;        #打开状态统计功能
     access_log off;        #关闭此位置的日志记录
     }
  }
}

在这里插入图片描述

在这里插入图片描述
4.3 重启服务,访问测试

systemctl restart nginx

浏览器访问 http://192.168.80.10/status
Active connections :表示当前的活动连接数;
server accepts handled requests :表示已经处理的连接信息,三个数字依次表示已处理的连接数、成功的TCP握手次数、已处理的请求数。

可curl http://192.168.80.10/status结合awk与if 语句进行性能监控。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五.基于授权的访问控制

5.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 /nginx/passwd.db

在这里插入图片描述
在这里插入图片描述
5.2 修改主配置文件相对应目录,添加认证配置项

vim /usr/local/nginx/conf/nginx.conf
.....
   server {
      location / {
       .....
      ##添加认证配置##
    auth basic "secret";     #设置密码提示框文字信息
    auth_basic_user_file /usr/local/nginx/passwd.db;
    }
}

在这里插入图片描述

5.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 192.168. 80.200;       #拒绝访问的客户端IP
    allow all;                 #允许其它IP客户端访问
    }
}

systemctl restart nginx

在这里插入图片描述
在这里插入图片描述

七. 基于域名的nginx虚拟主机

7.1 为虚拟主机提供域名解析

echo  "192.168.80.10 www.kgc.com www.benet.com" >> /etc/hosts

在这里插入图片描述
7.2 为虚拟机准备网页文档

mkdir -p /var/www/html/benet
mkdir -p /var/www/html/kgc
echo "<h1>www.kgc.com</h1>" > /var/www/html/kgc/index.html
echo "<h1>www.benet.com</h1>" > /var/www/html/benet/index.html

在这里插入图片描述
7.3 修改nginx的配置文件

vim /usr/local/nginx/conf/nginx.conf
......
http {
......
    server {
          listen 80;
          server_name www.kgc.com;
          #设置域名www.kgc.com
          charset utf-8 ;
          access_log logs/www.kgc.access.log;
          #设置日志名
          location / {
                 root /var/www/html/kgc;
                 #设置www.kgc.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;
           }
    }
}

7.4 重启服务,访问测试

nginx -t
systemctl restart nginx

浏览器访问 http://www.kgc.com
          http://www.benet.com

在这里插入图片描述
在这里插入图片描述

八. 基于IP的 Nginx 虚拟主机

iflconfig ens33:0 192.168.80.11 netmask 255.255.255.0

在这里插入图片描述

vim /usr/local/nginx/conf/nginx.conf
....
http {
.....
   server {
     listen 192.168.116.90:80;    #设置监听地址192.168.80.10
     server_name WWW.nj.com; .
     charset utf-8;
     access_log logs/www.nj.access.log;
     location / {
         root /var/www/html/nj;
         index index.html index.php;
         }
     error_page 500 502 503 504 /50x.html ;
     location = 50x.html {
         root html ;
        }
}

server
listen 192.168.116.91:80;
server_name www.benet.com;     #设置域名www.benet.com
charset utf-8;
access_log logs/www.benet.access.1og;
location / {
   root /var/www/html/benet; 
   index index.html index.php;
   }
   error_page 500 502 503 504 /50x. html;
   location = 50x.html{
     root html;
   }
 }
}

在这里插入图片描述
重启服务,访问测试

nginx -t
systemctl restart nginx

浏览器访问
http://192.168.253.11
http://192.168.253.12

在这里插入图片描述
在这里插入图片描述

九. 基于端口的Nginx虚拟主机

vim /usr/local/nginx/conf/nginx.conf
....
http {
.....
    server {
    listen 192.168.116.90:8080;     #设置监听8080端口.
    server_name www.nj.com;
    charset utf-8;
    access_log logs/www.nj.acess.1og;
    location / {
       root /var/www/html/nj;
       index index.html index.php; 
       }
    error_page 500 502 503 504 /50x. html;
    location = 50x. html{
       root html;
      }
}

server
listen 192.168.116.91:8888;
server_name www.benet.com;     #设置域名www.benet.com
charset utf-8;
access_log logs/www.benet.access.1og;
location / {
   root /var/www/html/benet; 
   index index.html index.php;
   }
   error_page 500 502 503 504 /50x. html;
   location = 50x.html{
     root html;
   }
 }
}

在这里插入图片描述
重启服务,访问测试

nginx -t
systemctl restart nginx

浏览器访问
http://192.168.253.11:8080
http://192.168.253.12:8888

在这里插入图片描述
在这里插入图片描述

扩展:

  1. tomcat 与 nginx,apache的区别是什么?
  2. 这三者都是web server,那他们各自有什么特点呢?
  3. 他们之间的区别是什么呢? nginx 和 tomcat在性能上面有何异同?
  4. tomcat用在java后台程序上,java后台程序难道不能用apache和nginx吗?

详细前往该网页查看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值