• 企业化运维(2)_nginx


    ###1.nginx源码安装部署###

    ###2.平滑升级### 

    (1)版本升级

    当服务器在运行时,需要升级的情况下,平滑升级即就是不断开服务器就可以进行升级,最大限度保证数据的完整性。

    下载nginx新版本软件,正常执行./configure和make但不要执行make install。

    备份原程序:

    1. cd /usr/local/lnmp/nginx/sbin
    2. cp nginx nginx.old 

     拷贝新程序:

    1. cd nginx-1.23.1/objs
    2. cp -f nginx /usr/local/lnmp/nginx/sbin

     获取当前nginx主进程pid,即master进程:

    1. ps ax|grep nginx
    2. 29636 ? Ss 0:00 nginx: master process nginx
    3. 29637 ? S 0:00 nginx: worker process
    4. 29638 ? S 0:00 nginx: worker process
    升级新程序,开启新版本:
    1. kill -USR2 29636
    2. ps ax|grep nginx
    3. 29636 ? Ss 0:00 nginx: master process nginx
    4. 29637 ? S 0:00 nginx: worker process
    5. 29638 ? S 0:00 nginx: worker process
    6. 29761 ? S 0:00 nginx: master process nginx
    7. 29762 ? S 0:00 nginx: worker process
    8. 29763 ? S 0:00 nginx: worker process

    关闭原worker进程但保留主进程master,为了回退

    1. kill -WINCH 29636
    2. ps ax|grep nginx
    3. 29636 ? Ss 0:00 nginx: master process nginx
    4. 29761 ? S 0:00 nginx: master process nginx
    5. 29762 ? S 0:00 nginx: worker process
    6. 29763 ? S 0:00 nginx: worker process

    因为有时候我们会发现新版本并没有旧版本用着顺手,那么关闭worker进程但保留主进程就是为了回退,即就是关闭工作端worker,保留master。 

    (2)版本回退

    回退的过程是相反的,先还原nginx程序,唤醒原进程,回收新版本,并且关闭。

    1. 还原nginx程序:
    2. # cp -f nginx.old nginx
    3. 唤醒原进程:
    4. # kill -HUP 29636
    5. 回收新版本的worker进程:
    6. kill -WINCH 29761
    7. 关闭新版本主进程:
    8. kill -QUIT 29761 

    ###3.负载均衡+反向代理### 

    (1)默认轮询

    ①修改nginx服务启动用户

    1. [root@server1 conf]# useradd -M -d /usr/local/nginx/ -s /sbin/nologin nginx
    2. [root@server1 ~]# cd /usr/local/nginx/conf/
    3. [root@server1 conf]# vim nginx.conf
    4. user nginx;
    5. ...
    6. [root@server1 conf]# nginx -s reload
    7. [root@server1 conf]# ps axu |grep nginx
    8. root 19100 0.0 0.0 46020 2000 ? Ss 16:13 0:00 nginx: master process nginx
    9. nginx 19279 0.0 0.1 46452 2036 ? S 17:24 0:00 nginx: worker process

    ②nginx进程与cpu核心绑定

    推荐设置:nginx进程数量与cpu和核心数一致

    1. [root@server1 conf]# vim nginx.conf
    2. user nginx;
    3. worker_processes 2;
    4. worker_cpu_affinity 01 10; ##如果上边是3,则此处为001 010 100
    5. ...
    6. [root@server1 conf]# nginx -s reload
    7. [root@server1 conf]# ps axu |grep nginx
    8. root 19100 0.0 0.0 46020 2000 ? Ss 16:13 0:00 nginx: master process nginx
    9. nginx 19279 0.0 0.1 46452 2036 ? S 17:24 0:00 nginx: worker process
    10. nginx 19280 0.0 0.1 46452 2036 ? S 17:24 0:00 nginx: worker process

    ③修改nginx并发连接数 

    1. [root@server1 conf]# vim nginx.conf
    2. ...
    3. events {
    4. worker_connections 65535;
    5. }
    6. 修改系统限制
    7. [root@server1 conf]# vim /etc/security/limits.conf
    8. nginx - nofile 65535
    9. 内核参数是根据本机物理资源自动配置的,一般不需要修改
    10. [root@server1 conf]# sysctl fs.file-max
    11. fs.file-max = 197384


    ④负载均衡设置 

    1. 文档:https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/
    2. [root@server1 conf]# vim nginx.conf
    3. ...
    4. http {
    5. upstream westos {
    6. server 192.168.56.12;
    7. server 192.168.56.13:8080;
    8. server 192.168.56.11:8080 backup;
    9. }
    10. ...
    11. server {
    12. listen 80;
    13. server_name localhost;
    14. location / {
    15. #root html;
    16. #index index.html index.htm;
    17. proxy_pass http://westos;
    18. }
    19. ...
    20. [root@server1 conf]# nginx -s reload

    ⑤nginx对后端自带健康检测(backup)

    (2)改变权重,默认为1

    server1主机中修改配置文件,增加server2主机的权重,检测语法,重启服务。

    1. ###server1------改变权重
    2. cd /usr/local/nginx/conf/
    3. vim nginx.conf
    4. ///
    5. http {
    6. upstream westos {
    7. server 172.25.24.2:80 weight=2; ##增加权重
    8. ///
    9. nginx -t
    10. nginx -s reload

     

    (3)ip_hash

    ip_hash表示来自同一客户端的请求,将会发往同一个后端服务器

    ip_hash对后端做健康检测,如果server3出问题,则调度server2
    如果后端全挂,则http报错502(500表示服务器错误)
    在server1主机中修改配置文件,在负载均衡模块中添加ip_hash,检测语法,重启服务。

    ip_hash算法不支持backup

    1. vim nginx.conf
    2. ///
    3. http {
    4. upstream westos {
    5. ip_hash;
    6. ///
    7. nginx -t
    8. nginx -s reload

     

    (4)基于cookie

    基于cookie能够区分客户端来源,测试时只能在浏览器中进行

    1. 先停止nginx服务
    2. [root@server1 conf]# nginx -s stop
    3. [root@server1 ~]# yum install -y unzip
    4. [root@server1 ~]# unzip nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip
    5. [root@server1 ~]# cd nginx-1.22.1/
    6. [root@server1 nginx-1.22.1]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --add-module=/root/nginx-goodies-nginx-sticky-module-ng-08a395c66e42
    7. [root@server1 nginx-1.22.1]# make
    8. [root@server1 nginx-1.22.1]# \cp -f objs/nginx /usr/local/nginx/sbin/nginx
    9. [root@server1 objs]# cd /usr/local/nginx/conf/
    10. [root@server1 conf]# vim nginx.conf
    11. ...
    12. upstream westos {
    13. #ip_hash;
    14. sticky;
    15. server 192.168.56.12 weight=2;
    16. server 192.168.56.13:8080;
    17. #server 192.168.56.11:8080 backup;
    18. }
    19. 检测语法
    20. [root@server1 conf]# nginx -t
    21. nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
    22. nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
    23. 启动服务
    24. [root@server1 conf]# nginx
    25. 使用浏览器测试 按F12可以查看cookie值

    ###4.安全控制###

    (1)基于域名的虚拟主机

    1. [root@server1 nginx]# mkdir /www1/
    2. [root@server1 nginx]# echo web1 > /www1/index.html
    3. [root@server1 nginx]# vim conf/nginx.conf
    4. http {
    5. ...
    6. server {
    7. listen 80;
    8. server_name www1.westos.org;
    9. location / {
    10. root /www1;
    11. index index.html;
    12. }
    13. }
    14. }
    15. [root@server1 nginx]# nginx -s reload

    1. 测试
    2. [root@server4 ~]# vim /etc/hosts
    3. 192.168.56.11 server1 www1.westos.org
    4. [root@server4 ~]# curl www1.westos.org
    5. web1

    (2)限制并发连接数

    1. 建立目录用于存放实验素材
    2. [root@server1 nginx]# cd html/
    3. [root@server1 html]# mkdir download
    4. [root@server1 ~]# cp vim.jpg /usr/local/nginx/html/download/

    1. [root@server1 nginx]# vim conf/nginx.conf
    2. http {
    3. ...
    4. limit_conn_zone $binary_remote_addr zone=addr:10m;
    5. server {
    6. ...
    7. location / {
    8. root html;
    9. index index.html index.htm;
    10. #proxy_pass http://westos;
    11. }
    12. location /download/ {
    13. limit_conn addr 1;
    14. }
    15. }
    16. }
    17. [root@server1 nginx]# nginx -s reload

    1. 必须单线程下载,超出的并发连接会失败
    2. 测试:
    3. [root@server4 ~]# ab -c 10 -n 10 http://192.168.56.11/download/vim.jpg
    4. 查看日志
    5. [root@server1 nginx]# cat logs/access.log

    (3)限制请求数

    1. [root@server1 nginx]# vim conf/nginx.conf
    2. http {
    3. ...
    4. limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    5. server {
    6. location /download/ {
    7. limit_conn addr 1;
    8. limit_req zone=one burst=5 nodelay;
    9. }
    10. }
    11. }
    12. [root@server1 nginx]# nginx -s reload

    1. 测试
    2. [root@server4 ~]# ab -c 1 -n 10 http://192.168.56.11/download/vim.jpg
    3. 查看日志
    4. [root@server1 ~]# cat /usr/local/nginx/logs/access.log

    (4)限制速率

    1. [root@server1 nginx]# vim conf/nginx.conf
    2. http {
    3. ...
    4. server {
    5. location /download/ {
    6. limit_conn addr 1;
    7. limit_rate 100k;
    8. }
    9. }
    10. }
    11. [root@server1 nginx]# nginx -s reload

    1. 测试
    2. [root@server4 ~]# ab -c 1 -n 5 http://192.168.56.11/download/vim.jpg
    3. 查看日志
    4. [root@server1 ~]# cat /usr/local/nginx/logs/access.log


    ###5.nginx基础配置###

    (1)https配置

    1. 生成https证书
    2. [root@server1 conf]# cd /etc/pki/tls/certs
    3. [root@server1 certs]# make cert.pem
    4. [root@server1 certs]# mv cert.pem /usr/local/nginx/conf/
    1. 修改配置文件
    2. [root@server1 conf]# vim nginx.conf
    3. # HTTPS server
    4. #
    5. server {
    6. listen 443 ssl;
    7. server_name www1.westos.org;
    8. ssl_certificate cert.pem;
    9. ssl_certificate_key cert.pem;
    10. ssl_session_cache shared:SSL:1m;
    11. ssl_session_timeout 5m;
    12. ssl_ciphers HIGH:!aNULL:!MD5;
    13. ssl_prefer_server_ciphers on;
    14. location / {
    15. root /www1;
    16. index index.html index.htm;
    17. }
    18. }

    1. 测试
    2. [root@server1 conf]# nginx -t
    3. [root@server1 conf]# nginx -s reload
    4. [root@server4 ~]# curl -k https://www1.westos.org
    5. web1

    (2)自动索引

    可以在浏览器访问,下载软件更方便。
    在配置文件中设定自动索引,注意注释上文参数设定,重启服务。

    1. vim nginx.conf
    2. ///
    3. location /download/ {
    4. limit_conn addr 1;
    5. #limit_req zone=one burst=5 nodelay;
    6. #limit_rate 50k; ##注释
    7. autoindex.on;
    8. ///
    9. nginx -s reload

    1. 测试:在浏览器访问
    2. http://192.168.76.11/download

    (3)nginx empire缓存配置

    nginx默认可以做缓存服务器。缓存可以降低网站带宽,加速用户访问。
    编辑配置文件,设定对图片等进行缓存,缓存时间为1年,在此期间访问就会减少访问时间。

    1. vim nginx.conf
    2. ///
    3. location /download/ {
    4. limit_conn addr 1;
    5. #limit_req zone=one burst=5 nodelay;
    6. #limit_rate 50k;
    7. autoindex on;
    8. } ##在此位置下方进行设定
    9. location ~ .*\.(gif|jpg|png)$ { ##对图片等进行缓存
    10. expires 365d;
    11. root html;
    12. }
    13. ///
    14. nginx -s reload

    1. 测试
    2. curl -I 192.168.76.11/download/vim.jpg
    3. ///Expires: Thu, 13 Jun 2025 04:53:01 GMT

    (4)禁用不必要的日志记录,以节省磁盘IO的消耗 

    1. cd conf/
    2. vim nginx.conf
    3. ///
    4. location ~ .*\.(gif|jpg|png)$ {
    5. expires 365d;
    6. root html;
    7. } ##在这个位置的下面加入设定
    8. location /status {
    9. stub_status on;
    10. access_log off;
    11. }
    12. ///
    13. nginx -t
    14. nginx -s reload

    1. 在浏览器访问
    2. 192.168.76.11/status ##刷新会增加访问次数,但不会有日志生成
    3. cd ../logs
    4. ls
    5. cat access.log ##为空

    (5)站点限制

    在配置文件中设定指定目录只能本机访问,拒绝其他所有请求。

    1. cd conf/
    2. vim nginx.conf
    3. ///
    4. location /status {
    5. stub_status on;
    6. access_log off;
    7. allow 127.0.0.1;
    8. deny all;
    9. }
    10. ///
    11. nginx -t
    12. nginx -s reload

    1. 测试:
    2. 真机浏览器中访问http://192.168.76.11/status
    3. ##403报错拒绝访问
    4. server4测试机curl 192.168.76.11/status
    5. ##403报错拒绝访问

    (6)中文乱码

    nginx默认不支持中文字符,在浏览器访问时,中文会变成乱码。
    在nginx发布文件中加入一行中文,在浏览器中访问为乱码。

    1. cd ..(nginx)
    2. cd html/
    3. vim index.html
    4. ///
    5. 你好
    6. ///
    7. #在浏览器访问时中文是乱码

    编辑配置文件,设定nginx支持中文字符,并重启服务。

    1. vim nginx.conf
    2. ///
    3. server {
    4. listen 80;
    5. server_name localhost;
    6. charset utf-8;
    7. ///
    8. nginx -s reload

    (7)日志轮询

    编写一个脚本,设定打开nginx时会生成日志文件,命名格式为前一天。

    1. [root@server1 ~]# vim /opt/nginx_log.sh
    2. #!/bin/bash
    3. cd /usr/local/nginx/logs && mv access.log access_$(date +%F -d -1day).log
    4. kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`

    给脚本执行权限,执行脚本,切入到日志目录,产生日志。 

    1. [root@server1 ~]# chmod +x /opt/nginx_log.sh
    2. [root@server1 ~]# /opt/nginx_log.sh
    3. [root@server1 ~]# cd /usr/local/nginx/logs/
    4. [root@server1 logs]# ls
    5. access_2023-02-21.log ##生成日志

    再加入crontab定时任务

    1. crontab -e
    2. 00 00 * * * /opt/nginx_log.sh
    3. crontab -l 执行

    (8)重定向

    ①端口重定向

    编辑配置文件,将80端口定向到443端口。

    1. [root@server1 conf]# vim nginx.conf
    2. ...
    3. server {
    4. listen 80;
    5. server_name www1.westos.org;
    6. rewrite ^/(.*)$ https://www1.westos.org/$1 permanent;
    7. location / {
    8. root /www1;
    9. index index.html;
    10. }
    11. }
    12. ...
    13. [root@server1 conf]# nginx -s reload

    ②虚拟主机重定向

    www1.westos.org >> bbs.westos.org

    1. cd ..(nginx)
    2. cd html
    3. mkdir bbs
    4. mv bbs/ /
    5. vim nginx.conf
    6. ///
    7. server {
    8. listen 80;
    9. server_name www.westos.org;
    10. #rewrite ^/(.*)$ https://www.westos.org/$1 permanent;
    11. rewrite ^/bbs$ http://bbs.westos.org permanent;
    12. ##^/bbs$表示匹配以/开头,bbs结尾,,比如www.westos.org/bbs,如果后加其他url,则不能重定向
    13. rewrite ^/(.*)$ http://bbs.westos.org/$1 permanent;
    14. ##^/(.*)$表示匹配以/开头,$结尾,后面可以加url,比如www.westos.org/bbs/bbs.html
    15. }
    16. server {
    17. listen 80;
    18. server_name bbs.westos.org;
    19. location / {
    20. root /bbs;
    21. index index.html;
    22. }
    23. }
    24. ///
    25. nginx -s reload

    1. 测试:用curl命令查看
    2. curl -I www1.westos.org/bbs/
    3. curl -I www1.westos.org/bbs/bbs.html

    (9)防盗链

    配置server2上的apache服务,server2中编辑一发布文件,写入访问该文件时,盗取server1主机中的某一图片

    1. [root@server2 ~]# cd /var/www/html/
    2. [root@server2 html]# vim index.html
    3. <html>
    4. <body>
    5. <img src="http://www1.westos.org/vim.jpg"/>
    6. </body>
    7. </html>

    配置nginx网页防盗链

    1. [root@server1 conf]# vim nginx.conf
    2. ...
    3. location ~ \.(jpg|png)$ {
    4. root /www1;
    5. valid_referers none blocked www1.westos.org;
    6. if ($invalid_referer) {
    7. #return 403;
    8. rewrite ^/ http://bbs.westos.org/daolian.jpg;
    9. }
    10. }
    11. [root@server1 conf]# nginx -s reload

    1. 测试:
    2. 要显示图片,要在测试机server4中安装图形
    3. 192.168.76.11/index.html-->指定图片

  • 相关阅读:
    leetcode每天5题-Day32
    Windows内核--HAL在抽象什么?(3.4)
    数据抓取使用爬虫ip常见问题解决方法
    可解释的图像分类,提高组织表征的可信度论文速读
    Blazor 拖放上传文件转换格式并推送到浏览器下载
    【浅学Java】多线程进阶
    AI人工智能大模型业务到底有多烧钱?
    计算机毕业设计ssm电商后台管理系统tgm41系统+程序+源码+lw+远程部署
    【数据分享】2008-2022年全国范围逐年NO2栅格数据(免费获取)
    pytorch 笔记:validation ,model.eval V.S torch.no_grad
  • 原文地址:https://blog.csdn.net/weixin_46927961/article/details/139473906