Nginx运行控制虚拟主机和访问控制

一、Nginx服务概述

一款高性能、轻量级Web服务软件

  • 稳定性高
  • 系统资源消耗低
  • 对HTTP并发连接的处理能力高
    单台物理服务器可支持30 000 ~ 50000个并发请求
  • 占用内存少,并发能力强

二、Nginx安装

1.解压跨平台组件包和源码包
将跨平台组件包移动到源码包/opt目录下
nginx-1.12.2.tar.gz

[root@server ~]# cd /opt
[root@server opt]# tar xzvf nginx-1.12.2.tar.gz

2.安装编译器和其他工具

[root@server opt]# yum -y install gcc \
gcc-c++ \
make \
pcre-devel \
expat-devel \
perl \
zlib-devel \
pcre

3.configure配置

[root@server opt]# cd nginx-1.12.2
[root@server nginx-1.12.2]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module

4.编译安装

[root@server ~]# make && make install

为了使Nginx服务器的运行更加方便,可以为主程序nginx创建链接文件,以便管理员直接执行“nginx”命令就可以调用Nginx的主程序

[root@server ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

6.创建运行用户,组

[root@server ~]# useradd -M -s /sbin/nologin nginx

7.开启nginx,关闭防火墙

[root@localhost ~]# systemctl stop firewalld.service 
[root@localhost ~]# setenforce 0
[root@localhost ~]# nginx
[root@localhost ~]# netstat -ntap |grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      5396/nginx: master  
tcp        0      0 192.168.197.192:56680   192.168.100.3:445       ESTABLISHED  

三、Nginx的运行控制

检查配置文件

[root@localhost ~]# nginx -t		//配置文件语法检查

启动,停止Nginx

[root@localhost ~]# nginx		//启动服务
[root@localhost ~]# killall -1 nginx	//安全重启	killall -s HUP nginx
[root@localhost ~]# killall -3 nginx	//停止服务	killall -s QUIT nginx

使用Nginx服务脚本
为了使Nginx服务的启动,停止,重载等操作更加方便,可以编写Nginx服务脚本,并使用chkconfig和service工具来进行管理,也更加符合RHEL系统的管理习惯。

[root@localhost ~]# vi /etc/init.d/nginx
#!/bin/bash
# chkconfig: 35 99 20
# description: Nginx Service Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
   start)
     $PROG
     ;;
   stop)
     kill -s QUIT $(cat $PIDF)
     ;;
   restart)
     $0 stop
     $0 start
     ;;
   reload)
     kill -s HUP $(cat $PIDF)
     ;;
   *)
     echo "Usage: $0 {start|stop|restart|relad}"
     exit 1
esac
exit 0

[root@localhost ~]# chmod +x /etc/init.d/nginx
[root@localhost ~]# chkconfig --add nginx
[root@localhost ~]# chkconfig --level 35 nginx on

这样一来,就可以通过Nginx脚本来启动,停止,重启,重载Nginx服务器了,方法是在执行时添加相应的start,stop,restart,reload参数。

四、配置文件nginx.conf

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

1.全局配置

由各种配置语句组成,不使用特定的界定标记,全局配置部分包括Nginx服务的运行用户,工作进程数,错误日志,PID存放位置等基本设置。

[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
#user  nobody;			//运行用户
worker_processes  1;		//工作进程数
#error_log  logs/error.log;	//错误日志文件的位置
#pid        logs/nginx.pid;		//PID文件的位置

上述配置中,worker_processes表示工作进程数。若服务器有多块CPU或者使用多核处理器,可以参考CPU核心总数来指定工作进程数,如设为8;如果网站访问量需求不大,一般设为1就够用了。其他三项均已有注释,表示采用默认设置,例如,Nginx的运行用户实际是编译时指定的nginx,若编译时未指定则默认为nobody。

2.I/O事件配置

使用“events{ }” 界定标记,用来指定Nginx进程的I/O响应模型,每个进程的连接数等设置。对于2.6及以上版本的内核,建议使用epoll模型以提高性能;每个进程的连接数应根据实际需要来定,一般在10000以下(默认为1024)

[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
events {
    
    
    use epoll;					//使用epoll模型
    worker_connections  4096;		//每进程处理4096个连接
}
[root@localhost ~]# ulimit -n 65500 >> /etc/rc.local
[root@localhost ~]# ulimit -n

若工作进程数为8,每个进程处理4096个连接,则允许Nginx正常提供服务的连接数已超过3万个,(4096✖8=32768),当然具体还要看服务器硬件,网络带宽等物理条件的性能表现。

3.HTTP配置

使用“http { }” 界定标记,包括访问日志,HTTP端口,网页目录,默认字符集,链接保持,以及后面要讲到的Web主机,PHP解析等一系列设置,其中大部分配置语句都包含在子界定标记“server { }”内。

[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
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;
    #keepalive_timeout  0;
    keepalive_timeout  65;				//连接保持超时
    #gzip  on;
server {
    
    							//Web服务的监听配置
        listen       80;					//监听地址及端口
        server_name  localhost;			//网站名称(FQDN)
        charset utf-8;					//网页的默认字符集
        access_log  logs/host.access.log  main;
        location / {
    
    					//根目录配置
            root   html;					//网站根目录的位置
            index  index.html index.htm;	//默认首页(索引页)
        }
error_page   500 502 503 504  /50x.html;		//内部错误的反馈页面
        location = /50x.html {
    
    					//错误页面配置
            root   html;
        }
}
}

上述配置中,listen语句允许同时限定IP地址,采用“IP地址:端口”形式;root语句用来设置特定访问位置(如“location /" 表示根目录)的网页文档路径,默认为Nginx安装目录下的html/子目录,根据需要可改为/var/www/html等其他路径。

4.访问状态统计

ginx内置了HTTP_STUB_STATUS状态统计模块,用来反馈当前的Web访问情况,配置编译参数时可添加–with-http_stub_status_module来启用此模块支持,可使用命令/usr/local/nginx/sbin/nginx -V 来查看以安装的Nginx是否包含HTTP_STUB_STATUS模块。

要使用Nginx的状态统计功能,除了启用内建模块以外,还需要修改nginx.conf配置文件,指定访问位置并添加stub_status配置代码。

[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
http {
    
    
 server {
    
    
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
    
    
            root   html;
            index  index.html index.htm;
        }
location ~ /status {
    
    			//访问位置为/status
         stub_status on;		//打开状态统计功能
         access_log off;		//关闭此位置的日志记录
}
}

新的配置生效后,在浏览器中访问Nginx服务器的/status网络位置,可以看到当前的状态统计信息
active connections //活跃的连接数量
server accepts handled requests //总共处理了x个连接,成功握手y次,总共处理了z个请求
reading //读取客户端的连接数
writing //响应数据到客户端的数量
waiting //已处理的请求数

五、Nginx访问控制

  • Nginx与Apache一样,可以实现基于用户授权的访问控制,当客户端想要访问相应的网站或者目录时,要求用户输入用户名和密码才能正常访问,配置步骤与Apache基本一致。
  • Apache网页认证实现步骤可概括为:
    1.生成用户密码认证文件
    2.修改主配置文件相应目录,添加认证配置项
    3.重启服务,访问测试

基于授权的访问控制步骤

Nginx实现授权访问控制的步骤如下:
1.使用htpasswd生成用户认证文件,如果没有该命令,可使用yum安装httpd-tools软件包,用法与Apache认证时方式相同,如:htpasswd -c /usr/local/nginx/passwd.db test。

[root@server ~]# yum -y install httpd-tools
[root@server ~]# htpasswd -c /usr/local/nginx/passwd.db test
New password:			//输入密码
Re-type new password:		//输入密码
Adding password for user test
[root@server ~]# cat /usr/local/nginx/passwd.db
test:$apr1$AF325xkf$bo4A4LFFGhAPDfPSaQu6b1

在/usr/local/nginx/目录下生成了passwd.db文件,用户名是test,密码输入2次。在passwd.db中生成用户和密码的密文

2.修改密码文件的权限为400,将所有者改为nginx,设置nginx的运行用户能够读取

[root@server ~]# chmod 400 /usr/local/nginx/passwd.db
[root@server ~]# chown nginx /usr/local/nginx/passwd.db

3.修改主配置文件nginx.conf,添加相应认证配置项。

[root@server ~]# vi /etc/local/nginx/conf/nginx.conf
server {
    
    
locaion / {
    
    
auth_basic "secret";
auth_basic_user_file /usr/local/nginx/passwd.db;
}
}

4.检测语法,重启服务

[root@localhost ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: [warn] 4096 worker_connections exceed open file resource limit: 1024
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@server ~]# ulimit -n 65500
[root@server ~]# ulimit -n 65500 >> /etc/rc.local
[root@server ~]# systemctl restart nginx

5.用浏览器访问网址,检验控制效果。

基于客户端的访问控制

1.基于客户端的访问控制简介
基于客户端的访问控制是通过客户端IP地址,决定是否允许对页面访问。Nginx基于客户端的访问控制要比Apache简单,规则如下:
deny IP/IP段:拒绝某个IP或IP段的客户端访问。
allow IP/IP段:允许某个IP或IP段的客户端访问。
规则从上往下执行,如匹配则停止,不再往下匹配。
2.基于客户端的访问的控制步骤
Nginx实现客户端访问控制的步骤如下:
修改主配置文件nginx.conf,添加相应配置项

[root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf
server {
    
    
location / {
    
    
deny 192.168.10.1;			//客户端IP
allow all;
}
}

Deny 192.168.10.1 表示这个IP地址访问会被拒绝,其他IP客户端正常访问。
重启服务器访问网址,页面已经访问不到(出现403错误)

六、Nginx虚拟主机

  • 利用虚拟主机,不用为每个要运行的网站提供一台单独的Nginx服务器或单独运行一组Nginx进程,虚拟主机提供了在同一台服务器,同一组Nginx进程上运行多个网站的功能。跟Apache一样,Nginx也可以配置多种类型的虚拟主机,分别是基于IP的虚拟主机,基于域名的虚拟主机,基于端口的虚拟主机。
  • 使用Nginx搭建虚拟主机服务器时,每个虚拟Web站点拥有独立的:“server { }”配置段,各自监听的IP地址,端口号可以单独指定,当然网络名称也是不同的。

1.基于域名的虚拟主机

1.准备各个网站的目录和测试首页

[root@localhost ~]# mkdir -p /var/www/html/aa.com/
[root@localhost ~]# mkdir -p /var/www/html/bb.com/
[root@localhost ~]# echo "this is aa" >>
/var/www/html/aa/index.html
[root@localhost ~]# echo "this is bb" >>
/var/www/html/bb/index.html 
[root@localhost ~]# yum -y install bind
[root@localhost ~]# vim  /etc/named.conf
[root@localhost ~]# vim /etc/named.rfc1912.zones
[root@localhost ~]# cp -p /var/named/named.localhost /var/named/erbao.com.zone
[root@localhost ~]# vim /var/named/erbao.com.zone
[root@localhost ~]# cp -p /var/named/erbao.com.zone /var/named/sanbao.com.zone
[root@localhost ~]# systemctl start named

2.修改配置文件,把配置文件中的server { } 代码段全部去掉,加入2个新的server { }段,对应两个域名

[root@server ~]# vi /usr/local/nginx/conf/nginx.conf
server {
    
    
        listen       80;
        server_name  www.aa.com;

         charset utf-8;

         access_log  logs/host.access.log  main;

        location / {
    
    
            root   /var/www/html/aa;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
    
    
            root   html;
        }
    }
server {
    
    
        listen       80;
        server_name  www.bb.com;

         charset utf-8;

         access_log  logs/host.access.log  main;

        location / {
    
    
            root   /var/www/html/bb;                                                              index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
    
    
            root   html;
        }
    }


[root@server ~]# [root@server ~]# 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

3.分别访问2个域名,查看是否访问到不同的页面,测试是否成功。

2.基于IP的虚拟地址

1.一台主机如果有多个IP地址,可以设置每一个IP对应一个站点。主机安装多个网卡可以有多个IP,这里采用虚拟IP的方式使主机有多个IP

[root@server ~]# ip addr
inet 192.168.10.40/24 brd 192.168.10255 scope global ens33
目前主机有一个网卡,IP地址是192.168.10.40。在配置一个虚拟IP为192.168.10.50。
[root@server ~]# ifconfig ens37 192.168.10.50/24
inet 192.168.10.40/24 brd 192.168.10.255 scope global ens33
inet 192.168.10.50/24 brd 192.168.10.255 scope global ens37

2.以/var/www/htmltestcom和/var/www/html/btcom为两个站点的根目录,修改Nginx的配置文件,使基于IP的虚拟主机生效。这里省略了和基于域名虚拟主机的相同配置代码。

 [root@server ~]# vi nginx.conf
server {
    
    
listen 192.168.10.40:80;
server_name www.aa.com;
}
server {
    
    
listen 192.168.10.50:80;
server_name www.bb.com;
}

3.分别访问2个IP地址,查看是否访问到不同的页面,测试是否成功。

3.基于端口的虚拟主机

1.选择系统中不使用的端口,将多个端口映射到同一IP地址。

vi nginx.conf
server {
    
    
listen 192.168.10.40:80;			//监听80端口
server_name www.aa.com;
}
server {
    
    
listen 192.168.10.40:8080;		//监听8080端口
server_name www.bb.com;
}

2.检测端口是否运行正常。
service nginx stop
service nginx start
netstat -anpt | grep nginx
3.分别访问2个端口地址,查看是否访问到不同的页面,测试配置是否成功。

猜你喜欢

转载自blog.csdn.net/weixin_49780168/article/details/110355109