运维常用服务 nginx

概述

Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。
在 项目中nginx 经常被作为反向代理服务器使用

一般项目架构流程图

nginx做维护页面_运维

安装&启动

  1. 安装
# yum安装
yum -y install nginx
# 也可以去官网下载源码安装 源码包可以安装部分模块自定义位置相比yum安装方便扩展
  1. 启动
# 启动nginx 服务
systemctl restart nginx
# nginx检查配置是否正确
nginx -t
# 重新加载配置
nginx -s reload
# 停止nginx
systemctl stop nginx
# 强制停止nginx
pkill -9 nginx
  1. 配置
    nginx 常见配置文件位置
    /etcn/nginx/nginx.conf (nginx配置文件路径)
    /var/www (nginx服务器默认的根目录)
    /var/log/nginx/error.log (nginx默认的日志路径)

配置使用

nginx.conf 配置文件说明

以下为全局配置 和 http 配置

user  nginx;				# 使用用户
worker_processes  auto;		# worker进程数

error_log  /var/log/nginx/error.log notice;	# 错误日志位置
pid        /var/run/nginx.pid;	# 进程pid 存放位置

events {
    worker_connections  1024;	# 进程最大打开文件数
}

http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;	# 访问日志

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;		# 最大保持连接

    #gzip  on;
	# 扩展读取配置文件目录
    include /etc/nginx/conf.d/*.conf;
}
# 设置中文 访问日志
log_format nginx_chinese_fmt '
[时间]:\t$time_local
[访问地址]:\t$remote_addr
[访问用户]:\t$remote_user
[请求方式]:\t$request
[状态]:\t$status
[请求跳转来源]:\t$http_referer
[主机名]:\t$host
[uri]:\t$document_uri
[请求参数args]:\t$args
[请求参数query_string]:\t$query_string
[客户端]:\t$http_user_agent
[给客户端发送的字节数]:\t$body_bytes_sent
[请求中参数是否为空]:\t$is_args
[tcp连接序号]:\t$connection
[请求头字段]:\t$content_type
[请求头]:\t$sent_http_
[请求头2]:\t$http_my_header
[请求cookie]:\t$http_cookie
\n\n';

# 访问样式
[时间]: 03/Jan/2024:07:18:43 +0000
[访问地址]:     139.99.28.148
[访问用户]:     -
[请求方式]:     POST / HTTP/1.1
[状态]: 405
[请求跳转来源]: -
[主机名]:       162.14.78.39
[uri]:  /index.html
[请求参数args]: -
[请求参数query_string]: -
[客户端]:       Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36
[给客户端发送的字节数]: 559
[请求中参数是否为空]:
[tcp连接序号]:  22
[请求头字段]:   application/x-www-form-urlencoded
[请求头]:       -
[请求头2]:      -
[请求cookie]:   -

nginx 添加站点配置

server 配置 主要配置 响应端口和域名
server {
    listen  80;					# 监听端口
    server_name  www.test.com;	# 监听域名
    # 域名可使用通配符 如
    # server_name  ~^www.(\w+)([a-z]+)\.com;
    # 响应以 www 开头. +任意字符 + 任意字母 + .com
}
通配符说明

正则

说明

^

匹配搜索字符串开始位置

$

匹配搜索字符串结束位置

.

匹配除换行\n 之外的任何单个字符

\

转义字符,将下一个字符标记为特殊字符

xyz

字符集,与任意一个指定字符匹配

a-z 字符范围,匹配指定范围内的任何字符

\w

与以下任意字符匹配 A-Z a-z 0-9 和下划线 等下于[A-Za-z0-9]

\d

数字字符匹配,等效于[0-9]

{n}

正好匹配n次

{n.}

至少匹配n次

{n,m}

匹配至少n次至多m次

*

零次或多次等下于{0.}

+

一次或多次,等下于{1,}

?

零次或一次,等效于{0,1}

location 配置 url 规则
vim /etc/nginx/conf.d/xxx.conf
server {
    listen       80;
    server_name  localhost;
    # 只匹配 /abc/ url 访问到对应 abc目录 下所有文件
    location /abc {
        alias /var/www/abc/;
        index index.html;
    }
    # 匹配 以/images 开头的 url 后缀无论是什么都匹配此规则
    location ^~ /images {
        return 666;
    }
    # 匹配任何以  .gif .jpg .jpeg 为结尾的请求
    location ~* \.(gif|jpg|jpeg)$ {
        return 777;
    }
    # 匹配根
    location / {
        root /var/www/xxx/;
        index index.html;
    }
}

location 下 root 响应的路径:配置的路径(root指向的路径)+完整访问路径(location的路径)+静态文件
alias 响应的路径:配置路径+静态文件(去除location中配置的路径)
匹配顺序 = 大于 ^~ 大于 ||!|! 大于 /

响应请求 方法
  1. return 直接返回 code 码
server {
    listen       81;
    server_name  localhost;
    location /error {
    	return 404
    }    
}
# 测试
curl -v 127.0.0.1:81/error
*   Trying 127.0.0.1:81...
* Connected to 127.0.0.1 (127.0.0.1) port 81 (#0)
> GET /error HTTP/1.1
> Host: 127.0.0.1:81
> User-Agent: curl/7.74.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 404
< Server: nginx/1.23.3
< Date: Tue, 31 Jan 2023 03:53:31 GMT
< Content-Length: 0
< Connection: keep-alive
<
* Connection #0 to host 127.0.0.1 left intact
  1. root alias 静态页面响应
server {
    listen       81;
    server_name  localhost;
    location /test {
        root /var/www/;
        index index.html;
    }
    # curl 127.0.0.1:81/test 实际访问的是 /var/www/test/index.html 文件
    location /test1 {
        alias /var/www/;
        index index.html;
    }
    # curl 127.0.0.1:81/test 实际访问的是 /var/www/index.html 文件
}
# root alias 区别  root 会将 location 内容添加到 root 后 alias不会
  1. rewrite 重定向
server {
    listen       81;
    server_name  localhost;
    location /666/ {
       rewrite ^(/666/.*)/333/(\w+).*? /test last;
       rewrite ^/666/(.*)$ /test1 last
       return 777
    }
    # 设置重定向 有两个规则以 location url 为开头 匹配后面的url内容
    # rewrite 有两个参数 第一个参数为匹配规则 第二个参数为重定向到 的url 第三个参数为可选参数说明如何转发
}
# 测试
# 说明以/666/开头 /任意/333/任意字符
curl -v 127.0.0.1:81/666/qwe/333/x.sss
curl -v 127.0.0.1:81/666/asfx
  1. proxy_pass
server {
    listen       81;
    server_name  localhost;
	location /proxy {
	    # 传递请求头
	    proxy_set_header Host $host;
	    proxy_set_header X-Real-IP $remote_addr;
	    # 代理请求
		proxy_pass http://localhost:80;
	}
}
  1. php 页面处理 或将请求转发给其他服务器
server {
    listen       81;
    server_name  localhost;
	location ~ \.php {
	    fastcgi_pass localhost:8000;
		# 启动php 8000端口 响应php请求
		# fastcgi_pass将请求传递给 FastCGI 服务器
		# uwsgi_pass将请求传递给 uwsgi 服务器
		# scgi_pass将请求传递给 SCGI 服务器
		# memcached_pass将请求传递给 memcached 服务器
}
反向代理
upstream backend {
	# 可添加以下调度规则
	# ip_hash; IP哈希
	# least_conn; 最少的活动连接数
	# least_time=header; (NGINX Plus) – 从服务器接收响应头的最短平均时间 ( $upstream_header_time)
	# least_time=last_byte; (NGINX Plus) – 从服务器接收完整响应的最短平均时间 ( $upstream_response_time)
	# sticky cookie srv_id expires=1h domain=.example.com path=/; 首次方向保持下次访问还是相同后端
    server backend1.example.com weight=5;
    server backend2.example.com;
    server 192.0.0.1 backup down; # 后缀加down后 不可用
}
server {
   listen 81;
   location /upstream {
      proxy_pass http://backend;
   }
}

nginx 查看日志 和 打印各种变量

server {
    listen 83;
    log_format nginx_fmt1 '$remote_addr - $remote_user [$time_local] "$request"'
		'$status $body_bytes_sent "$http_referer"'
		'"$http_user_agent" "$http_x_forwarded_for"'
		'$server_name:$server_port';
}
# 默认日志格式 
14.116.152.103 - - [31/Jan/2023:07:52:06 +0000] "GET / HTTP/1.1" 200 11 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1" "-"
访问地址 - 用户(一般为空)- [请求时间] " 请求方式/请求版本  请求返回结果状态 返回字节 http_referer 请求端使用浏览器内核 转发来自 转发服务:端口
  • 自定义日志格式
log_format nginx_fmt2 '[访问地址]:$remote_addr
[访问用户]$remote_user
[时间]:$time_local
[请求方式]:$request
[状态]:$status
[请求跳转来源]:$http_referer
[给客户端发送的字节数]:$body_bytes_sent
[客户端]:$http_user_agent
[请求参数args]:$args
[请求参数query_string]:$query_string
[请求中参数是否为空]:$is_args
[uri]:$document_uri
[主机名]:$host
[tcp连接序号]:$connection
[请求头字段]:$content_type
[请求头]:$http_NAME
[请求cookie]:$http_cookie';

server {
    listen 81;
    access_log /var/log/nginx/81access.log nginx_fmt2;
}
# nginx 变量可以参考

nginx 根据head头进行转发

在某些业务场景中需要 进行灰度更新 或根据head头 转发

upstream backend1 {
    server 192.168.1.1:8080
}
upstream backend2 {
    server 192.168.1.2:8080
}
server {
    listen 82;
    set $group "backend1"
    if ($http_my_header = "test") {
        set $group "backend2"
        # sent_http_my_header = "tmp"
    }
    location / {
        proxy_pass http://$group;
    }
}
# 当请求 header 头 包含 my_header = test 使 返回 backend1 否则返回backend2
# 测试
curl 127.0.0.1:82
curl -H "my-header:test" 127.0.0.1:82

实际工作中也可以按照 上述思路 对其他 nginx 可以获取到的变量进行 if 判断 分流转发

其他

nginx 均有 压缩和缓存功能 详细可参考官方文档

SSL证书到期,替换nginx证书方法

SSL证书可确保网站时可信的数据传输时通过加密的一种技术

证书到期可能影响用户访问提示网站不安全,需要通过TLS进行传输加密的业务不可用

提供web服务的应用一般需要配置SSL 证书,可使用户正常访问提示连接是安全的

nginx做维护页面_nginx做维护页面_02

证书申请

相关平台申请证书
申请完毕后下载nginx 相关的证书文件 两个文件 xxxx.pem xxxx.key
并将下载下载的文件放到nginx服务器上

nginx配置

将下载下来的 pem 文件和 key 文件放到 nginx 目录下 sshkey 里
nginx 配置文件进行如下配置

server {
        listen      443;
        listen      80;
        server_name xxxxx.cn;
        access_log  logs/sso_prod_access.log  main;
        error_log   logs/sso_prod_error.log;
        ssl on;
        ssl_certificate      /usr/local/nginx/sslkey/xxxxxx.pem;
        ssl_certificate_key  /usr/local/nginx/sslkey/xxxxxx.key;

    }

完成