目录
一、event模块:
1.最大并发连接数:
2.选择事件驱动:
3.互斥锁:
4.网络多连接:
二、http模块:
1.server块 基于域名构建虚拟主机:
1.1 指定子配置文件:
1.2 编写子配置文件:
1.3 构建数据文件:
1.4 测试:
1.5 基于端口:
1.6 基于IP:
2.alias 设置别名:
3.location:
3.1 格式:
3.2 案例:
4.access四层控制模块:
5.验证模块:
5.1 htpasswd:
6.自定义错误界面:
6.1 自定义状态码:
7.日志位置存放:
8.检测文件是否存在:
当test存在时:
当test被删除时,会找到test.html:
没有匹配项时,托底的default:
编辑
9.作为下载服务器配置:
10.其他设置:
三、高级配置:
1.网页的状态页:
1.1.状态信息介绍:
2.Nginx 第三方模块:
1.安装git:
2.使用第三方模块需要重新编译安装:
3.编写配置文件:
4.新机器访问:
3.变量:
1.内置变量:
4.自定义变量:
1.格式:
2.示例:
5.自定义访问日志:
1.自定义格式添加在主配置文件:
2.子配置文件调用:
6.nginx的压缩功能:
1.简介:
2.示例:
7.https:
1.简介:
2.https自签发证书:
2.3配置文件编写:
8.自定义图标:
1.准备一个图标:
2.编写子配置文件:
用于配置服务器的事件驱动机制的模块。它定义了 Nginx 如何处理并发连接和网络事件,以及如何与底层操作系统的事件机制交互。
worker_connections 65536;
nginx默认使用epoll时间驱动类型:
use epoll; ##不写默认是epoll
使用互斥锁来限制同时只有一个 worker 进程能够接受新的连接。在高并发环境中可以提高性能和稳定性。在高流量和高并发的情况下,使用 accept_mutex on;
可能会导致性能下降,因为每个 worker 进程在接受新连接时都需要等待互斥锁的释放。
accept_mutex on;
#追求稳定打开
当 multi_accept
设置为 on
时,Nginx 的 worker 进程会一次性接受多个新连接,在高并发环境中,可以提高性能。可能会导致某些 worker 进程在某一时刻接受了更多的连接,而其他进程接受较少的连接。这可能会影响负载均衡。(建议设置on,处理高并发)
multi_accept on;
是用于配置 HTTP 服务器功能的核心模块。定义和管理 HTTP 服务、虚拟主机、反向代理、负载均衡、缓存、访问控制等一系列与 Web 服务器相关的功能。
多个服务编写在不同的子配置文件中,可以更好地管理。
mkdir -p /apps/nginx/conf.d
vim /apps/nginx/conf/nginx.conf
include /apps/nginx/conf.d/*.conf;
cd /apps/nginx/conf.d
vim pc.conf
server {
listen 80;
server_name www.wzw.com;
root /apps/nginx/html/pc/;
}
vim m.conf
server {
listen 80;
server_name m.wzw.com;
root /apps/nginx/html/m/;
}
1.创建文件夹
mkdir /apps/nginx/html/{pc,m}
2.构建数据
echo pc > /apps/nginx/html/pc/index.html
echo mmm > /apps/nginx/html/m/index.html
nginx -s reload
客户机更改host文件:
vim /etc/hosts
192.168.88.100 www.wzw.com m.wzw.com
更改子配置文件
server{
listen 192.168.91.100:80;
server_name www.wzw.com;
root /data/nginx/html/pc;
}
server{
listen 192.168.91.100:8080;
server_name m.wzw.com;
root /data/nginx/html/m;
}
需要添加一块虚拟网卡
ifconfig ens33:0 192.168.88.101
更改子配置文件IP
server{
listen 192.168.91.100;
server_name www.wzw.com;
root /data/nginx/html/pc;
}
server{
listen 192.168.91.101;
server_name m.wzw.com;
root /data/nginx/html/m;
}
server {
listen 80;
server_name www.wzw.com;
location /nwes {
root /data/nginx/html/pc/;
#相当于追加 将文件夹news追加到/data/nginx/html/pc/news
}
location /study{
alias /mnt/nginx/sports/;
#相当于替换访问路径 你访问 study 就是访问/mnt/nginx/sports
}
}
在一个server中location配置段可存在多个,用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,按一定的优化级找出一个最佳匹配。
location [ = | ~ | ~* | ^~ ] uri { ... }
= #需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止立即处理请求
^~ #表示包含正则表达式,并且匹配以指定的正则表达式开头,不区分字符大小写
~ #表示包含正则表达式,并且区分大小写
~* #表示包含正则表达式,并且不区分大写
不带符号 #匹配起始于此uri的所有的uri
\ #表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号
#匹配优先级从高到低:
=, ^~ , ~/~* , 不带符号
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
访问路径是 /
访问路径是 /index.html
访问路径是 /documents/document.html
访问路径是 /images/1.gif
访问路径是 /documents/1.jpg
location / {
allow 192.168.1.0/24;
allow 10.1.1.0/16;
deny all;
}
匹配了之后就不往下匹配了,所以范围小的往上放
server {
listen 80;
server_name www.wzw.com;
root /apps/nginx/html/pc/;
location = / {
root /apps/nginx/html/pc;
}
location /admin{
auth_basic "admin site";
auth_basic_user_file /apps/nginx/conf.d/.httpuser;
}
}
此命令来自于 httpd-tools 包,如果没有安装 一下即可
yum -y install httpd-tools
第一次生成文件:
htpasswd -bc 文件路径 姓名 密码 直接将密码跟在后面
第二次生成文件:
htpasswd -b 文件路径 姓名 密码 直接将密码跟在后面
-c 代表新建用户名和密码对应的文件
-b 将密码跟在用户名后
server {
listen 80;
server_name www.wzw.com;
root /apps/nginx/html/pc/;
error_page 404 /40x.html;
location = /40x.html {
root /apps/nginx/html/pc/error/;
location = / {
root /apps/nginx/html/pc; ##当出现404就去找40x.html这个文件
}
location /admin{
auth_basic "admin site";
auth_basic_user_file /apps/nginx/conf.d/.httpuser;
}
}
server {
listen 80;
server_name www.wzw.com;
error_page 404 =302 /40x.html; #建议使用302
location = /40x.html {
root /apps/nginx/html/pc/error/;
location = / {
root /apps/nginx/html/pc;
}
location /admin{
auth_basic "admin site";
auth_basic_user_file /apps/nginx/conf.d/.httpuser;
}
}
把错误码 404 指定成302 注意此处的 40x.html 需要真实存在建立的页面必须一致
server {
listen 80;
server_name www.wzw.com;
root /apps/nginx/html/pc/;
access_log /apps/nginx/logs/wzw_access.log;
##添加日志存放位置
location = / {
root /apps/nginx/html/pc/;
}
location /admin{
root /apps/nginx/html/pc/admin.html;
auth_basic "admin site";
auth_basic_user_file /apps/nginx/conf.d/.httpuser;
}
}
try_files会按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。只有最后一个参数可以引起一个内部重定向,之前的参数只设置内部URI的指向。最后一个参数是回退URI且必须存在,否则会出现内部500错误。
server {
listen 80;
server_name 192.168.88.100;
root /apps/nginx/html;
location / {
root /apps/nginx/html;
try_files $uri $uri.html $uri/index.html /about/default.html;
}
}
server {
listen 80;
server_name 192.168.88.100;
root /apps/nginx/html;
location /download {
autoindex on; #开启下载服务器
autoindex_exact_size on; #开启确切大小
autoindex_localtime on; #使用当地时间
limit_rate 1024k; #所有人限速1024k,默认单位是字节数
alias /opt/download; #别名,当访问download时跳转到/opt/download
}
}
mkdir /opt/download
mount /dev/sr0 /opt/download/
limit_except method ... { ... },仅用于location
#限制客户端使用除了指定的请求方法之外的其它方法
method:GET, HEAD, POST, PUT, DELETE,MKCOL, COPY, MOVE, OPTIONS, PROPFIND,
PROPPATCH, LOCK, UNLOCK, PATCH
limit_except GET {
allow 192.168.91.101;
deny all;
}
#除了GET和HEAD 之外其它方法仅允许192.168.1.0/24网段主机使用
基于nginx 模块 ngx_http_stub_status_module 实现,在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module,否则配置完成之后监测会是提示语法错误注意: 状态页显示的是整个服务器的状态,而非虚拟主机的状态
这里为了安全起见添加了验证模块:
server {
listen 80;
server_name 192.168.88.100;
root /apps/nginx/html/pc/;
location /admin{
stub_status; #启用status
auth_basic "admin site";
auth_basic_user_file /apps/nginx/conf.d/.httpuser;
}
}
Active connections:
#当前处于活动状态的客户端连接数,包括连接等待空闲连接数=reading+writing+waiting
accepts:
#统计总值,Nginx自启动后已经接受的客户端请求的总数。
handled:
#统计总值,Nginx自启动后已经处理完成的客户端请求总数,通常等于accepts,除非有因worker_connections限制等被拒绝的连接
requests:
#统计总值,Nginx自启动后客户端发来的总的请求数。
Reading:
#当前状态,正在读取客户端请求报文首部的连接的连接数,数值越大,说明排队现象严重,性能不足
Writing:
#当前状态,正在向客户端发送响应报文过程中的连接数,数值越大,说明访问量很大
Waiting:
#当前状态,正在等待客户端发出请求的空闲连接数,开启 keep-alive的情况下,这个值等于active – (reading+writing)
yum install git -y
cd /opt
git clone https://github.com/openresty/echo-nginx-module.git
systenctl stop nginx
./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module --add-module=/opt/echo-nginx-module-master
make -j2 && make install
systemctl start nginx
vim /apps/nginx/conf.d/www.conf
server{
listen 80;
server_name www.wzw.com;
root /apps/nginx/html/pc/;
location /ip {
echo "hello";
}
}
$remote_addr;
#存放了客户端的地址,注意是客户端的公网IP
$proxy_add_x_forwarded_for
#此变量表示将客户端IP追加请求报文中X-Forwarded-For首部字段
$args;
#变量中存放了URL中的参数
$document_root;
#保存了针对当前资源的请求的系统根目录,例如:/apps/nginx/html。
$document_uri;
#保存了当前请求中不包含参数的URI,注意是不包含请求的指令,比
如:http://www.kgc.org/main/index.do?id=20190221&partner=search会被定义为/main/index.do
#返回结果为:/main/index.do
$host;
#存放了请求的host名称
limit_rate 10240;
echo $limit_rate;
#如果nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置, 则显示0
$remote_port;
#客户端请求Nginx服务器时随机打开的端口,这是每个客户端自己的端口
$remote_user;
#已经经过Auth Basic Module验证的用户名
$request_body_file;
#做反向代理时发给后端服务器的本地资源的名称
$request_method;
#请求资源的方式,GET/PUT/DELETE等
$request_filename;
#当前请求的资源文件的磁盘路径,由root或alias指令与URI请求生成的文件绝对路径,如:/apps/nginx/html/main/index.html
$request_uri;
#包含请求参数的原始URI,不包含主机名,相当于:$document_uri?$args,例如:/main/index.do?id=20190221&partner=search
$scheme;
#请求的协议,例如:http,https,ftp等
$server_protocol;
#保存了客户端请求资源使用的协议的版本,例如:HTTP/1.0,HTTP/1.1,HTTP/2.0等
$server_addr;
#保存了服务器的IP地址
$server_name;
#请求的服务器的主机名
$server_port;
#请求的服务器的端口号
$http_
#name为任意请求报文首部字段,表示记录请求报文的首部字段
arbitrary request header field; the last part of a variable name is the field name converted to lower case with dashes replaced by underscores
#用下划线代替横线
#示例: echo $http_User_Agent;
$http_user_agent;
#客户端浏览器的详细信息
$http_cookie;
#客户端的cookie信息
$cookie_
#name为任意请求报文首部字部cookie的key名
$http_
#name为任意请求报文首部字段,表示记录请求报文的首部字段,ame的对应的首部字段名需要为小写,如果有
横线需要替换为下划线
arbitrary request header field; the last part of a variable name is the field
name converted to lower case with dashes replaced by underscores #用下划线代替横线
#示例:
echo $http_user_agent;
echo $http_host;
$sent_http_
#name为响应报文的首部字段,name的对应的首部字段名需要为小写,如果有横线需要替换为下划线,此变量有问题
echo $sent_http_server;
$arg_
#此变量存放了URL中的指定参数,name为请求url中指定的参数
#对比 变量 $arg 是全部, 如果 要id 如下
echo $arg_id;
set 变量名 变量值;
Context: server, location, if
server{
listen 80;
server_name www.wzw.com;
root /apps/nginx/html/pc/;
set $name wzw;
location /ip {
echo $name;
}
}
nginx -s reload
log_format access_json '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",'
'"http_host":"$host",'
'"uri":"$uri",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"tcp_xff":"$proxy_protocol_addr",'
'"http_user_agent":"$http_user_agent",'
'"status":"$status"}';
server{
listen 80;
server_name www.wzw.com;
root /apps/nginx/html/pc/;
location /ip {
access_log logs/access.log access_json;
}
}
支持对指定类型的文件进行压缩然后再传输给客户端,而且压缩还可以设置压缩比例,压缩后的文件大小将比源文件显著变小,这样有助于降低出口带宽的利用率,降低企业的IT支出,不过会占用相应的CPU资源。
#启用或禁用gzip压缩,默认关闭
gzip on | off;
#压缩比由低到高从1到9,默认为1
gzip_comp_level level;
#gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_min_length 1k;
#如果启用压缩,是否在响应报文首部插入“Vary: Accept-Encoding”,一般建议打开
gzip_vary on | off;
#预压缩,先压缩好,不用临时压缩,消耗cpu
gzip_static on | off;
server {
listen 80;
server_name www.wzw.com;
root /apps/nginx/html;
gzip on;
gzip_comp_level 9;
gzip_min_length 1k;
gzip_vary on;
gzip_static on;
Web网站的登录页面都是使用https加密传输的,加密数据以保障数据的安全,HTTPS能够加密信息,以免敏感信息被第三方获取,所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议,HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。
自签发证书可以脚本实现,需要dd
cd conf.d
mkdir ssl;cd ssl 所有的证书需要放在一起不能移开
bash certificate.sh
cat wzw.com.crt ca.crt > www.wzw.com.crt 顺序不能错!!
mv wzw.com.key www.wzw.com.key
server{
listen 80;
listen 443 ssl;
## 监听443
ssl_certificate /apps/nginx/conf.d/ssl/www.wzw.com.crt;
## 指向包含当前虚拟主机和CA的两个证书信息的文件
ssl_certificate_key /apps/nginx/conf.d/ssl/www.wzw.com.key;
## 当前虚拟主机使用的私钥文件,一般是key文件
ssl_session_cache shared:sslcache:20m;
## 在各worker之间使用一个共享的缓存,需要定义一个缓存名称和缓存空间大小,一兆可以存储4000个会话信息,多个虚拟主机可以使用相同的缓存名称
ssl_session_timeout 10m;
## 客户端连接可以复用ssl session cache中缓存的有效时长
server_name www.wzw.com;
root /apps/nginx/html/;
location / {
root /apps/nginx/html;
if ( $scheme = http ){
rewrite ^/(.*)$ https://www.wzw.com/$1 redirect;
## 当$scheme为http时,重写为https ^/(.*)$以/后所有 $1后向引用
}
}
}
favicon.ico 文件是浏览器收藏网址时显示的图标,当客户端使用浏览器问页面时,浏览器会自己主动发起请求获取页面的favicon.ico文件,但是当浏览器请求的favicon.ico文件不存在时,服务器会记录404日志,而且浏览器也会显示404报错。
wget www.baidu.com/favicon.ico
放到 html文件夹下
server{
listen 80;
server_name www.wzw.com;
root /apps/nginx/html;
location = /favicon.ico {
log_not_found off;
access_log off;
}
}