运维常用服务 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 均有 压缩和缓存功能 详细可参考官方文档
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;
}
完成