一、Nginx概述
1.1 Nginx概述
Nginx:
Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。
对HTTP并发连接的处理能力高,单台物理服务器可支持30000~50000个并发请求。
Apache:
Apache是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适用于多处理器环境,因此,在一个apache Web站点扩容时,通常是增加服务器或扩充群集节点而不是增加处理器。
1.2 Nginx和Apache的差异
| Nginx | Apache |
|---|---|
| nginx是一个基于事件的web服务器 | apache是一个基于流程的服务器 |
| 所有请求都由一个线程处理 | 单个线程处理单个请求 |
| nginx避免子进程的概念 | apache是基于子进程的 |
| nginx类似于速度 | apache类似于功率 |
| nginx在内存消耗和连接方面比较好 | apache在内存消耗和连接上没有提高 |
| nginx在负载均衡方面表现较好 | 当流量到达进程极限时,apache将拒绝新的连接。 |
| nginx不支持IBMI和openvms一样的os | apache支持更多的os |
| nginx只具有核心功能 | apache提供了比nginx更多的功能 |
| nginx的性能和可伸缩性不依赖于硬件 | apache依赖于cpu和内存等硬件组件 |
| Nginx支持热部署 | Apache不支持热部署 |
Apache: 创建多个进程或线程,而每个进程或线程都会为其分配cpu和内存(线程要比进程小的多,所以worker支持比perfork高的并发),并发过大会榨干服务器资源。
Nginx: 采用单线程来异步非阻塞处理请求(管理员可以配置Nginx主进程的工作进程的数量),不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换。所以才使得Nginx 支持更高的并发。
1.3 Nginx和Apache的优缺点比较
(1)nginx相对于apache的优点∶
- 轻量级,同样起web服务,比apache占用更少的内存及资源
- 抗并发,nginx处理请求是异步非阻塞的,而apache是阻塞型的在高并发下,nginx能保持低资源低消耗高性能
- 高度模块化的设计,编写模块相对简
- 支持热部署,平滑升级
(2)apache相对于nginx的优点∶
- Rewrite比nginx的rewrite强大 (rewrite的主要功能就是实现统一资源定位符URL的跳转)
- 模块多,基本想到的都可以找到
- 少bug, nginx的bug相对较多
- 超稳定
- Nginx处理动态请求是弱项,动态请求要Apache去做。
总结:一般来说,需要性能的web服务,用Nginx. 如果不需要性能只求稳定,那就Apache。Nginx处理动态请求是弱项,一般动态请求要Apache去做,Nginx只适处理静态网页或反向代理。
二、编译安装Nginx服务的操作步骤
2.1 关闭防火墙,准备所需的安装包传到/opt目录下
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
2.2 安装依赖包
[root@localhost opt]# yum install -y pcre-devel zlib-devel gcc gcc-c++ make
#各程序作用解释如下: gcc
#C语言的编译器 gcc-c++
#C++的编译器 make
#源代码编译器(源代码转换成二进制文件) pcre-devel
#perl的接口开发包,提供正则表达式 zlib-devel
#提供压缩功能
2.3 创建运行用户和组
[root@localhost opt]# useradd -M -s /sbin/nologin nginx
2.4 解压软件包,编译安装nginx
[root@localhost opt]# tar zxvf nginx-1.12.2.tar.gz
[root@localhost opt]# cd nginx-1.12.2/
[root@localhost nginx-1.12.2]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module
[root@localhost nginx-1.12.2]# make -j4 && make install
#开四核进行编译
[root@localhost nginx-1.12.2]# 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号>
| 信号编号 | 信号名 | 含义 |
|---|---|---|
| 0 | EXIT | 程序退出时收到该信息。 |
| 1 | HUP | 挂掉电话线或终端连接的挂起信号,这个信号也会造成某些进程在没有终止的情况下重新初始化。 |
| 2 | INT | 表示结束进程,但并不是强制性的,常用的 "Ctrl+C" 组合键发出就是一个 kill -2 的信号。 |
| 3 | QUIT | 退出。 |
| 9 | KILL | 杀死进程,即强制结束进程。 |
| 11 | SEGV | 段错误。 |
| 15 | TERM | 正常结束进程,是 kill 命令的默认信号 |
2.6 添加nginx服务
#方法一:
vim /etc/init.d/nginx
#!/bin/bash
#chkconfig: 35 99 20 // 这是固定格式,2345表示运行级别,之后为开机执行顺序和关机执行顺序
#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
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
--------------------------------------------
chmod 754 /lib/systemd/ system/nginx.service
systemctl start nginx.service
2.7 浏览器验证
安装成功!
三、Nginx服务的主配置文件
主配置文件位置:
/usr/local/nginx/conf/nginx.conf
主配置文件中有六个主要模块:
1、全局块:全局配置,对全局生效。
2、events块:配置影响Nginx服务器与用户的网络连接。
3、http块:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。
4、server块:配置虚拟主机的相关参数,一个http块中可以有多个server 块。每个 server 块就相当于一个虚拟主机。。
5、location块:用于配置匹配的url,一个server块中可以有多个location块。
6、upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分。
3.1 全局配置
#user nobody; //运行用户,若编译时未指定则默认为nobody,若编译指定了用户则会写到二进制程序里变成默认配置。此前编译时指定了"--user=nginx",所以现在二进制程序中的运行用户为nginx
worker_processes 1; //工作进程数量,一般设置为和CPU核数一样
#error_log logs/error.log; //错误日志文件的位置
#pid logs/nginx.pid; //PID文件的位置
3.2 I/O事件配置
events {
use epoll; #使用epoll模型,2.6及以上版本的系统内核,建议使用epoll模型以提高性能
worker_connections 4096; #每个进程处理 4096个连接
}
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" '
# '"$http_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 on; ##gzip模块设置,设置是否开启gzip压缩输出
server {
listen 80; ##监听地址及端口
server_name www.clj.com; ##站点域名,可以有多个,用空格隔开
#charset utf-8; #网页的默认字符集
#access_log logs/host.access.log main;
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;
}
日志格式设定:
$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地址和原来客户端的请求的服务器地址。
四、访问状态统计配置
4.1 查看nginx的安装模块,是否包含 HTTP_STUB_STATUS 模块
nginx -v #查看nginx的版本。此前已将nginx的可执行文件放入PATH的目录中,所以可以直接使用nginx命令
nginx -V #查看nginx的版本,以及编译安装时的配置参数
cat /opt/nginx-1.12.2/auto/options #查看nginx已安装和未安装的模块,with表示已安装,without表示未安装
cat /opt/nginx-1.12.2/auto/options | grep "YES" #查看nginx已安装的所有模块
查看 HTTP_STUB_STATUS 模块是否已安装:
[root@localhost opt]# cat /opt/nginx-1.12.2/auto/options | grep "HTTP_STUB_STATUS"
HTTP_STUB_STATUS=NO
--with-http_stub_status_module) HTTP_STUB_STATUS=YES ;;
4.2 修改 nginx.conf 配置文件,指定访问位置并添加 stub_status 配置
[root@localhost opt]# cd /usr/local/nginx/conf
[root@localhost conf]# cp nginx.conf nginx.conf.bak
[root@localhost conf]# vim nginx.conf
server {
listen 80;
server_name www.km.com;
charset utf-8;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
##添加 stub_status 配置
location /status { ##访问位置为/status
stub_status on; ##打开状态统计功能
access_log off; ##关闭此位置的日志记录
}
[root@localhost conf]# systemctl restart nginx #重启服务
五、基于授权的访问控制
5.1 生成用户密码认证文件
[root@localhost conf]# yum install -y
[root@localhost conf]# httpd-tools htpasswd -c /usr/local/nginx/passwd.db zhangsan
[root@localhost conf]# chown nginx /usr/local/nginx/passwd.db
[root@localhost conf]# 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.2 重启服务,访问测试
[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.service
5.3 基于客户端访问控制
设置只有指定IP/IP段才可以访问该网页,或指定IP/IP段不能访问。想要对哪个路径进行限制,就在location块下添加路径和控制规则,我这里直接使用根目录做实验。
访问控制规则如下:
-
deny IP/IP段:拒绝某个IP或IP段的客户端访问。(黑名单)
-
allow IP/IP段:允许某个IP或IP段的客户端访问。(白名单)
-
规则从上往下执行,匹配到则停止,不再往下匹配。
[root@localhost ~]# systemctl restart nginx.service
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
...........
server {
location / {
root html;
index index.html index.htm;
##添加控制规则
allow 192.168.10.80;
deny all; #拒绝其他ip客户端访问
}
}
[root@localhost ~]# nginx -t
[root@localhost ~]# systemctl restart nginx