运维常用服务 nginx
概述
Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。
在 项目中nginx 经常被作为反向代理服务器使用
一般项目架构流程图
安装&启动
- 安装
# yum安装
yum -y install nginx
# 也可以去官网下载源码安装 源码包可以安装部分模块自定义位置相比yum安装方便扩展
- 启动
# 启动nginx 服务
systemctl restart nginx
# nginx检查配置是否正确
nginx -t
# 重新加载配置
nginx -s reload
# 停止nginx
systemctl stop nginx
# 强制停止nginx
pkill -9 nginx
- 配置
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中配置的路径)
匹配顺序 = 大于 ^~ 大于 ||!|! 大于 /
响应请求 方法
- 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
- 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不会
- 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
- 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;
}
}
- 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 均有 压缩和缓存功能 详细可参考官方文档
- 压缩
https://docs.nginx.com/nginx/admin-guide/web-server/compression/ - 缓存
https://docs.nginx.com/nginx/admin-guide/content-cache/content-caching/
SSL证书到期,替换nginx证书方法
SSL证书可确保网站时可信的数据传输时通过加密的一种技术
证书到期可能影响用户访问提示网站不安全,需要通过TLS进行传输加密的业务不可用
提供web服务的应用一般需要配置SSL 证书,可使用户正常访问提示连接是安全的
证书申请
相关平台申请证书
申请完毕后下载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;
}
完成