目录
一、Nginx服务概述二、Nginx安装三、Nginx的运行控制四、配置文件nginx.conf1.全局配置2.I/O事件配置3.HTTP配置4.访问状态统计 五、Nginx访问控制基于授权的访问控制步骤基于客户端的访问控制 六、Nginx虚拟主机1.基于域名的虚拟主机2.基于IP的虚拟地址3.基于端口的虚拟主机一、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 80tcp 00 0.0.0.0:80 0.0.0.0:*LISTEN5396/nginx: master tcp 00 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 ScriptPROG="/usr/local/nginx/sbin/nginx"PIDF="/usr/local/nginx/logs/nginx.pid"case "$1" instart)$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 1esacexit 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.confevents {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.confhttp {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_nopushon;#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.confhttp {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 {//访问位置为/statusstub_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 testNew password://输入密码Re-type new password://输入密码Adding password for user test[root@server ~]# cat /usr/local/nginx/passwd.dbtest:$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.confserver {locaion / {auth_basic "secret";auth_basic_user_file /usr/local/nginx/passwd.db;}}
4.检测语法,重启服务
[root@localhost ~]# nginx -tnginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is oknginx: [warn] 4096 worker_connections exceed open file resource limit: 1024nginx: 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.confserver {location / {deny 192.168.10.1;//客户端IPallow 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//[root@localhost ~]# mkdir -p /var/www/html//[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/.zone[root@localhost ~]# vim /var/named/.zone[root@localhost ~]# cp -p /var/named/.zone /var/named/.zone[root@localhost ~]# systemctl start named
2.修改配置文件,把配置文件中的server { } 代码段全部去掉,加入2个新的server { }段,对应两个域名
[root@server ~]# vi /usr/local/nginx/conf/nginx.confserver {listen 80;server_name ;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 ;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 -tnginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is oknginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
3.分别访问2个域名,查看是否访问到不同的页面,测试是否成功。
2.基于IP的虚拟地址
1.一台主机如果有多个IP地址,可以设置每一个IP对应一个站点。主机安装多个网卡可以有多个IP,这里采用虚拟IP的方式使主机有多个IP
[root@server ~]# ip addrinet 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/24inet 192.168.10.40/24 brd 192.168.10.255 scope global ens33inet 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.confserver {listen 192.168.10.40:80;server_name ;}server {listen 192.168.10.50:80;server_name ;}
3.分别访问2个IP地址,查看是否访问到不同的页面,测试是否成功。
3.基于端口的虚拟主机
1.选择系统中不使用的端口,将多个端口映射到同一IP地址。
vi nginx.confserver {listen 192.168.10.40:80;//监听80端口server_name ;}server {listen 192.168.10.40:8080;//监听8080端口server_name ;}
2.检测端口是否运行正常。
service nginx stop
service nginx start
netstat -anpt | grep nginx
3.分别访问2个端口地址,查看是否访问到不同的页面,测试配置是否成功。