Nginx 是开源、高性能、高可靠的 Web 和
反向代理服务器
,而且支持热部署,几乎可以做到 7 * 24小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。
性能是 Nginx最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发连接数,最重要的是,Nginx 是免费的,并可以商业化,配置使用也比较简单。
Nginx 的最重要的几个使用场景:
Nginx 的主配置文件是/etc/nginx/nginx.conf,你可以使用 cat -n nginx.conf 来查看配置。
main # 全局配置,对全局生效
├── events # 配置影响 Nginx 服务器或与用户的网络连接
├── http # 配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置
│ ├── upstream # 配置后端服务器具体地址,负载均衡配置不可或缺的部分
│ ├── server # 配置虚拟主机的相关参数,一个 http 块中可以有多个 server 块
│ ├── server
│ │ ├── location # server 块可以包含多个 location 块,location 指令用于匹配 uri
│ │ ├── location
│ │ └── ...
│ └── ...
└── ...
user nginx; # 运行用户,默认即是nginx,可以不进行设置
worker_processes 1; # Nginx 进程数,一般设置为和 CPU 核数一样
error_log /var/log/nginx/error.log warn; # Nginx 的错误日志存放目录
pid /var/run/nginx.pid; # Nginx 服务启动时的 pid 存放位置
events {
use epoll; # 使用epoll的I/O模型(如果你不知道Nginx该使用哪种轮询方法,会自动选择一个最适合你操作系统的)
worker_connections 1024; # 每个进程允许最大并发数
}
http {
# 配置使用最频繁的部分,代理、缓存、日志定义等绝大多数功能和第三方模块的配置都在这里设置
# 设置日志模式
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 /var/log/nginx/access.log main; # Nginx访问日志存放位置
sendfile on; # 开启高效传输模式
tcp_nopush on; # 减少网络报文段的数量
tcp_nodelay on;
keepalive_timeout 65; # 保持连接的时间,也叫超时时间,单位秒
types_hash_max_size 2048;
include /etc/nginx/mime.types; # 文件扩展名与类型映射表
default_type application/octet-stream; # 默认文件类型
include /etc/nginx/conf.d/*.conf; # 加载子配置项
server {
listen 80; # 配置监听的端口
server_name localhost; # 配置的域名
location / {
root /usr/share/nginx/html; # 网站根目录
index index.html index.htm; # 默认首页文件
deny 172.168.22.11; # 禁止访问的ip地址,可以为all
allow 172.168.33.44;# 允许访问的ip地址,可以为all
}
error_page 500 502 503 504 /50x.html; # 默认50x对应的访问页面
error_page 400 404 error.html; # 同上
}
}
server 块可以包含多个 location 块,location 指令用于匹配 uri,语法:
location [ = | ~ | ~* | ^~] uri {
...
}
指令后面:
= 精确匹配路径,用于不含正则表达式的 uri 前,如果匹配成功,不再进行后续的查找;
^~ 用于不含正则表达式的 uri 前,表示如果该符号后面的字符是最佳匹配,采用该规则,不再进行后续的查找;
~ 表示用该符号后面的正则去匹配路径,区分大小写;
~* 表示用该符号后面的正则去匹配路径,不区分大小写。跟 ~ 优先级都比较低,如有多个location的正则能匹配的话,则使用正则表达式最长的那个;
如果 uri 包含正则表达式,则必须要有 ~ 或 ~* 标志。
2.1 关闭防火墙,将安装nginx
所需软件包传到/opt
目录下
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
nginx-1.12.0 .tar.gz
2.2 安装依赖包
nginx
的配置及运行需要pcre、zlib
等软件包的支持,因此需要安装这些安装的开发包,以便提供相应的库和头文件。yum -y install pcre-devel zlib-devel gcc gcc-c++ make
2.3 创建运行用户、组
useradd -M -s / sbin/nologin nginx
cd /opt
tar zxvf nginx-1.12.0.tar.gz-c /opt/
cd nginx-1.12.0/
./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的操作命令
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号>
tar -zxvf nginx-1.xx.xx.tar.gzcd nginx-1.xx.xx
./ configure \
--prefix=/usr/ local/nginx l--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
2.6 添加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
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
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service
systemctl enable nginx.service
[Unit]:服务的说明
Description:描述服务
After:依赖,当依赖的服务启动之后再启动自定义的服务
[Service]服务运行参数的设置
Type=forking是后台运行的形式,使用此启动类型应同时指定PIDFile=,以便systemd能够跟踪服务的主进程。
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:启动、重启、停止命令全部要求使用绝对路径
[Install]服务安装的相关设置,可设置为多用户
nginx.conf
vim /usr/locai/nginx/conf/nginx.conf
3.1 全局配置
#user nobody;
#运行用户,若编译时未指定则默认为nobody
worker_processes 1;
#工作进程数量,可配置成服务器内核数*2,如果网站访问量不大,一般设为1就够用 了
#error_1og 1ogs/error.log;
#错误日志文件的位置
#pid logs/nginx.pid;
#PID文件的位置
3.2 I/O 事件配置
events {
use epoll;
#使用epoll模型,2.6及以上版本的系统内核,建议使用epol1模型以提高性能
worker_connections 4096;
#每个进程处理4096 个连接
}
#如提高每个进程的连接数还需执行“ulimit-n65535”命令临时修改本地每个进程可以同时打开的最大文件数。
#在Linux平台上,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。
#可使用ulimit-a命令查看系统允许当前用户进程打开的文件数限制。
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"
# '"Shttp_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模块设置,设置是否开启gzip压缩输出
#gzip on;
##Web服务的监听配置
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;
}
}
}
3.4 日志格式设定
$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/1.jpg,会返回文件/usr/1ocal/nginx/html/test/1.jpg
alias (别名配置) :请求www.kgc.com/test/1.jpg,会返回文件/usr/local/nginx/html/1.jpg
proxy_pass (反向代理配置) :
proxy_pass http://127.0.0.1:8080/; 会转发请求到http://127.0.0.1:8080/1.jpg
proxy_pass http://127.0.0.1:8080; 会转发请求到http://127.0.0.1:8080/test/1.jpg
4.1 先使用命令/usr/local/nginx/sbin/nginx -V
查看已安装的Nginx 是否包含HTTP_STUB_STATUS
模块
4.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; #关闭此位置的日志记录
}
}
}
systemctl restart nginx
浏览器访问 http://192.168.80.10/status
Active connections :表示当前的活动连接数;
server accepts handled requests :表示已经处理的连接信息,三个数字依次表示已处理的连接数、成功的TCP握手次数、已处理的请求数。
可curl http://192.168.80.10/status结合awk与if 语句进行性能监控。
5.1 生成用户密码认证文件
yum install -y httpd-tools
htpasswd -C /usr/local/nginx/passwd.db zhangsan
chown nginx /usr/local/nginx/passwd.db
chmod 400 /usr/local /nginx/passwd.db
vim /usr/local/nginx/conf/nginx.conf
.....
server {
location / {
.....
##添加认证配置##
auth basic "secret"; #设置密码提示框文字信息
auth_basic_user_file /usr/local/nginx/passwd.db;
}
}
5.3 重启服务,访问测试
nginx -t
systemctl restart nginx
浏览器访问 http://192.168.80.10
访问控制规则如下:
vim /usr/local/nginx/conf/nginx.conf
.....
server {
location / {
.....
##添加控制规则##
deny 192.168. 80.200; #拒绝访问的客户端IP
allow all; #允许其它IP客户端访问
}
}
systemctl restart nginx
7.1 为虚拟主机提供域名解析
echo "192.168.80.10 www.kgc.com www.benet.com" >> /etc/hosts
mkdir -p /var/www/html/benet
mkdir -p /var/www/html/kgc
echo "www.kgc.com
" > /var/www/html/kgc/index.html
echo "www.benet.com
" > /var/www/html/benet/index.html
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.benet.com;
#设置域名www.benet.com
charset utf-8;
access_log logs/www.benet.access.log;
location / {
root /var/www/html/benet;
index index.html index.php
}
error_page 500 502 503 504 /50x.html;
location = 50x.html{
root html;
}
}
}
7.4 重启服务,访问测试
nginx -t
systemctl restart nginx
浏览器访问 http://www.kgc.com
http://www.benet.com
iflconfig ens33:0 192.168.80.11 netmask 255.255.255.0
vim /usr/local/nginx/conf/nginx.conf
....
http {
.....
server {
listen 192.168.116.90:80; #设置监听地址192.168.80.10
server_name WWW.nj.com; .
charset utf-8;
access_log logs/www.nj.access.log;
location / {
root /var/www/html/nj;
index index.html index.php;
}
error_page 500 502 503 504 /50x.html ;
location = 50x.html {
root html ;
}
}
server
listen 192.168.116.91:80;
server_name www.benet.com; #设置域名www.benet.com
charset utf-8;
access_log logs/www.benet.access.1og;
location / {
root /var/www/html/benet;
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.253.11
http://192.168.253.12
vim /usr/local/nginx/conf/nginx.conf
....
http {
.....
server {
listen 192.168.116.90:8080; #设置监听8080端口.
server_name www.nj.com;
charset utf-8;
access_log logs/www.nj.acess.1og;
location / {
root /var/www/html/nj;
index index.html index.php;
}
error_page 500 502 503 504 /50x. html;
location = 50x. html{
root html;
}
}
server
listen 192.168.116.91:8888;
server_name www.benet.com; #设置域名www.benet.com
charset utf-8;
access_log logs/www.benet.access.1og;
location / {
root /var/www/html/benet;
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.253.11:8080
http://192.168.253.12:8888
详细前往该网页查看