Nginx服务基础、访问控制、虚拟主机


前言

Nginx是一款轻量级的Web服务器,由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引Rambler使用。 其特点是占有内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网站服务器中表现较好。


一、关于Nginx

  • 一款高性能、轻量级web服务软件
  • 稳定性高
  • 系统资源消耗低
  • 对HTTP并发连接的处理能力高
  • 单台物理服务器可支持30000~50000个并发请求
  • NG并发连接能力受2个因素的影响
    1.CPU个数
    2.本地物理服务器系统的最大文件打开数

二、Nginx编译安装

1. 配置环境

  • 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
  • 直接把Nginx包拖进去

2. 安装依赖包

yum -y install pcre-devel zlib-devel gcc gcc-c++ make
  • 创建运行用户、组
useradd -M -s /sbin/nologin nginx

3. 编译安装Nginx

tar zxvf nginx-1.12.2.tar.gz -C /opt

cd /opt/nginx-1.12.2/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module
#指定nginx安装路径
#指定用户名
#指定组名
#启用 httpd_stub_status_module 模块以支持状态统计


make -j 4 && make install

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
#优化路径,让系统识别nginx的操作命令

4. 检查、启动、重启、停止 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号>

  1. 添加Nginx系统服务

方法1:

vim /etc/init.d/nginx
#!/bin/bash
# chkconfig: - 99 20    						#chkcofig - “-” 表示不启用开机启动管理 (同时 若不加“#”, chkconfig add nginx 会加载不到配置)
# description: Nginx Service Control Script     #启动信息
COM="/usr/local/nginx/sbin/nginx"				#命令程序文件位置(nginx)
PID="/usr/local/nginx/logs/nginx.pid"			#pid文件
case "$1" in   									#$1指的是nginx的stop和start
start)
   $COM
   ;;
stop)
   kill -s QUIT $(cat $PID)
   ;;
restart)
   $0 stop    				#用$0执行stop
   $0 start   				#用$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   		#添加为系统服务
service nginx start		 	 	#开启服务
#可在/etc/rc.d/init.d目录下查看到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

方法2:使用systemctl管理

vim /usr/lib/systemd/system/nginx.service

[Unit]
Description=nginx		 	#描述
After=network.target		#描述服务类别
[Service]
Type=forking									#后台运行类型
PIDFile =/usr/local/nginx/logs/nginx.pid		#PID文件位置
ExecStart=/usr/local/nginx/sbin/nginx			#启动服务
ExecReload=/bin/kill -s HUP $MAINPID			#根据PID重载配置
ExecStop=/bin/kill -s QUIT $MAINPID				#根据PID终止进程
PrivateTmp=true						#开启
[Install]
WantedBy=multi-user.target			#启动级别

chmod 754 /lib/systemd/system/nginx.service		#设置754权限是一种安全优化
systemctl start nginx.service
systemctl enable nginx.service

vim /lib/systemd/system/nginx.service

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

三、Nginx配置文件

在 Nginx 服务器的主配置文件 /usr/local/nginx/conf/nginx.conf 中,包括全局配置、I/O 事件配置和 HTTP 配置这三大块内容,配置语句的格式为 “关键字 值 ;”(末尾以分号表示结束),以“#”开始的部分表示注释

cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak
#重中之重,先备份

1.全局配置

  • 由各种配置语句组成,不使用特定的界定标记。全局配置部分包括 Nginx 服务的运行用户、工作进程数、错误日志、PID存放位置等基本设置
#user  nobody;                              #运行用户
worker_processes  1;						#工作进程数量
#error_log  logs/error.log;					#错误日志存放位置
#error_log  logs/error.log  notice;			
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;                 #PID文件的位置

2.I/O 事件配置

  • 使用 "events { } " 界定标记,用来指定 Nginx 进程的 I/O 相应模型,每个进程的连接数等设置(默认为1024)
events {
    worker_connections  1024;
}
  • linux 系统对文件打开的数量有最大的限制,通常设置为1024,这个数值很容易会达到,从而造成系统程序或者系统的瓶颈;所以需要修改文件打开最大数
root@c7-3 /usr/local/nginx/conf]#ulimit -a               #查看当前进程可以打开的最大文件数
pending signals                 (-i) 14984
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
......
[root@c7-3 /usr/local/nginx/conf]#ulimit -n              #查看当前进程可以打开文件的最大数量
1024
[root@c7-3 /usr/local/nginx/conf]#cat /proc/sys/fs/file-max      #查看当前系统的最大文件数
378925

#通过命令ulimit -n 65535可以进行更改
[root@nginx /usr/local/nginx/conf]#ulimit -n 65535
[root@nginx /usr/local/nginx/conf]#ulimit -n
65535

3.HTTP 配置

  • 使用 "http { } "界定标记,包括访问日志、HTTP 端口、网页目录、默认字符集、连接保持,以及虚拟Web主机、PHP解析等一系列设置,其中大部分配置语句都包含在子界定标记 "server { } " 内
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" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;					#访问日志位置

    sendfile        on;									#支持文件发送(下载)
    #tcp_nopush     on;    								#此选项允许或禁止使用socket的TCP_CORK的选项( 发送数据包前先缓存数据),此选项仅在使用sendfile的时候使用

    #keepalive_timeout  0;								#连接保持超时时间,单位为秒
    keepalive_timeout  65;

    #gzip  on;											#压缩模块,on 表示开启

    server {											#web服务相关配置
        listen       80;								#默认监听的端口
        server_name  localhost;							#站点域名   需改为www.dsj.com


        #charset koi8-r;								#字符集支持(修改为中文UTF-8)

        #access_log  logs/host.access.log  main;		#此web服务的主访问日志

        location / {									#根目录配置
            root   html;								#网站根目录的位置(/usr/local/nginx/html)
            index  index.html index.htm;				#默认首页(索引页)
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;		#内部错误的反馈页面
        location = /50x.html {							#错误页面配置
            root   html;
        }

  • 配置本地映射
[root@nginx /usr/local/nginx/conf]#vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.3.101 www.dsj.com                      #这里格式必不能错,不然无法访问echo "192.168.3.101 www.dsj.com" >> /etc/hosts

[root@nginx /usr/local/nginx/conf]#curl www.dsj.com    #curl可以测试一台服务器是否可以到达一个网站
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

[root@nginx /usr/local/nginx/conf]#cd /usr/local/nginx/html/
[root@nginx /usr/local/nginx/html]#ls
50x.html  index.html
[root@nginx /usr/local/nginx/html]#mkdir test
[root@nginx /usr/local/nginx/html]#cd test/
[root@nginx /usr/local/nginx/html/test]#vim index.html 

hello world!
[root@nginx /usr/local/nginx/html]#systemctl stop nginx.service 
[root@nginx /usr/local/nginx/html]#systemctl start nginx.service

4.访问状态统计

  • Nginx内置了 HTTP_STUB_STATUS 状态统计模块,用来反馈当前得 Web 访问情况,配置编译参数时可添加
    --with-http_stup_status_dodule 来启用此模块支持。
  • 可使用命令 /usr/local/nginx/sbin/nginx -V 来查看已安装的 Nginx 是否包含 HTTP_STUB_STATUS 模块。
  • 要使用 Nginx 的状本统计功能,除了启用内建模块以外,还需要修改 nginx.conf 配置文件,指定访问位置并添加stub_status 配置代码。
[root@nginx /]#nginx -V
nginx version: nginx/1.12.2                 #版本
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
											#环境配置
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-  http_stub_status_module
  • 修改 nginx.conf 配置文件,指定访问位置并添加 stub_status 配置代码
vim /usr/local/nginx/conf/nginx.conf
......
 35     server {
 36         listen       80;
 37         server_name  www.gkd.com;
 38 
 39         #charset UTF-8;
 40 
 41         #access_log  logs/host.access.log  main;
 42 
 43         location / {
 44             root   html;
 45             index  index.html index.htm;
 46         }

#在46行下添加如下代码

    location /status {      #访问位置为/status
      stub_status on;       #打开状态统计功能
      access_log off;       #关闭此位置的日志记录
    }

#改完以后检查语句是否正确
nginx -t
  • 改完以后重启 nginx 服务,在浏览器中访问服务器 /status 网站位置,可以看到当前得状态统计信息
”Active connections“表示当前的活动连接数
”server accepts handled requests“表示已经处理的连接信息,三个数字依次表示:
已处理的连接数、成功的TCP握手次数、己处理的请求数

四、Nginx 访问控制

1.基于授权的访问控制步骤

1.1概述

  • Nginx 与 Apache 一样,可以实现基于用户授权的访问控制,当客户端想要访问相应的网站或目录时,要求用户输入用户名和密码才能正常访问。

  • Apache 网页认证实现可总结为以下几个步骤:
    ① 生成用户密码认证文件
    ② 修改主配置文件相对应目录,添加认证配置项
    ③ 重启服务,访问测试

1.2 步骤

  1. 使用 htpasswd 生成用户认证文件,如果没有该命令,可使用 yum 安装 http-tools 软件包
[root@nginx /opt]#yum install -y httpd-tools.x86_64 

#在/usr/local/nginx/目录下生成passwd.db文件,用户名为 test
[root@nginx /opt]#htpasswd -c /usr/local/nginx/passwd.db test
New password:                                 #输入二次密码
Re-type new password: 
Adding password for user test				  #生成用户和密码的密文
[root@nginx /opt]#cat /usr/local/nginx/passwd.db 
test:$apr1$sR3CEQF2$xv4yaAuGkOqm5D.BMJmYR.
  1. 修改密码文件的权限为400,将所有者改为 nignx ,设置 nginx 的运行用户有读取的权限
[root@nginx /opt]#chown nginx /usr/local/nginx/passwd.db 
[root@nginx /opt]#chmod 400 /usr/local/nginx/passwd.db 
[root@nginx /opt]#cd /usr/local/nginx/
[root@nginx /usr/local/nginx]#ll
总用量 8
......
-r-------- 1 nginx root   43 10月  08 0.28 passwd.db

  1. 修改主配置文件 nginx.conf ,添加相应认证配置项
[root@nginx /usr/local/nginx]#vim /usr/local/nginx/conf/nginx.conf
......
 #在43行下面添加配置选项
 43         location / {
 44         auth_basic "secret";             #在主页配置项中添加认证
 45         auth_basic_user_file /usr/local/nginx/passwd.db; 
 46             root   html;
 47             index  index.html index.htm;
 48         }


[root@nginx /usr/local/nginx]#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@nginx /usr/local/nginx]#systemctl stop nginx.service 
[root@nginx /usr/local/nginx]#systemctl start nginx.service 
  • 重启服务以后,用浏览器访问网址,检验控制效果

2. 基于客户端的访问控制

2.1 概述

  • 基于客户端的访问控制是通过客户端 IP 地址,决定是否允许对页面访问。
  • 规则如下:
    ① deny IP/IP段:拒绝某个 IP 或 IP 段的客户端访问
    ② allow IP/IP段:允许某个 IP 或 IP 段的客户端访问
    ③ 规则从上往下执行,如匹配则停止,不再往下匹配

2.2 步骤

[root@nginx /usr/local/nginx]#vim /usr/local/nginx/conf/nginx.conf

server {
......
        location / {
        auth_basic "secret";
        auth_basic_user_file /usr/local/nginx/passwd.db;
            root   html;
            index  index.html index.htm;
        deny 192.168.8.133;            #这里添加规则,不允许133的IP访问
        allow all;					   #允许其它IP客户端访问,类似于黑白名单
        }

[root@nginx /usr/local/nginx]#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@nginx /usr/local/nginx]#systemctl stop nginx.service 
[root@nginx /usr/local/nginx]#systemctl start nginx.service 
  • 重启服务之后,用192.168.8.133这个用户访问就会被拒绝,其他的IP正常访问,如下图
    在这里插入图片描述

五、虚拟主机

1. 基于域名的 Nginx 虚拟主机

  • 为虚拟主机提供域名解析
echo "192.168.8.135 www.accp.com www.benet.com" >> /etc/hosts
  • 为虚拟主机准备网页文档
[root@localhost ~]#mkdir -p /var/www/html/accp
[root@localhost ~]#mkdir -p /var/www/html/benet
[root@localhost ~]#echo "<h1> www.accp.com</h1>" >/var/www/html/accp/index.html
[root@localhost ~]#echo "<h1> www.benet.com</h1>" >/var/www/html/benet/index.html
[root@localhost ~]#cat /var/www/html/accp/index.html 
<h1> www.accp.com</h1>
[root@localhost ~]#cat /var/www/html/benet/index.html 
<h1> www.benet.com</h1>
  • 修改 Nginx 的配置文件
    server {
        listen       80;
        server_name  www.accp.com;
        charset utf-8;
        access_log  logs/accp.access.log;
        location / {
            root   /var/www/html/accp;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}

    server {
        listen       80;
        server_name  www.benet.com;
        charset utf-8;
        access_log  logs/benet.access.log;
        location / {
            root   /var/www/html/benet;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}
[root@localhost ~]#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 ~]#systemctl restart nginx.service  	  #重启服务

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

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

  • 修改 Nginx 的配置文件
    server {
        listen       192.168.8.135:80;
        server_name  www.accp.com;
        charset utf-8;
        access_log  logs/accp.access.log;
        location / {
            root   /var/www/html/accp;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}

    server {
        listen       192.168.8.135:8080;
        server_name  www.accp.com;
        charset utf-8;
        access_log  logs/accp8080.access.log;
        location / {
            root   /var/www/html/accp8080;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}
  • 检测、重启服务
[root@localhost ~]#cd /var/www/html/
[root@localhost /var/www/html]#ls
accp  benet
[root@localhost /var/www/html]#mkdir accp8080
[root@localhost /var/www/html]#cd accp8080/
[root@localhost /var/www/html/accp8080]#vim index.html
[root@localhost /var/www/html/accp8080]#cat index.html 
<h1> htis is accp8080 </h1>
[root@localhost /var/www/html/accp8080]#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 /var/www/html/accp8080]#systemctl restart nginx.service 
  • 浏览器验证
    在这里插入图片描述

在这里插入图片描述

  • 查看日志
[root@localhost /var/www/html/accp8080]#cd /usr/local/nginx/
[root@localhost /usr/local/nginx]#ls
client_body_temp  conf  fastcgi_temp  html  logs  proxy_temp  sbin  scgi_temp  uwsgi_temp
[root@localhost /usr/local/nginx]#cd logs/
[root@localhost /usr/local/nginx/logs]#ls
access.log  accp8080.access.log  accp.access.log  benet.access.log  error.log  nginx.pid

3.基于IP的 Nginx 虚拟主机

  • 添加192.168.8.188 的映射
[root@localhost /usr/local/nginx/conf]#vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.8.135 www.accp.com
192.168.8.188 www.benet.com

  • 创建网站根目录,创建192.168.8.188的网站首页文件
[root@localhost /usr/local/nginx/logs]#cd /var/www/html/
[root@localhost /var/www/html]#mkdir benet188
[root@localhost /var/www/html]#ls
accp  accp8080  benet  benet188
[root@localhost /var/www/html]#cd benet188/
[root@localhost /var/www/html/benet188]#vim index.html 
<h1> this is benet188 web </h1>

  • 创建临时虚拟网卡
[root@localhost /usr/local/nginx/conf]#ifconfig ens33:0 192.168.8.188 netmask 255.255.255.0
[root@localhost /usr/local/nginx/conf]#ifconfig 
......
ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.8.188  netmask 255.255.255.0  broadcast 192.168.8.255
        ether 00:0c:29:57:05:a8  txqueuelen 1000  (Ethernet)
  • 修改 Nginx 的配置文件
[root@localhost /var/www/html/benet188]#cd /usr/local/nginx/conf/
[root@localhost /usr/local/nginx/conf]#vim nginx.conf
    server {
        listen       192.168.8.135:80;
        server_name  www.accp.com;
        charset utf-8;
        access_log  logs/accp.access.log;
        location / {
            root   /var/www/html/accp;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}

    server {
        listen       192.168.8.188:80;
        server_name  www.benet.com;
        charset utf-8;
        access_log  logs/benet188.access.log;
        location / {
            root   /var/www/html/benet188;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}
  • 检测、重启服务
[root@localhost /usr/local/nginx/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 /usr/local/nginx/conf]#systemctl restart nginx.service
  • 浏览器验证
    在这里插入图片描述
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值