- 1 Nginx
- 1.1 简述 Nginx 和 Apache 的差异?
- 2 Nginx 网站服务
- 2.1 编译安装Nginx服务
- 2.2 认识 Nginx 服务的主配置文件 nginx.conf
- 2.2.1 全局配置(全局块)
- 2.2.2 I/O 事件配置(events块)
- 2.2.3 HTTP 配置(http块)
- 2.2.4 日志格式设定
- 2.2.5 访问状态统计配置
- 2.2.6 基于授权的访问控制
- 2.2.7 基于客户端的访问控制
- 3 构建 Nginx 虚拟 Web 主机
- 3.1 基于域名的 Nginx 虚拟主机
- 3.2 基于 IP 的 Nginx 虚拟主机
- 3.3 基于端口的 Nginx 虚拟主机
- 4 总结
Nginx 是一款高性能、轻量级 Web 服务软件具有稳定性高、系统资源消耗低、对 HTTP 并发连接的处理能力高的优点。单台物理服务器可支持 30000~50000 个并发请求。
1.1 简述 Nginx 和 Apache 的差异?- Nginx 是一个基于事件的 Web 服务器,Apache 是一个基于流程的服务器;
- Nginx 所有请求都由一个线程处理,Apache 单个线程处理单个请求;
- Nginx 避免子进程的概念,Apache 是基于子进程的;
- Nginx 在内存消耗和连接方面更好,Apache 在内存消耗和连接方面一般;
- Nginx 的性能和可伸缩性不依赖于硬件,Apache 依赖于 CPU 和内存等硬件;
- Nginx 支持热部署,Apache 不支持热部署;
- Nginx 对于静态文件处理具有更高效率,Apache 相对一般;
- Nginx 在反向代理场景具有明显优势,Apache 相对一般。
1.关闭防火墙,将 Nginx 所需软件包到/opt目录下
systemctl stop firewalld #关闭防火墙 systemctl disable firewalld #关闭防火墙开机自启 setenforce 0 #关闭系统安全机制 cd /opt #切换至/opt目录 nginx-1.12.0.tar.gz
2.安装依赖包
yum -y install pcre-devel zlib-devel gcc gcc-c++ make #安装所需要的开发包, 以提供相应的库和头文件以及编译环境和编译器
3.创建运行用户、组
(Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)
useradd -M -s /sbin/nologin nginx #创建程序用户,以便准确的控制访问 #Nginx服务程序默认以匿名用户运行
4.编译安装 Nginx
cd /opt tar zxvf nginx-1.12.0.tar.gz -C /opt/ cd nginx-1.12.0/ ./configure #使用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的操作命令
5.检查、启动、重启、停止 Nginx 服务
nginx -t #检查配置文件是否配置正确 nginx #启动 cat /usr/local/nginx/logs/nginx.pid #查看nginx的PID号(进程号) kill -3kill -s QUIT #停止 nginx killall -3 nginx killall -s QUIT nginx kill -1 #重载 kill -s HUP killall -1 nginx killall -s HUP nginx kill -USR1 #日志分隔,重新打开日志文件 kill -USR2 #平滑升级
6.新版本升级
tar -zxvf nginx-1.xx.xx.tar.gz cd nginx-1.x.xx ./configure --prefix=/usr/local/nginx --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
7.添加 Nginx 系统服务
方法一
vim /etc/init.d/nginx
#!/bin/bash
#chkconfig: - 99 20 #这是固定格式,2345表示运行级别,之后为开机执行顺序和关机执行顺序
99启动优先权 越小优先权越高
#description:Nginx Service Control Script
CMD="/usr/local/nginx/sbin/nginx"
PID="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
$CMD
;;
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 #返回错误码1
esac
exit 0
chmod +x /etc/init.d/nginx #给权限
chkconfig --add nginx #添加为系统服务
chkconfig --list nginx
service nginx start
service nginx stop
systemctl stop nginx
systemctl start nginx
不建议service和systemctl混合使用
方法二
vim /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 #启动服务 ExecrReload=/bin/kill -s HUP $MAINPID #根据PID重载配置 ExecrStop=/bin/kill -s QUIT $MAINPID #根据PID终止进程 PrivateTmp=true [Install] WantedBy=multi-user.target #启动级别 chmod 754 /lib/systemd/system/nginx.service systemctl start nginx.service systemctl enable nginx.service2.2 认识 Nginx 服务的主配置文件 nginx.conf
- 全局块:全局配置,对全局生效;
- events 块:配置影响 Nginx 服务器与用户的网络连接;
- http 块:配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置;
- server 块:配置虚拟主机的相关参数,一个http块中可以有多个 server 块;
- location 块:用于配置匹配的 uri;
- upstream:配置后端服务器具体地址,负载均衡配置不可或缺的部分。
vim /usr/local/nginx/conf/nginx.conf2.2.1 全局配置(全局块)
#user nobody; #运行用户,若编译时未指定则默认为 nobody worker_processes 1; #工作进程数量,可配置成服务器内核数 * 2(一般设置为和CPU核数一样) #error_log logs/error.log; #错误日志文件的位置 #pid logs/nginx.pid; #PID 文件的位置2.2.2 I/O 事件配置(events块)
events {
use epoll; #使用 epoll 模型,2.6及以上版本的系统内核,建议使用epoll模型以提高性能
worker_connections 1024; #每个进程处理 1024 个连接
}
允许 Nginx 正常提供服务的连接数(并发量):工作进程数为 1,每个进程处理 1024 个连接,则为cpu核数连接数(11024=1024)
- 如提高每个进程的连接数还需执行 “ulimit -n 65535” 命令临时修改本地每个进程可以同时打开的最大文件数.(永久配置/etc/security/limits.conf)
- 在 Linux 平台上,在进行高并发 TCP 连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个 TCP 连接都要
创建一个 socket 句柄,每个 socket 句柄同时也是一个文件句柄). - 可使用 ulimit -a 命令查看系统允许当前用户进程打开的文件数限制.
- epoll 是 Linux 内核为处理大批句柄而作改进的 poll,是 Linux下多路复用 IO 接口 select/poll 的增强版本,它能显著的减少程序在大量并发连接中只有少量活跃的情况下的系统 CPU 利用率.
临时配置
永久配置
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; #支持文件发送(下载)
##此选项允许或禁止使用socke的TCP_CORK的选项(发送数据包前先缓存数据),此选项仅在使用sendfile的时候使用
#tcp_nopush on; #减少网络报文段的数量
##连接保持超时时间,单位是秒
#keepalive_timeout 0; #代表不开启长连接
keepalive_timeout 65; #连接保持默认值为65
##gzip模块设置,设置是否开启gzip压缩输出
#gzip on;
##Web 服务的监听配置
server { #一个站点就是一个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;
}
}
}
使用火狐浏览器进行访问:验证访问本机地址,访问成功
$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,会返回文件/usr/local/nginx/html/test/index.html alias(别名配置):请求www.kgc.com/test,会返回文件/usr/local/nginx/html/index.html
第一种情况:root(根)
如果访问http://192.168.16.16/test/test.html 访问的路径为:/usr/local/nginx/html/test/test.html
第二种情况
http://192.168.16.16/test/test.html
匹配到 /test 会优先选择此路径
访问路径为/usr/local/nginx/html/test/test.html
举例:
http://192.168.16.16/test.html -->/usr/local/nginx/html/test.html #访问根目录下的test.html文件 http://192.168.16.16/test/test.html -->/data/test/test.html #访问的是/test/下面的test.html文件
alias(别名配置)
mkdir -p /var/www/html
cd /var/www/html
echo "this is var" > test.html
cat test.html
this is var
vim /usr/local/nginx/conf/nginx.conf
------------------------------------------------------------------
location /test {
alias /var/www/html;
index index.html index.htm;
}
nginx -t #检查语法
systemctl restart nginx #重启服务
1、查看安装模块
先使用命令 /usr/local/nginx/sbin/nginx -V 查看已安装的 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已安装的所有模块
- 查看版本和编译安装时的配置参数
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; #关闭此位置的日志记录
}
}
}
3、重启服务,访问测试
nginx -t #检查语法 systemctl restart nginx #重启服务
浏览器访问 http://192.168.16.16/status
Active connections :表示当前的活动连接数;
server accepts handled requests :表示已经处理的连接信息,三个数字依次表示已处理的连接数、成功的TCP握手次数、 已处理的请求数。
- 通过命令进行访问
curl -Ls http://192.168.16.16/status
curl -Ls http://192.168.16.16/status|awk '/Active connections:/ {print $3}'
#Active connections:表示当前活动的连接数。
#server accepts handled requests:表示当前已经处理的连接信息,三个数字依次表示已处理的连接数、成功的TCP握手次数、已处理的请求数。
#Reading: Nginx 读取到客户端的Header信息数。
#Writing: Nginx 返回给客户端的Header信息数。
#Waiting: 开启keep-alive的情况下,这个值等于 active – (reading + writing),意思就是Nginx已经处理完成,正在等候下一次请求指令的驻留连接。
- 监控nginx当前并发数量
可使用 curl -Ls http://192.168.16.16/status 结合awk与if语句进行性能监控。
#!/bin/bash
CON=$(curl -Ls http://192.168.72.10/status | awk '/Active connections:/{print $3}')
if[ $CON -gt 25000 ];then
echo "警告!当前并发数量为$CON,超过预警值!"
2.2.6 基于授权的访问控制
1.生成用户密码认证文件
yum install -y httpd-tools htpasswd -c /usr/local/nginx/passwd.db zhangsan chown nginx /usr/local/nginx/passwd.db #将文件的属主改为nginx chmod 400 /usr/local/nginx/passwd.db #权限设为400,只用root用户与nginx用户可以访问,如果不设置权限执行会报错
2.修改主配置文件相对应目录,添加认证配置项
vim /usr/local/nginx/conf/nginx.conf
......
server {
location / {
......
alias /var/www/html;
index index.html index.htm;
##添加认证配置##
auth_basic "Hello"; #设置密码提示框文字信息
auth_basic_user_file /usr/local/nginx/passwd.db;
}
}
3.重启服务,访问测试
nginx -t #检查语法 systemctl restart nginx #重启服务 浏览器访问 http://192.168.16.16或www.kgc.com
访问控制规则如下:
deny IP/IP 段:拒绝某个 IP 或 IP 段的客户端访问。
allow IP/IP 段:允许某个 IP 或 IP 段的客户端访问。
规则从上往下执行,如匹配则停止,不再往下匹配。
vim /usr/local/nginx/conf/nginx.conf
......
server {
location / {
......
##添加控制规则##
deny 192.168.16.20; #拒绝访问的客户端 IP
allow all; #允许其它IP客户端访问
}
}
重启服务,访问测试
nginx -t #检查语法 systemctl restart nginx #重启服务 http://192.168.16.16/test/test.html/3 构建 Nginx 虚拟 Web 主机 3.1 基于域名的 Nginx 虚拟主机
1、为虚拟主机提供域名解析
echo "192.168.16.16 www.kgc.com www.accp.com" >> /etc/hosts
2、为虚拟主机准备网页文档
mkdir -p /var/www/html/kgc mkdir -p /var/www/html/accp echo "www.kgc.com" > /var/www/html/kgc/index.html echo "www.accp.com" > /var/www/html/accp/index.html
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.accp.com; #设置域名www.accp.com
charset utf-8;
access_log logs/www.accp.access.log;
location / {
root /var/www/html/accp;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
}
4、重启服务,访问测试
nginx -t #检查语法 systemctl restart nginx #重启服务 http://www.kgc.com http://www.accp.com
#设置虚拟网卡,IP为192.168.16.20 子网24 ifconfig ens33:0 192.168.16.20 netmask 255.255.255.0
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
server {
listen 192.168.16.16:80; #设置监听地址
server_name www.kgc.com;
charset utf-8;
access_log logs/www.lic.access.log;
location / {
root /var/www/html/kgc;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
server {
listen 192.168.16.20:80; #设置监听地址
server_name www.accp.com;
charset utf-8;
access_log logs/www.accp.access.log;
location / {
root /var/www/html/accp;
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.16.16 http://192.168.16.20
vim /usr/local/nginx/conf/nginx.conf
......
http {
......
server {
listen 192.168.16.16:8080; #设置监听 8080 端口
server_name www.kgc.com;
charset utf-8;
access_log logs/www.kgc.access.log;
location / {
root /var/www/html/kgc;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
server {
listen 192.168.16.16:8888; #设置监听 8888 端口
server_name www.accp.com;
charset utf-8;
access_log logs/www.accp.access.log;
location / {
root /var/www/html/accp;
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.16.16:8080 http://192.168.16.16:8888
1、查看Nginx支持的最大并发量(软件支持、系统支持、CPU性能)
例如现在CPU有两核,想要实现支持30000并发量 。
- 软件支持
软件配置支持多少并发量,由主配置文件nginx.conf决定:理论上支持的并发量=工作进程数量×每个工作进程处理的连接数。
将工作进程数设置为 2(与CPU核数一致),每个工作进程处理 15000 个连接(一般设置为2 的次方),那么软件支持的最大并发数量是30000个。
- 系统支持
系统会限制本地每个用户进程可以同时打开的最大文件数量,即系统会限制每个进程的连接数。
查看系统支持多少并发量:- 使用 “ulimit -a” 可查看系统允许当前用户进程打开的文件数限制。
修改系统支持的最大并发量: - “ulimit -n 65535” 命令可临时修改本地每个用户进程可以同时打开的最大文件数。
- vim /etc/security/limits.conf,编辑该文件可永久修改。
- 使用 “ulimit -a” 可查看系统允许当前用户进程打开的文件数限制。
- 实际工作中还要进行压测,测试CPU性能能否支持这个最大并发量。
上述设置的软硬并发量都是理论上的,真正并发量还得看CPU的性能,在投放到生产环境前,我们需要进行压测 。



