<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title><![CDATA[墨客]]></title> 
<atom:link href="https://thunisoft.wiki/rss.php" rel="self" type="application/rss+xml" />
<description><![CDATA[MOKE]]></description>
<link>https://thunisoft.wiki/</link>
<language>zh-cn</language>

<item>
    <title>本地运行的离线版的AI对话助手可视化界面</title>
    <link>https://thunisoft.wiki/AI1.html</link>
    <description><![CDATA[<pre><code class="language-python">import json
import requests
import threading
import PySimpleGUI as sg
from datetime import datetime
import pyperclip
import os
from pathlib import Path
import re

# 硅基流动 API 配置
SILICONFLOW_API_KEY = "sk-123" #换成自己申请的id
SILICONFLOW_API_URL = "https://api.siliconflow.cn/v1/chat/completions"

class SiliconFlowAI:
    def __init__(self):
        self.session = requests.Session()
        self.headers = {
            "Authorization": f"Bearer {SILICONFLOW_API_KEY}",
            "Content-Type": "application/json"
        }
        self.conversation_history = []
        self.last_prompt = ""

    def _call_api(self, prompt, temperature=0.7, max_tokens=2000, web_search=False, response_style="markdown"):
        messages = self.conversation_history.copy()
        messages.append({"role": "user", "content": prompt})

        data = {
            "model": "deepseek-ai/DeepSeek-R1",
            "messages": messages,
            "temperature": temperature,
            "max_tokens": max_tokens,
            "stream": False,
            "use_web": web_search
        }

        try:
            response = self.session.post(SILICONFLOW_API_URL, headers=self.headers, json=data)
            response.raise_for_status()
            return response.json()
        except requests.RequestException as e:
            print(f"API请求错误: {e}")
            return {"error": str(e)}

    def chat(self, prompt, window, web_search=False, step_by_step=False, response_style="markdown"):
        self.last_prompt = prompt

        # 显示思考过程
        window.write_event_value('-THINKING-', "正在分析您的问题...")

        if step_by_step:
            window.write_event_value('-THINKING-', "我将一步步分析这个问题...")
            style_prompt = {
                "markdown": "请用Markdown格式，逐步分析并回答以下问题",
                "detailed": "请详细地一步步分析以下问题",
                "concise": "请简洁地逐步分析以下问题",
                "txt": "请用纯文本格式逐步分析以下问题"
            }.get(response_style, "请一步步分析以下问题")
            prompt = f"{style_prompt}：\n{prompt}"
        else:
            style_prompt = {
                "markdown": "请用Markdown格式回答以下问题",
                "detailed": "请详细回答以下问题",
                "concise": "请简洁回答以下问题",
                "txt": "请用纯文本格式回答以下问题"
            }.get(response_style, "请回答以下问题")
            prompt = f"{style_prompt}：\n{prompt}"

        # 显示搜索状态
        if web_search:
            window.write_event_value('-THINKING-', "正在联网搜索最新信息...")

        result = self._call_api(prompt, web_search=web_search, response_style=response_style)

        if "error" in result:
            return f"**API错误**: {result['error']}"

        if "choices" in result and result["choices"]:
            response = result["choices"][0].get("message", {}).get("content", "未收到回复")
            self.conversation_history.append({"role": "assistant", "content": response})
            return self._format_response(response, response_style)
        return "**未收到有效回复**"

    def _format_response(self, text, response_style):
        """根据选择的格式处理AI的回答"""
        if response_style == "txt":
            # 移除Markdown格式标记
            text = re.sub(r'[*#_`-]', '', text)
            # 合并多余空行
            text = re.sub(r'\n{3,}', '\n\n', text)
        else:
            text = text.replace("\n\n", "\n \n")  # 保留段间距
        return text.strip()

class SiliconFlowGUI:
    def __init__(self):
        self.ai = SiliconFlowAI()
        self.last_response = ""
        self.last_question = ""
        self.export_folder = Path("AI对话记录")
        self.export_folder.mkdir(exist_ok=True)

        self.text_style = {
            'font': ('微软雅黑', 15),
            'background_color': '#FAFAFA',
            'text_color': '#333333'
        }

        self.layout = [
            [sg.Text("AI 专业聊天助手", font=('Helvetica', 20))],
            [sg.Multiline(
                key='-CHAT-',
                expand_x=True,
                expand_y=True,
                **self.text_style,
                disabled=True,
                autoscroll=True,
                reroute_stdout=True
            )],
            [
                sg.Multiline(
                    key='-INPUT-',
                    expand_x=True,
                    size=(None, 5),
                    **self.text_style,
                    enable_events=True,
                    enter_submits=True,
                    right_click_menu=['&amp;Right', ['粘贴', '清空']]
                ),
                sg.Button('发送', key='-SEND-', size=(8, 2)),
                sg.Button('粘贴', key='-PASTE-', size=(8, 2), tooltip="从剪贴板粘贴内容")
            ],
            [
                sg.Button('复制回答', key='-COPY-', size=(10, 1)),
                sg.Button('复制问题', key='-COPY_QUESTION-', size=(10, 1)),
                sg.Button('导出TXT', key='-EXPORT-', size=(10, 1), tooltip="导出当前对话为文本文件"),
                sg.Button('重新生成', key='-REGEN-', size=(10, 1)),
                sg.Button('清除历史', key='-CLEAR-', size=(10, 1))
            ],
            [
                sg.Checkbox('联网搜索', key='-WEB-', tooltip="启用网络搜索获取最新信息"),
                sg.Checkbox('深度思考', key='-STEP-', tooltip="显示逐步分析过程"),
                sg.Combo(
                    ['精简', '详细', 'Markdown', 'TXT'],
                    default_value='TXT',
                    key='-FORMAT-',
                    size=(8, 1),
                    tooltip="选择回答格式"
                ),
                sg.Button('退出', key='-EXIT-', size=(8, 1)),
                sg.Text('状态: 就绪', size=(20, 1), key='-STATUS-', text_color='green')
            ]
        ]

        self.window = sg.Window(
            "AI 专业聊天助手",
            self.layout,
            finalize=True,
            resizable=True,
            size=(1100, 750),
            margins=(10, 10),
            element_justification='center'
        )

        self.window.TKroot.minsize(850, 550)
        self.window['-INPUT-'].bind("&lt;Return&gt;", "_Enter")
        self.window['-INPUT-'].set_focus()

        # 添加快捷键
        self.window.bind('&lt;Control-v&gt;', '-PASTE-')
        self.window.bind('&lt;Control-V&gt;', '-PASTE-')

        self.print_chat("系统", "欢迎使用AI聊天助手，请输入您的问题")

    def print_chat(self, sender, message, is_error=False, is_thinking=False):
        timestamp = datetime.now().strftime("%H:%M:%S")
        chat = self.window['-CHAT-']
        current = chat.get()

        if sender == "你":
            formatted = f"\n【{timestamp}】💬 你:\n{message}\n\n"
            self.last_question = message
        elif sender == "AI":
            formatted = f"\n【{timestamp}】🤖 AI:\n{message.strip()}\n\n"
            self.last_response = message
        elif is_thinking:
            formatted = f"\n【{timestamp}】🤔 思考中...\n{message}\n\n"
        else:
            color = "red" if is_error else "blue"
            formatted = f"\n【{timestamp}】⚠️ {sender}:\n{message}\n\n"

        chat.update(current + formatted, autoscroll=True)
        self.window.refresh()

    def export_to_txt(self):
        """导出对话历史为TXT文件"""
        try:
            content = self.window['-CHAT-'].get()
            if not content.strip():
                self.print_chat("系统", "没有可导出的对话内容", is_error=True)
                return

            timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
            filename = f"AI对话_{timestamp}.txt"
            filepath = self.export_folder / filename

            # 清理内容格式
            clean_content = re.sub(r'\n{3,}', '\n\n', content)

            with open(filepath, 'w', encoding='utf-8') as f:
                f.write("=== AI对话记录 ===\n\n")
                f.write(clean_content)
                f.write("\n\n=== 结束 ===")

            self.print_chat("系统", f"对话已导出到: {filepath}")
            self.window['-STATUS-'].update('状态: 导出成功', text_color='blue')

            # 询问用户是否要打开文件
            if sg.popup_yes_no('导出成功，是否要打开文件?', title='导出完成') == 'Yes':
                os.startfile(filepath)
        except Exception as e:
            self.print_chat("系统", f"导出失败: {str(e)}", is_error=True)
            self.window['-STATUS-'].update('状态: 导出失败', text_color='red')

    def chat_with_ai(self, values):
        question = values['-INPUT-'].strip()
        if not question:
            self.print_chat("系统", "问题不能为空!", is_error=True)
            return

        self._disable_buttons()
        self.print_chat("你", question)
        self.window['-INPUT-'].update('')
        self.window['-STATUS-'].update('状态: 思考中...', text_color='orange')

        format_map = {'精简': 'concise', '详细': 'detailed', 'Markdown': 'markdown', 'TXT': 'txt'}
        response_format = format_map.get(values['-FORMAT-'], 'markdown')

        threading.Thread(
            target=self._get_ai_response,
            args=(question, values['-WEB-'], values['-STEP-'], response_format),
            daemon=True
        ).start()

    def _disable_buttons(self):
        """禁用所有操作按钮"""
        for btn in ['-SEND-', '-REGEN-', '-COPY-', '-COPY_QUESTION-', '-PASTE-', '-EXPORT-']:
            self.window[btn].update(disabled=True)

    def _enable_buttons(self):
        """启用所有操作按钮"""
        for btn in ['-SEND-', '-REGEN-', '-COPY-', '-COPY_QUESTION-', '-PASTE-', '-EXPORT-']:
            self.window[btn].update(disabled=False)

    def _get_ai_response(self, question, web_search, step_by_step, format_style):
        """获取AI响应并在完成后处理"""
        try:
            response = self.ai.chat(question, self.window, web_search, step_by_step, format_style)
            self.window.write_event_value('-AI_RESPONSE-', response)
        except Exception as e:
            self.window.write_event_value('-AI_ERROR-', str(e))

    def run(self):
        """主事件循环"""
        while True:
            event, values = self.window.read()

            if event in (None, '-EXIT-'):
                break

            elif event in ('-SEND-', '-INPUT-_Enter'):
                self.chat_with_ai(values)

            elif event == '-THINKING-':
                self.print_chat("AI", values[event], is_thinking=True)

            elif event == '-AI_RESPONSE-':
                self.print_chat("AI", values[event])
                self._enable_buttons()
                self.window['-STATUS-'].update('状态: 就绪', text_color='green')

            elif event == '-AI_ERROR-':
                self.print_chat("系统", f"发生错误: {values[event]}", is_error=True)
                self._enable_buttons()
                self.window['-STATUS-'].update('状态: 错误', text_color='red')

            elif event == '-CLEAR-':
                self.ai.conversation_history = []
                self.window['-CHAT-'].update('')
                self.print_chat("系统", "对话历史已清空")

            elif event == '-COPY-':
                if self.last_response:
                    pyperclip.copy(self.last_response)
                    self.window['-STATUS-'].update('状态: 已复制回答', text_color='blue')
                else:
                    self.print_chat("系统", "没有可复制的回答", is_error=True)

            elif event == '-COPY_QUESTION-':
                if self.last_question:
                    pyperclip.copy(self.last_question)
                    self.window['-STATUS-'].update('状态: 已复制问题', text_color='blue')
                else:
                    self.print_chat("系统", "没有可复制的问题", is_error=True)

            elif event == '-EXPORT-':
                self.export_to_txt()

            elif event == '-REGEN-':
                if not self.ai.last_prompt:
                    self.print_chat("系统", "没有可重新生成的问题", is_error=True)
                    continue

                self._disable_buttons()
                self.window['-STATUS-'].update('状态: 重新生成中...', text_color='orange')
                self.print_chat("系统", f"正在重新生成: {self.ai.last_prompt[:50]}...")

                format_map = {'精简': 'concise', '详细': 'detailed', 'Markdown': 'markdown', 'TXT': 'txt'}
                response_format = format_map.get(values['-FORMAT-'], 'markdown')

                threading.Thread(
                    target=self._get_ai_response,
                    args=(self.ai.last_prompt, values['-WEB-'], values['-STEP-'], response_format),
                    daemon=True
                ).start()

            elif event == '-PASTE-':
                try:
                    clipboard_text = pyperclip.paste()
                    if clipboard_text:
                        current_input = values['-INPUT-']
                        self.window['-INPUT-'].update(current_input + clipboard_text)
                        self.window['-STATUS-'].update('状态: 已粘贴', text_color='blue')
                    else:
                        self.print_chat("系统", "剪贴板中没有内容", is_error=True)
                except Exception as e:
                    self.print_chat("系统", f"粘贴失败: {str(e)}", is_error=True)

            elif event == '粘贴':
                try:
                    clipboard_text = pyperclip.paste()
                    if clipboard_text:
                        self.window['-INPUT-'].update(clipboard_text)
                        self.window['-STATUS-'].update('状态: 已粘贴', text_color='blue')
                except Exception as e:
                    self.print_chat("系统", f"粘贴失败: {str(e)}", is_error=True)

            elif event == '清空':
                self.window['-INPUT-'].update('')

            elif event.startswith('Escape'):
                self.window['-INPUT-'].update('')

        self.window.close()

if __name__ == "__main__":
    if not SILICONFLOW_API_KEY or SILICONFLOW_API_KEY == "sk-your-silicon-flow-api-key":
        sg.popup_error("❌ 错误", "请设置正确的API密钥！", keep_on_top=True)
        exit()

    try:
        app = SiliconFlowGUI()
        app.run()
    except Exception as e:
        sg.popup_error("程序崩溃", f"错误信息: {str(e)}")</code></pre>]]></description>
    <pubDate>Sun, 27 Apr 2025 15:27:22 +0800</pubDate>
    <dc:creator>墨客</dc:creator>
    <guid>https://thunisoft.wiki/AI1.html</guid>
</item>
<item>
    <title>MySQL数据库一键部署脚本</title>
    <link>https://thunisoft.wiki/mysql1.html</link>
    <description><![CDATA[<p>MySQL数据库的一键安装脚本</p>
<pre><code class="language-shell">
#/bin/bash
###############变量名
#安装包
install_page=mysql-5.7.36-el7-x86_64.tar.gz
#解压目录
unzip_path=/data/mysql
#安装路径
install_path=/data
#数据存储目录
data=/data/data
#日志存放目录
logs_file=/data/logs
#mysql密码
mysql_passwd=root@1234
#临时缓存区目录
tmp_path=/data/tmp
#配置文件(方便后续需求更改)
conf=my.cnf
###################################分隔符################################################
#创建用户和组
groupadd -r mysql &amp;&amp; useradd -r -g mysql -s /bin/false -M mysql
#检查是否存在mariadb
rpm -qa | grep mariadb
#这个变量是mariadb的包的名称（各个版本的系统包不一样）
mariadb=`rpm -qa | grep mariadb`
#这个变量是查询包的结果，如果是0则是执行成功，如果是大于0的任何数则为没有包
a=$?
    if [[ $a -eq 0 ]]; then
        echo “有mariadb”
        rpm -e $mariadb --nodeps
    else
        echo "没有mariadb" 
    fi
#检查目录是否存在，不存在则创建
for dirname in {$install_path,$data,$logs_file,$tmp_path,$unzip_path};do
  if [ -d "dirname" ];then
  echo "文件夹存在"
  chown -R mysql:mysql $dirname
  else
  mkdir -p $dirname
  chown -R mysql:mysql $dirname
  fi
done
#解压安装包并重命名
#--strip-components 1 解压出来没有一级目录
tar zxf $install_page -C $unzip_path --strip-components 1
#移动配置文件
if [ -f "/etc/my.cnf" ];then
echo "/etc/my.cnf已存在"
chmod 644 /etc/my.cnf
else
cp -rp $conf /etc/my.cnf
chmod 644 /etc/my.cnf
fi
#无密码初始化
$unzip_path/bin/mysqld --defaults-file=/etc/my.cnf --user=mysql --initialize-insecure
#启动数据库
$unzip_path/support-files/mysql.server start
#为数据库的各种命令做环境变量
echo export MYSQL_HOME=${unzip_path} &gt;&gt; /etc/profile.d/mysqld.sh
echo export PATH=$\MYSQL_HOME/\bin:$\MYSQL_HOME/\lib:$\PATH\ &gt;&gt; /etc/profile.d/mysqld.sh
chmod +x /etc/profile.d/mysqld.sh
source /etc/profile.d/mysqld.sh
#修改可以登录的主机
update_sql="update mysql.user set host = '%' where user = 'root';"
mysql -uroot -e"${update_sql}"
mysql -uroot -e"flush privileges;"
#修改密码
pass_sql="ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '${mysql_passwd}'"
mysql -uroot -e"${pass_sql}"
mysql -uroot -p"${mysql_passwd}" -e"flush privileges;"
#复制MySQL的启动文件
cp -rp $unzip_path/support-files/mysql.server  /etc/init.d/mysql.server</code></pre>
<p>MySQL配置文件（注：配置文件中的文件地址需要更改）</p>
<pre><code class="language-shell">[client]
port = 3306
socket = /tmp/mysql.sock
default-character-set = utf8mb4

[mysqld]
port = 3306
socket = /tmp/mysql.sock
basedir = /data/mysql
datadir = /data/data
pid-file = /data/data/mysql.pid
user = mysql
bind-address = 0.0.0.0
server-id = 1
#导入函数
log-bin-trust-function-creators=1
init-connect = 'SET NAMES utf8mb4'
character-set-server = utf8mb4
skip-name-resolve
#skip-networking
back_log = 300
max_connections = 1000
max_connect_errors = 6000
open_files_limit = 65535
table_open_cache = 128
max_allowed_packet = 500M
binlog_cache_size = 1M
max_heap_table_size = 8M
tmp_table_size = 16M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
sort_buffer_size = 8M
join_buffer_size = 8M
key_buffer_size = 4M
thread_cache_size = 8
query_cache_type = 1
query_cache_size = 8M
query_cache_limit = 2M
ft_min_word_len = 4
log_bin = mysql-bin
binlog_format = mixed
expire_logs_days = 30
log_error = /data/logs/mysql-error.log
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /data/logs/mysql-slow.log
performance_schema = 0
explicit_defaults_for_timestamp
#不区分大小写
lower_case_table_names = 1
skip-external-locking
default_storage_engine = InnoDB
#default-storage-engine = MyISAM
innodb_file_per_table = 1
innodb_open_files = 500
innodb_buffer_pool_size = 64M
innodb_write_io_threads = 4
innodb_read_io_threads = 4
innodb_thread_concurrency = 0
innodb_purge_threads = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 32M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
bulk_insert_buffer_size = 8M
myisam_sort_buffer_size = 8M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
interactive_timeout = 28800
sql_mode= 'IGNORE_SPACE,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'

[mysqldump]
max_allowed_packet = 16M

[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M</code></pre>
<p>源码与安装包下载：<br />
链接：<a href="https://pan.baidu.com/s/1gm_98lfdXKZzQzMxJGZBsg?pwd=4jr3">https://pan.baidu.com/s/1gm_98lfdXKZzQzMxJGZBsg?pwd=4jr3</a><br />
提取码：4jr3</p>]]></description>
    <pubDate>Mon, 31 Mar 2025 16:01:55 +0800</pubDate>
    <dc:creator>墨客</dc:creator>
    <guid>https://thunisoft.wiki/mysql1.html</guid>
</item>
<item>
    <title>二进制部署k8s集群的平滑升级</title>
    <link>https://thunisoft.wiki/K8Spinghuaqianyi.html</link>
    <description><![CDATA[<h1>1、软件包下载</h1>
<p>去github上下载较新的Kubernetes软件包https://github.com/<br />
<img src="https://img2020.cnblogs.com/blog/2334163/202108/2334163-20210802213310142-1246244782.png" alt="img" /><br />
<img src="https://img2020.cnblogs.com/blog/2334163/202108/2334163-20210802213315328-841460518.png" alt="img" /><br />
<img src="https://img2020.cnblogs.com/blog/2334163/202108/2334163-20210802213320333-242093154.png" alt="img" /><br />
<img src="https://img2020.cnblogs.com/blog/2334163/202108/2334163-20210802213334085-1083150895.png" alt="img" /><br />
<img src="https://img2020.cnblogs.com/blog/2334163/202108/2334163-20210802213341566-1238255088.png" alt="img" /><br />
<img src="https://img2020.cnblogs.com/blog/2334163/202108/2334163-20210802213347049-1532868609.png" alt="img" /></p>
<h1>2、升级说明</h1>
<ul>
<li>升级包括master节点升级和node节点的升级，本章升级至v1.15.12；</li>
<li>Master节点的服务包括：apiserver、controller-manager、kube-scheduler；</li>
<li>Node节点的服务包括：kubelet和kube-proxy；</li>
<li>由于apiserver被nginx代理，所以在升级的时候需要操作操作nginx注释升级节点，避免带来无法访问的情况；</li>
<li>我们的master节点和node都是在同一个集群服务器上，所以一起进行操作；</li>
</ul>
<h1>3、确定节点升级顺序</h1>
<p>查看节点信息</p>
<pre><code class="language-sql">[root@hdss7-21 ~]# kubectl get node
NAME                STATUS   ROLES    AGE   VERSION
hdss7-21.host.com   Ready    &lt;none&gt;   14d   v1.14.10
hdss7-22.host.com   Ready    &lt;none&gt;   14d   v1.14.10</code></pre>
<p>查看pod分布状态，尽量选择较少pod的节点先进行迁移</p>
<pre><code class="language-sql">[root@hdss7-21 ~]# kubectl get pod -o wide -n kube-system
NAME                                   READY   STATUS    RESTARTS   AGE   IP           NODE                NOMINATED NODE   READINESS GATES
coredns-64f49f5655-smzzz               1/1     Running   6          8d    172.7.21.4   hdss7-21.host.com   &lt;none&gt;           &lt;none&gt;
kubernetes-dashboard-99ff79fcd-khl8z   1/1     Running   2          4d    172.7.22.4   hdss7-22.host.com   &lt;none&gt;           &lt;none&gt;
traefik-ingress-2svq6                  1/1     Running   3          5d    172.7.21.5   hdss7-21.host.com   &lt;none&gt;           &lt;none&gt;
traefik-ingress-rcd28                  1/1     Running   3          5d    172.7.22.3   hdss7-22.host.com   &lt;none&gt;           &lt;none&gt;</code></pre>
<p>由于分布差不多，我们选择先升级10.4.7.21服务器上的节点</p>
<h1>4、修改代理nginx配置</h1>
<p>在10.4.7.21和22上都操作，以21为例<br />
注释apiserver升级节点的服务器</p>
<pre><code class="language-csharp">[root@hdss7-11 ~]# vim /etc/nginx/nginx.conf
    upstream kube-apiserver {
#        server 10.4.7.21:6443     max_fails=3 fail_timeout=30s;
        server 10.4.7.22:6443     max_fails=3 fail_timeout=30s;
    }
[root@hdss7-11 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@hdss7-11 ~]# nginx -s reload</code></pre>
<h1>5、删除第一个节点</h1>
<p>将节点调成不可调度状态</p>
<pre><code class="language-bash">[root@hdss7-21 ~]#  kubectl cordon hdss7-21.host.com
node/hdss7-21.host.com cordoned</code></pre>
<p>当节点设置成不可调度状态之后，新启动的 pod 不会调度到此节点上，但是该节点上正在运行的 Pod 将不会被影响。<br />
驱逐节点上的pod</p>
<pre><code class="language-bash">[root@hdss7-21 ~]# kubectl drain hdss7-21.host.com --delete-local-data --ignore-daemonsets --force
node/hdss7-21.host.com already cordoned
WARNING: ignoring DaemonSet-managed Pods: default/nginx-ds-2rj9d, kube-system/traefik-ingress-2svq6
evicting pod "coredns-64f49f5655-smzzz"
evicting pod "nginx-dp-86678bb55c-tklvc"
pod/nginx-dp-86678bb55c-tklvc evicted
pod/coredns-64f49f5655-smzzz evicted
node/hdss7-21.host.com evicted</code></pre>
<p>注释：<br />
--delete-local-data 即使pod使用了emptyDir也删除 --ignore-daemonsets 忽略deamonset控制器的pod，如果不忽略，daemonset控制器控制的pod被删除后可能马上又在此节点上启动起来,会成为死循环； --force 不加force参数只会删除该NODE上由ReplicationController, ReplicaSet, DaemonSet,StatefulSet or Job创建的Pod，加了后还会删除'裸奔的pod'(没有绑定到任何replication controller)</p>
<p>再次查看pod分布</p>
<pre><code class="language-sql">[root@hdss7-21 ~]# kubectl get pod -o wide -n kube-system
NAME                                   READY   STATUS    RESTARTS   AGE   IP           NODE                NOMINATED NODE   READINESS GATES
coredns-64f49f5655-n2pl7               1/1     Running   0          39s   172.7.22.7   hdss7-22.host.com   &lt;none&gt;           &lt;none&gt;
kubernetes-dashboard-99ff79fcd-khl8z   1/1     Running   2          4d    172.7.22.4   hdss7-22.host.com   &lt;none&gt;           &lt;none&gt;
traefik-ingress-2svq6                  1/1     Running   3          5d    172.7.21.5   hdss7-21.host.com   &lt;none&gt;           &lt;none&gt;
traefik-ingress-rcd28                  1/1     Running   3          5d    172.7.22.3   hdss7-22.host.com   &lt;none&gt;           &lt;none&gt;</code></pre>
<p>除了daemonset的pod已被移动到10.4.7.22接节点上</p>
<p>测试重新启动的coredns是否生效</p>
<pre><code class="language-css">[root@hdss7-21 ~]# dig -t A nginx-dp.default.svc.cluster.local @192.168.0.2 +short
192.168.191.8</code></pre>
<p>删除节点</p>
<pre><code class="language-perl">[root@hdss7-21 ~]# kubectl delete node hdss7-21.host.com
node "hdss7-21.host.com" deleted</code></pre>
<h1>6、升级第一个节点</h1>
<p>配置新版本</p>
<pre><code class="language-csharp">[root@hdss7-21 ~]# cd /opt/src/
[root@hdss7-21 src]# tar -zxvf kubernetes-server-linux-amd64-v1.15.12.tar.gz
[root@hdss7-21 src]# mv kubernetes /opt/kubernetes-v1.15.12
[root@hdss7-21 src]# cd /opt/kubernetes-v1.15.12/
[root@hdss7-21 kubernetes-v1.15.12]# rm -f kubernetes-src.tar.gz
[root@hdss7-21 kubernetes-v1.15.12]# cd server/bin/
[root@hdss7-21 bin]# rm -f *.tar *_tag
[root@hdss7-21 bin]# ll
总用量 677292
-rwxr-xr-x 1 root root  50581504 6月  16 21:10 apiextensions-apiserver
-rwxr-xr-x 1 root root  44638208 6月  16 21:10 kubeadm
-rwxr-xr-x 1 root root  48525312 6月  16 21:10 kube-aggregator
-rwxr-xr-x 1 root root 122097664 6月  16 21:10 kube-apiserver
-rwxr-xr-x 1 root root 116301824 6月  16 21:10 kube-controller-manager
-rwxr-xr-x 1 root root  46419968 6月  16 21:10 kubectl
-rwxr-xr-x 1 root root  54980712 6月  16 21:10 kubectl-convert
-rwxr-xr-x 1 root root 118151728 6月  16 21:10 kubelet
-rwxr-xr-x 1 root root  43139072 6月  16 21:10 kube-proxy
-rwxr-xr-x 1 root root  47112192 6月  16 21:10 kube-scheduler
-rwxr-xr-x 1 root root   1593344 6月  16 21:10 mounter
[root@hdss7-21 bin]# mkdir certs
[root@hdss7-21 bin]# mkdir /opt/kubernetes-v1.15.12/conf</code></pre>
<p>拷贝证书</p>
<pre><code class="language-vbnet">[root@hdss7-21 bin]# cp /opt/kubernetes/server/bin/certs/* certs/
[root@hdss7-21 bin]# ls certs/
apiserver-key.pem  ca-key.pem  client-key.pem  kubelet-key.pem  kube-proxy-client-key.pem
apiserver.pem      ca.pem      client.pem      kubelet.pem      kube-proxy-client.pem</code></pre>
<p>拷贝服务启动脚本</p>
<pre><code class="language-csharp">[root@hdss7-21 bin]# cp /opt/kubernetes/server/bin/*.sh .
[root@hdss7-21 bin]# ls
apiextensions-apiserver  kube-apiserver                      kubectl             kube-proxy                 mounter
certs                    kube-apiserver-startup.sh           kubectl-convert     kube-proxy-startup.sh
kubeadm                  kube-controller-manager             kubelet             kube-scheduler
kube-aggregator          kube-controller-manager-startup.sh  kubelet-startup.sh  kube-scheduler-startup.sh</code></pre>
<p>拷贝配置文件</p>
<pre><code class="language-csharp">[root@hdss7-21 bin]# cp /opt/kubernetes/conf/* /opt/kubernetes-v1.15.12/conf/
[root@hdss7-21 bin]# ls /opt/kubernetes-v1.15.12/conf/
audit.yaml  k8s-node.yaml  kubelet.kubeconfig  kube-proxy.kubeconfig  nginx-ds.yaml</code></pre>
<p>重新创建软连接</p>
<pre><code class="language-yaml">[root@hdss7-21 bin]# cd /opt/
[root@hdss7-21 opt]# ll
总用量 24
drwx--x--x 4 root root 4096 7月   2 21:50 containerd
lrwxrwxrwx 1 root root   16 6月   8 20:36 etcd -&gt; /opt/etcd-v3.3.1
drwxr-xr-x 5 etcd etcd 4096 7月   9 21:25 etcd-v3.3.1
lrwxrwxrwx 1 root root   20 7月  17 19:40 flannel -&gt; /opt/flannel-v0.11.0
drwxr-xr-x 3 root root 4096 7月  28 20:05 flannel-v0.11.0
lrwxrwxrwx 1 root root   23 7月  10 20:17 kubernetes -&gt; /opt/kubernetes-v1.14.10
drwxr-xr-x 5 root root 4096 7月  10 20:36 kubernetes-v1.14.10
drwxr-xr-x 6 root root 4096 7月  28 22:18 kubernetes-v1.15.12
drwxr-xr-x 2 root root 4096 7月  28 22:10 src
[root@hdss7-21 opt]# rm -rf kubernetes
[root@hdss7-21 opt]# ln -s /opt/kubernetes-v1.15.12 /opt/kubernetes
[root@hdss7-21 opt]# ll
总用量 24
drwx--x--x 4 root root 4096 7月   2 21:50 containerd
lrwxrwxrwx 1 root root   16 6月   8 20:36 etcd -&gt; /opt/etcd-v3.3.1
drwxr-xr-x 5 etcd etcd 4096 7月   9 21:25 etcd-v3.3.1
lrwxrwxrwx 1 root root   20 7月  17 19:40 flannel -&gt; /opt/flannel-v0.11.0
drwxr-xr-x 3 root root 4096 7月  28 20:05 flannel-v0.11.0
lrwxrwxrwx 1 root root   23 7月  28 22:20 kubernetes -&gt; /opt/kubernetes-v1.15.12
drwxr-xr-x 5 root root 4096 7月  10 20:36 kubernetes-v1.14.10
drwxr-xr-x 6 root root 4096 7月  28 22:18 kubernetes-v1.15.12
drwxr-xr-x 2 root root 4096 7月  28 22:10 src</code></pre>
<h1>7、重启节点服务</h1>
<pre><code class="language-bash">[root@hdss7-21 opt]# supervisorctl status
etcd-server-7-21                 RUNNING   pid 6296, uptime 0:16:14
flanneld-7-21                    RUNNING   pid 7042, uptime 0:13:14
kube-apiserver-7-21              RUNNING   pid 7165, uptime 0:12:24
kube-controller-manager-7-21     RUNNING   pid 4675, uptime 0:19:03
kube-kubelet-7-21                RUNNING   pid 7184, uptime 0:12:16
kube-proxy-7-21                  RUNNING   pid 4678, uptime 0:19:03
kube-scheduler-7-21              RUNNING   pid 4673, uptime 0:19:03</code></pre>
<p>重启node节点服务</p>
<pre><code class="language-csharp">[root@hdss7-21 opt]# supervisorctl restart kube-kubelet-7-21
[root@hdss7-21 opt]# supervisorctl restart kube-proxy-7-21</code></pre>
<p>查看版本</p>
<pre><code class="language-sql">[root@hdss7-21 opt]# kubectl get node
NAME                STATUS   ROLES    AGE     VERSION
hdss7-21.host.com   Ready    &lt;none&gt;   4d22h   v1.15.12
hdss7-22.host.com   Ready    &lt;none&gt;   19d     v1.14.10</code></pre>
<p>重启master节点服务</p>
<pre><code class="language-csharp">[root@hdss7-21 opt]# supervisorctl restart kube-apiserver-7-21
[root@hdss7-21 opt]# supervisorctl restart kube-controller-manager-7-21
[root@hdss7-21 opt]# supervisorctl restart kube-scheduler-7-21</code></pre>
<p>注意重启过程中可以查看日志，确保启动无问题。</p>
<h1>8、修改代理nginx配置</h1>
<p>修改11和12配置</p>
<pre><code class="language-csharp">[root@hdss7-11 ~]# vim /etc/nginx/nginx.conf
    upstream kube-apiserver {
        server 10.4.7.21:6443     max_fails=3 fail_timeout=30s;
#        server 10.4.7.22:6443     max_fails=3 fail_timeout=30s;
    }
[root@hdss7-11 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@hdss7-11 ~]# nginx -s reload</code></pre>
<h1>9、升级第二个节点</h1>
<p>按照同样的方法对其余节点进行升级<br />
在10.4.7.22上操作<br />
最后检查服务启动状态和node节点版本</p>
<pre><code class="language-sql">[root@hdss7-22 ~]# supervisorctl status
etcd-server-7-22                 RUNNING   pid 1235, uptime 1:10:58
flanneld-7-22                    RUNNING   pid 1203, uptime 1:10:59
kube-apiserver-7-22              RUNNING   pid 25776, uptime 0:01:39
kube-controller-manager-7-22     RUNNING   pid 26009, uptime 0:01:09
kube-kubelet-7-22                RUNNING   pid 23925, uptime 0:06:08
kube-proxy-7-22                  RUNNING   pid 24142, uptime 0:05:38
kube-scheduler-7-22              RUNNING   pid 26190, uptime 0:00:38
[root@hdss7-22 ~]# kubectl get node
NAME                STATUS   ROLES    AGE     VERSION
hdss7-21.host.com   Ready    &lt;none&gt;   4d22h   v1.15.12
hdss7-22.host.com   Ready    &lt;none&gt;   6m12s   v1.15.12</code></pre>
<h1>10、修改nginx代理</h1>
<p>将配置文件改为原来状态</p>
<pre><code class="language-csharp">[root@hdss7-11 ~]# vim /etc/nginx/nginx.conf
    upstream kube-apiserver {
        server 10.4.7.21:6443     max_fails=3 fail_timeout=30s;
        server 10.4.7.22:6443     max_fails=3 fail_timeout=30s;
    }
[root@hdss7-11 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@hdss7-11 ~]# nginx -s reload</code></pre>
<h1>11、测试操作平台</h1>
<p><img src="https://img2020.cnblogs.com/blog/2334163/202108/2334163-20210802213640688-1573082169.png" alt="img" /><br />
<img src="https://img2020.cnblogs.com/blog/2334163/202108/2334163-20210802213646306-89077682.png" alt="img" /></p>
<h1>12、重新分配pod节点</h1>
<p>查看pod信息得知目前大部分的pod在10.4.7.21上，这不符合性能最优状态，我们可以在dashbard面板上删除一个pod，通过scheduler的计算，会在另外一个（22上）负载较少的node节点上重新启动这个pod<br />
如下，删除coredns的pod<br />
<img src="https://img2020.cnblogs.com/blog/2334163/202108/2334163-20210802213658484-1042802645.png" alt="img" /></p>
<p>正在重启状态<br />
<img src="https://img2020.cnblogs.com/blog/2334163/202108/2334163-20210802213702617-304339096.png" alt="img" /></p>
<p>启动后的状态<br />
<img src="https://img2020.cnblogs.com/blog/2334163/202108/2334163-20210802213709882-226885762.png" alt="img" /></p>]]></description>
    <pubDate>Thu, 23 Jan 2025 16:29:50 +0800</pubDate>
    <dc:creator>墨客</dc:creator>
    <guid>https://thunisoft.wiki/K8Spinghuaqianyi.html</guid>
</item>
<item>
    <title>部署zookeeper集群</title>
    <link>https://thunisoft.wiki/zookeeper-1.html</link>
    <description><![CDATA[<h1>1、集群规划</h1>
<pre><code>主机名             角色              IPhdss7-11.host.com       k8s代理节点1、zk1            10.4.7.11hdss7-12.host.com       k8s代理节点2、zk2            10.4.7.12hdss7-21.host.com       k8s运算节点1、zk3            10.4.7.21hdss7-22.host.com       k8s运算节点2、jenkins &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 10.4.7.22hdss7-200.host.com   &amp;nbsp; &amp;nbsp; &amp;nbsp;  k8s运维节点（docker仓库）    &amp;nbsp; &amp;nbsp; &amp;nbsp;  10.4.7.200</code></pre>
<h1>2、配置jdk</h1>
<h2>2.1 下载</h2>
<p>下载地址（需要oracle账号）<br />
<a href="https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html">https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html</a><br />
<img src="https://img2020.cnblogs.com/blog/2334163/202108/2334163-20210810220649189-1271312249.png" alt="img" /></p>
<h2>2.2 安装jdk</h2>
<p>以10.4.7.11部署为例，10.4.7.12/21类似</p>
<pre><code>[root@hdss7-11 ~]# mkdir /opt/src[root@hdss7-11 ~]# mv jdk-8u301-linux-x64.tar.gz /opt/src/[root@hdss7-11 ~]# cd /opt/src/[root@hdss7-11 src]# tar -zxvf jdk-8u301-linux-x64.tar.gz -C /usr/local/[root@hdss7-11 src]# ln -s /usr/local/jdk1.8.0_301/ /usr/local/jdk</code></pre>
<h2>2.3 配置环境变量</h2>
<pre><code>[root@hdss7-11 src]# vim /etc/profile#jdk8export JAVA_HOME=/usr/local/jdk/export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport PATH=$JAVA_HOME/bin:$PATH[root@hdss7-11 src]# source /etc/profile[root@hdss7-11 src]# java -versionjava version "1.8.0_301"Java(TM) SE Runtime Environment (build 1.8.0_301-b09)Java HotSpot(TM) 64-Bit Server VM (build 25.301-b09, mixed mode)</code></pre>
<h1>3、配置域名解析</h1>
<p>在域名服务器10.4.7.11上配置域名解析</p>
<pre><code>[root@hdss7-11 src]# vim /var/named/od.com.zone$ORIGIN od.com.$TTL 600  ; 10 minutes@ &amp;nbsp; &amp;nbsp; &amp;nbsp; IN SOA  dns.od.com. dnsadmin.od.com. ( &amp;nbsp; &amp;nbsp; &amp;nbsp;  2020010506 ; serial &amp;nbsp; &amp;nbsp; &amp;nbsp;  10800 &amp;nbsp; &amp;nbsp;  ; refresh (3 hours) &amp;nbsp; &amp;nbsp; &amp;nbsp;  900 &amp;nbsp; &amp;nbsp; &amp;nbsp;  ; retry (15 minutes) &amp;nbsp; &amp;nbsp; &amp;nbsp;  604800 &amp;nbsp; &amp;nbsp; ; expire (1 week) &amp;nbsp; &amp;nbsp; &amp;nbsp;  86400 &amp;nbsp; &amp;nbsp;  ; minimum (1 day) &amp;nbsp; &amp;nbsp; &amp;nbsp;  ) &amp;nbsp; &amp;nbsp; &amp;nbsp;  NS &amp;nbsp; dns.od.com.$TTL 60 ; 1 minutedns &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  A &amp;nbsp;  10.4.7.11harbor &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; A &amp;nbsp;  10.4.7.200k8s-yaml &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; A &amp;nbsp;  10.4.7.200traefik &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  A &amp;nbsp;  10.4.7.10dashboard &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  A &amp;nbsp;  10.4.7.10zk1 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  A &amp;nbsp;  10.4.7.11zk2 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  A &amp;nbsp;  10.4.7.12zk3 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;  A &amp;nbsp;  10.4.7.21[root@hdss7-11 src]# systemctl restart named验证[root@hdss7-11 src]# dig -t A zk1.od.com @10.4.7.11 +short10.4.7.11</code></pre>
<h1>4、部署zookeeper集群</h1>
<p>以10.4.7.11部署为例，10.4.7.12/21类似</p>
<h2>4.1 下载解压</h2>
<p>二进制下载地址：<a href="https://archive.apache.org/dist/zookeeper/">https://archive.apache.org/dist/zookeeper/</a></p>
<pre><code>[root@hdss7-11 src]# wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.8/zookeeper-3.4.8.tar.gz[root@hdss7-11 src]# tar -zxvf zookeeper-3.4.8.tar.gz -C /opt/[root@hdss7-11 src]# ln -s /opt/zookeeper-3.4.8/ /opt/zookeeper</code></pre>
<h2>4.2 创建数据、日志目录</h2>
<pre><code>[root@hdss7-11 src]# mkdir -p /data/zookeeper/{data,logs}</code></pre>
<h2>4.3 修改配置文件（各节点相同）</h2>
<pre><code>[root@hdss7-11 src]# vim /opt/zookeeper/conf/zoo.cfgtickTime=2000initLimit=10syncLimit=5dataDir=/data/zookeeper/dataclientPort=2181server.1=zk1.od.com:2888:3888server.2=zk2.od.com:2888:3888server.3=zk3.od.com:2888:3888</code></pre>
<p>配置myid（各节点不同，分别是1/2/3）</p>
<pre><code>[root@hdss7-11 src]# echo 1 &gt; /data/zookeeper/data/myid</code></pre>
<h2>4.4 启动</h2>
<pre><code>[root@hdss7-11 src]# /opt/zookeeper/bin/zkServer.sh startZooKeeper JMX enabled by defaultUsing config: /opt/zookeeper/bin/../conf/zoo.cfgStarting zookeeper ... STARTED</code></pre>
<h2>4.5 查看集群状态</h2>
<p>当至启东一个节点时，因为无法满足集群，所以会有以下报错，忽略</p>
<pre><code>[root@hdss7-11 src]# /opt/zookeeper/bin/zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /opt/zookeeper/bin/../conf/zoo.cfgError contacting service. It is probably not running.</code></pre>
<p>当启动第二个节点后满足集群要求，集群状态就正常了（而且第二个启动的一定是master），接着启动第三个节点就行</p>
<pre><code>[root@hdss7-12 src]# /opt/zookeeper/bin/zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /opt/zookeeper/bin/../conf/zoo.cfgMode: leader[root@hdss7-11 src]# /opt/zookeeper/bin/zkServer.sh statusZooKeeper JMX enabled by defaultUsing config: /opt/zookeeper/bin/../conf/zoo.cfgMode: follower</code></pre>
<h2>4.6 设置zk开机自启</h2>
<pre><code>[root@hdss7-11 src]# vim /etc/rc.d/rc.localexport JAVA_HOME=/usr/local/jdk//opt/zookeeper/bin/zkServer.sh start</code></pre>]]></description>
    <pubDate>Thu, 23 Jan 2025 16:24:32 +0800</pubDate>
    <dc:creator>墨客</dc:creator>
    <guid>https://thunisoft.wiki/zookeeper-1.html</guid>
</item>
<item>
    <title>k8s快速部署</title>
    <link>https://thunisoft.wiki/K8Skusubushu.html</link>
    <description><![CDATA[<h1>一、部署前准备</h1>
<h2>1.1 主机规划</h2>
<table>
<thead>
<tr>
<th>主机名</th>
<th>ip地址</th>
<th>操作系统</th>
<th>cpu*内存</th>
<th>硬盘</th>
</tr>
</thead>
<tbody>
<tr>
<td>master</td>
<td>192.168.100.101</td>
<td>Centos7</td>
<td>2*2</td>
<td>50G</td>
</tr>
<tr>
<td>node1</td>
<td>192.168.100.102</td>
<td>Centos7</td>
<td>2*2</td>
<td>50G</td>
</tr>
<tr>
<td>node2</td>
<td>192.168.100.103</td>
<td>Centos7</td>
<td>2*2</td>
<td>50G</td>
</tr>
</tbody>
</table>
<h2>1.2 升级内核版本</h2>
<pre><code class="language-shell">可以参考https://www.cnblogs.com/wangyuanguang/p/18051798</code></pre>
<h2>1.3 分别设置主机名并添加hosts映射</h2>
<pre><code class="language-shell">~]# hostnamectl set-hostname master
~]# hostnamectl set-hostname node1
~]# hostnamectl set-hostname node2
~]# vim /etc/hosts
192.168.100.101 master
192.168.100.102 node1
192.168.100.103 node2</code></pre>
<h2>1.4 关闭selinux和firewalld</h2>
<pre><code class="language-shell">~]# systemctl stop firewalld
~]# systemctl disable firewalld
~]# sed -i 's/enforcing/disabled/' /etc/selinux/config
~]# setenforce 0</code></pre>
<h2>1.5 禁止swap分区</h2>
<pre><code class="language-shell">~]# swapoff -a</code></pre>
<h2>1.6 将桥接的IPv4流量传递到iptables的链</h2>
<pre><code class="language-shell">~]# cat &gt; /etc/sysctl.d/k8s.conf &lt;&lt; EOF
net.ipv4.ip_forward = 1
net.ipv4.tcp_tw_recycle = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sysctl --system</code></pre>
<h1>二、部署docker</h1>
<h2>2.1 具体安装不做演示，配置参照如下</h2>
<pre><code class="language-shell">vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://hub-mirror.c.163.com","https://registry.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn"],
"data-root": "/data/docker",
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": { "max-size": "300m","max-file": "3" },
"live-restore": true
}</code></pre>
<h1>三、部署k8s基础命令</h1>
<h2>3.1 添加k8s阿里云的yum源</h2>
<pre><code class="language-shell">cat &gt; /etc/yum.repos.d/kubernetes.repo &lt;&lt; EOF[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF</code></pre>
<h2>3.2 查看最新可安装的软件</h2>
<pre><code class="language-shell">]#  yum --disablerepo="*" --enablerepo="kubernetes" list available
已加载插件：fastestmirror
Loading mirror speeds from cached hostfile
kubernetes                                                                     | 1.4 kB  00:00:00
kubernetes/primary                                                             | 137 kB  00:00:00
kubernetes                                                                           1022/1022
可安装的软件包
cri-tools.x86_64                                        1.26.0-0                     kubernetes
kubeadm.x86_64                                          1.28.2-0                     kubernetes
kubectl.x86_64                                          1.28.2-0                     kubernetes
kubelet.x86_64                                          1.28.2-0                     kubernetes
kubernetes-cni.x86_64                                   1.2.0-0                      kubernetes
rkt.x86_64  </code></pre>
<h2>3.3 安装kubeadm、kubectl、kubelet</h2>
<pre><code class="language-shell">]#  yum install -y kubelet-1.28.2 kubeadm-1.28.2 kubectl-1.28.2
]#  systemctl start kubelet
]#  systemctl enable kubelet</code></pre>
<h1>四、部署集群</h1>
<h2>4.1 初始化master</h2>
<pre><code class="language-shell">kubeadm init   --apiserver-advertise-address=192.168.100.101 --image-repository registry.aliyuncs.com/google_containers   --kubernetes-version v1.28.0   --service-cidr=10.140.0.0/16 --pod-network-cidr=10.240.0.0/16</code></pre>
<p>参数注释：</p>
<pre><code class="language-lua">–apiserver-advertise-address
    指明用Master的哪个interface与Cluster 的其他节点通信。 如果Master有多个interface， 建议明确指定， 如果 不指定， kubeadm会自动选择有默认网关的interface。

–pod-network-cidr
    选择一个Pod网络插件，并检查它是否需要在初始化Master时指定一些参数，它的值取决于你在下一步选择的哪个网络网络插件，这里选择Flannel的网络插件参数为 10.244.0.0/16。Calico网络为192.168.0.0/16。参考：Installing a pod network add-on

-service-cidr
    选择service网络

–image-repository
    使用kubeadm config images pull来预先拉取初始化需要用到的镜像，用来检查是否能连接到Kubenetes的Registries。
Kubenetes默认Registries地址是k8s.gcr.io，很明显，在国内并不能访问gcr.io，因此在kubeadm v1.13之前的版本，安装起来非常麻烦，但是在1.13版本中终于解决了国内的痛点，其增加了一个--image-repository参数，默认值是k8s.gcr.io，我们将其指定为国内镜像地址：registry.aliyuncs.com/google_containers。

–kubernetes-version
    默认值是stable-1，会导致从https://dl.k8s.io/release/stable-1.txt下载最新的版本号，我们可以将其指定为固定版本来跳过网络请求。</code></pre>
<h2>4.2 报错问题及处理</h2>
<p>问题一</p>
<pre><code class="language-shell"># 问题一
[init] Using Kubernetes version: v1.28.2
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR CRI]: container runtime is not running: output: time="2024-03-05T11:40:45+08:00" level=fatal msg="validate service connection: CRI v1 runtime API is not implemented for endpoint \"unix:///var/run/containerd/containerd.sock\": rpc error: code = Unimplemented desc = unknown service runtime.v1.RuntimeService"
, error: exit status 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

# 解决方案
查看版本都没有问题，启动状态也都正常
[root@nacos ~]# containerd -v
containerd containerd.io 1.6.26 3dd1e886e55dd695541fdcd67420c2888645a495
[root@nacos ~]# docker -v
Docker version 24.0.7, build afdd53b
编辑以下文件，将下面一行内容注释掉
~]# vim /etc/containerd/config.toml
#disabled_plugins = ["cri"]
保存退出重启containerd 后重新初始化成功
原因参考：https://blog.csdn.net/mo_sss/article/details/134855578
报错内容中的内容分析
CRI Container Runtime Interface 容器运行时接口
container runtime is not running 容器运行时未启动
validate service connection 无效的服务连接
CRI v1 runtime API is not implemented for endpoint “unix:///var/run/containerd/containerd.sock” 容器运行时接口 v1 运行时 接口 没有实现节点文件sock，应该就是此文件未找到

containerd安装的默认禁用（重点）
使用安装包安装的containerd会默认禁用作为容器运行时的功能，即安装包安装containerd后默认禁用containerd作为容器运行时
这个时候使用k8s就会报错了，因为没有容器运行时可以用
开启方法就是将/etc/containerd/config.toml文件中的disabled_plugins的值的列表中不包含cri
修改后重启containerd才会生效</code></pre>
<p>问题二</p>
<pre><code class="language-shell"># 如果kubernets初始化时失败后，第二次再次执行会初始化命令会报错，这时需要进行重置
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml]: /etc/kubernetes/manifests/kube-apiserver.yaml already exists
        [ERROR FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml]: /etc/kubernetes/manifests/kube-controller-manager.yaml already exists
        [ERROR FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml]: /etc/kubernetes/manifests/kube-scheduler.yaml already exists
        [ERROR FileAvailable--etc-kubernetes-manifests-etcd.yaml]: /etc/kubernetes/manifests/etcd.yaml already exists
        [ERROR Port-10250]: Port 10250 is in use
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`

# 解决方法
kubeadm reset</code></pre>
<p>问题三</p>
<pre><code class="language-shell"># 服务器重启后初始化出现如下问题
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables does not exist
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

# 解决：驱动加载
modprobe br_netfilter 
bridge</code></pre>
<p>问题四</p>
<pre><code class="language-shell"># 出现如下报错
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[kubelet-check] Initial timeout of 40s passed.

Unfortunately, an error has occurred:
        timed out waiting for the condition

This error is likely caused by:
        - The kubelet is not running
        - The kubelet is unhealthy due to a misconfiguration of the node in some way (required cgroups disabled)

If you are on a systemd-powered system, you can try to troubleshoot the error with the following commands:
        - 'systemctl status kubelet'
        - 'journalctl -xeu kubelet'

Additionally, a control plane component may have crashed or exited when started by the container runtime.
To troubleshoot, list all containers using your preferred container runtimes CLI.
Here is one example how you may list all running Kubernetes containers by using crictl:

   - 'crictl --runtime-endpoint unix:///var/run/containerd/containerd.sock ps -a | grep kube | grep -v pause'
      you have found the failing container, you can inspect its logs with:
        - 'crictl --runtime-endpoint unix:///var/run/containerd/containerd.sock logs CONTAINERID'
          error execution phase wait-control-plane: couldn't initialize a Kubernetes cluster
          To see the stack trace of this error execute with --v=5 or higher

查看

~ #] journalctl -xeu kubelet
3月 05 15:34:31 master kubelet[3753]: E0305 15:34:31.924406    3753 eviction_manager.go:258] "Eviction manager: failed to get summary stats" err="failed to get node info: node \"master\" not found"
3月 05 15:34:33 master kubelet[3753]: E0305 15:34:33.467480    3753 event.go:289] Unable to write event: '&amp;v1.Event{TypeMeta:v1.TypeMeta{Kind:"", APIVersion:""}, ObjectMeta:v1.ObjectMeta{Name:"master.17b9cdcc77bcf4b9", GenerateName:"", Namespace:"default", SelfLink:"", UID:"", ResourceVersion:"", Generation:0, CreationTimestamp:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), DeletionTimestamp:&lt;nil&gt;, DeletionGracePeriodSeconds:(*int64)(nil), Labels:map[string]string(nil), Annotations:map[string]string(nil), OwnerReferences:[]v1.OwnerReference(nil), Finalizers:[]string(nil), ManagedFields:[]v1.ManagedFieldsEntry(nil)}, InvolvedObject:v1.ObjectReference{Kind:"Node", Namespace:"", Name:"master", UID:"master", APIVersion:"", ResourceVersion:"", FieldPath:""}, Reason:"NodeHasSufficientMemory", Message:"Node master status is now: NodeHasSufficientMemory", Source:v1.EventSource{Component:"kubelet", Host:"master"}, FirstTimestamp:time.Date(2024, time.March, 5, 15, 30, 11, 629708473, time.Local), LastTimestamp:time.Date(2024, time.March, 5, 15, 30, 11, 629708473, time.Local), Count:1, Type:"Normal", EventTime:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), Series:(*v1.EventSeries)(nil), Action:"", Related:(*v1.ObjectReference)(nil), ReportingController:"kubelet", ReportingInstance:"master"}': 'Post "https://192.168.100.101:6443/api/v1/namespaces/default/events": dial tcp 192.168.100.101:6443: connect: connection refused'(may retry after sleeping)
3月 05 15:34:36 master kubelet[3753]: E0305 15:34:36.225841    3753 controller.go:146] "Failed to ensure lease exists, will retry" err="Get \"https://192.168.100.101:6443/apis/coordination.k8s.io/v1/namespaces/kube-node-lease/leases/master?timeout=10s\": dial tcp 192.168.100.101:6443: connect: connection refused" interval="7s"
3月 05 15:34:36 master kubelet[3753]: I0305 15:34:36.421728    3753 kubelet_node_status.go:70] "Attempting to register node" node="master"
3月 05 15:34:36 master kubelet[3753]: E0305 15:34:36.422349    3753 kubelet_node_status.go:92] "Unable to register node with API server" err="Post \"https://192.168.100.101:6443/api/v1/nodes\": dial tcp 192.168.100.101:6443: connect: connection refused" node="master"

# 出错原因分析：
拉取 registry.k8s.io/pause:3.6 镜像失败 导致sandbox 创建不了而报错
# 解决方法：
# 生成 containerd 的默认配置文件
containerd config default &gt; /etc/containerd/config.toml
# 查看 sandbox 的默认镜像仓库在文件中的第几行
cat /etc/containerd/config.toml | grep -n "sandbox_image"
# 使用 vim 编辑器 定位到 sandbox_image，将 仓库地址修改成 k8simage/pause:3.6
vim /etc/containerd/config.toml
sandbox_image = " registry.aliyuncs.com/google_containers/pause:3.6"
# 重启 containerd 服务
systemctl daemon-reload
systemctl restart containerd.service</code></pre>
<p>初始化完成后会生成一串命令用于node节点的加入，如下记录下来</p>
<pre><code class="language-shell">Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.100.101:6443 --token jcdduw.3wfskykjk7gwdf1u \
        --discovery-token-ca-cert-hash sha256:dd3cb5208a4ca032e85a5a30b9b02f963aff2fece13045cf8c74d7b9ed7f6098</code></pre>
<h2>4.2 关于token</h2>
<p>注意token一般24小时候就会过期</p>
<p>查看当前token</p>
<pre><code class="language-shell">[root@master ~]# kubeadm token list
TOKEN                     TTL         EXPIRES                USAGES                   DESCRIPTION                                                EXTRA GROUPS
jcdduw.3wfskykjk7gwdf1u   8h          2024-03-06T09:40:51Z   authentication,signing   The default bootstrap token generated by 'kubeadm init'.   system:bootstrappers:kubeadm:default-node-token</code></pre>
<p>查看本机sha256值</p>
<pre><code class="language-shell">[root@master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2&gt;/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
dd3cb5208a4ca032e85a5a30b9b02f963aff2fece13045cf8c74d7b9ed7f6098</code></pre>
<p>重新生成token</p>
<pre><code class="language-shell">[root@master ~]# kubeadm token create</code></pre>
<p>重新生成token并打印出join命令</p>
<pre><code class="language-shell">[root@master ~]# kubeadm token create --print-join-command
kubeadm join 192.168.100.101:6443 --token fpjwdf.p9bnbqf7cpvf1amc --discovery-token-ca-cert-hash sha256:dd3cb5208a4ca032e85a5a30b9b02f963aff2fece13045cf8c74d7b9ed7f6098</code></pre>
<p>如果要加入master节点，需要先生成certificate-key（1.16版本前参数为--experimental-upload-certs，1.16及1.16版本以后为--upload-certs）</p>
<pre><code class="language-shell">[root@master ~]# kubeadm init phase upload-certs --upload-certs
I0306 09:04:33.508490   63805 version.go:256] remote version is much newer: v1.29.2; falling back to: stable-1.28
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
[upload-certs] Using certificate key:
820908fa5d83b9a7314a58147b80d0dc81b4f7469c9c8f72fb49b4fba2652c29</code></pre>
<p>结合上面join和certs的（同样，1.16版本前参数为--experimental-control-plane --certificate-key ，1.16及1.16版本以后为--control-plane --certificate-key）</p>
<pre><code class="language-bash">[root@master2 ~]# kubeadm join 192.168.100.101:6443 --token fpjwdf.p9bnbqf7cpvf1amc --discovery-token-ca-cert-hash sha256:dd3cb5208a4ca032e85a5a30b9b02f963aff2fece13045cf8c74d7b9ed7f6098 --control-plane --certificate-key 820908fa5d83b9a7314a58147b80d0dc81b4f7469c9c8f72fb49b4fba2652c29</code></pre>
<h2>4.3 配置kubectl</h2>
<p>接着执行以下命令，让本机可以执行bubectl命令</p>
<pre><code class="language-shell">[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# chown $(id -u):$(id -g) $HOME/.kube/config</code></pre>
<p>如果是root用户也可以直接使用以下命令</p>
<pre><code class="language-shell">[root@master ~]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" &gt; /etc/profile.d/kubeconfig.sh
[root@master ~]# source /etc/profile.d/kubeconfig.sh</code></pre>
<p>将admin.conf拷贝到其他需要使用kunectl命令的node节点</p>
<pre><code class="language-sh">[root@master ~]# scp /etc/kubernetes/admin.conf root@192.168.100.102:/etc/kubernetes/
[root@master ~]# scp /etc/kubernetes/admin.conf root@192.168.100.103:/etc/kubernetes/</code></pre>
<p>在node节点上执行下面命令使kubectl临时生效</p>
<pre><code class="language-shell">]# export KUBECONFIG=/etc/kubernetes/admin.conf</code></pre>
<p>永久生效</p>
<pre><code class="language-shell"> ]# echo "export KUBECONFIG=/etc/kubernetes/admin.conf" &gt; /etc/profile.d/kubeconfig.sh
 ]# source /etc/profile.d/kubeconfig.sh
 ]# kubectl get nodes
NAME     STATUS   ROLES           AGE     VERSION
master   NotReady                          control-plane   20h     v1.28.2
node1    NotReady                      &lt;none&gt;          5h12m   v1.28.2
node2    NotReady                      &lt;none&gt;          4h37m   v1.28.2</code></pre>
<h2>4.4 加入work节点</h2>
<p>在除master外其他node节点执行上面的join命令，加入k8s集群</p>
<pre><code class="language-shell"> ]# kubeadm join 192.168.100.101:6443 --token jcdduw.3wfskykjk7gwdf1u \
        --discovery-token-ca-cert-hash sha256:dd3cb5208a4ca032e85a5a30b9b02f963aff2fece13045cf8c74d7b9ed7f6098</code></pre>
<p>注意：移除node节点</p>
<pre><code class="language-shell">[root@master ~]# kubectl drain node2 --delete-local-data --force --ignore-daemonsets
Flag --delete-local-data has been deprecated, This option is deprecated and will be deleted. Use --delete-emptydir-data.
node/node2 cordoned
Warning: ignoring DaemonSet-managed Pods: kube-system/kube-proxy-9pscb
node/node2 drained
[root@master ~]# kubectl get nodes
NAME     STATUS                        ROLES           AGE   VERSION
master   NotReady                      control-plane   15h   v1.28.2
node1    NotReady                      &lt;none&gt;          30m   v1.28.2
node2    NotReady,SchedulingDisabled   &lt;none&gt;          28m   v1.28.2
[root@master ~]# kubectl delete node node2
node "node2" deleted
#在被删除的node节点中清空集群数据信息【被删除节点执行】：

#清空前：
[root@localhost overlay2]# cd /etc/kubernetes/
[root@localhost kubernetes]# ls
kubelet.conf  manifests  pki
#清空
[root@localhost kubernetes]# kubeadm reset -f
[preflight] Running pre-flight checks
W0306 09:21:12.767822  100185 removeetcdmember.go:106] [reset] No kubeadm config, using etcd pod spec to get data directory
[reset] Deleted contents of the etcd data directory: /var/lib/etcd
[reset] Stopping the kubelet service
[reset] Unmounting mounted directories in "/var/lib/kubelet"
[reset] Deleting contents of directories: [/etc/kubernetes/manifests /var/lib/kubelet /etc/kubernetes/pki]
[reset] Deleting files: [/etc/kubernetes/admin.conf /etc/kubernetes/kubelet.conf /etc/kubernetes/bootstrap-kubelet.conf /etc/kubernetes/controller-manager.conf /etc/kubernetes/scheduler.conf]

The reset process does not clean CNI configuration. To do so, you must remove /etc/cni/net.d

The reset process does not reset or clean up iptables rules or IPVS tables.
If you wish to reset iptables, you must do so manually by using the "iptables" command.

If your cluster was setup to utilize IPVS, run ipvsadm --clear (or similar)
to reset your system's IPVS tables.

The reset process does not clean your kubeconfig files and you must remove them manually.
Please, check the contents of the $HOME/.kube/config file.

# 清空后
[root@localhost kubernetes]# ls
manifests  pki

# 重新加入
[root@localhost kubernetes]# kubeadm join 192.168.100.101:6443 --token fpjwdf.p9bnbqf7cpvf1amc --discovery-token-ca-cert-hash sha256:dd3cb5208a4ca032e85a5a30b9b02f963aff2fece13045cf8c74d7b9ed7f6098</code></pre>
<p>在master节点查看nodes状态</p>
<pre><code class="language-shell">[root@master ~]# kubectl get nodes
NAME     STATUS     ROLES           AGE   VERSION
master   NotReady   control-plane   15h   v1.28.2
node1    NotReady   &lt;none&gt;          35m   v1.28.2
node2    NotReady   &lt;none&gt;          10s   v1.28.2</code></pre>
<h1>五、安装CNI网络插件</h1>
<p>下面两种插件二选一，master上执行，如果是云服务器建议按照flannel，calico可能会和云网络环境有冲突</p>
<p>安装flannel网络插件</p>
<p>下载yaml文件，网咯会有波动，可以多wget几次</p>
<pre><code class="language-shell">[root@master ~]# mkdir /data/k8s
[root@master ~]# cd /data/k8s/
[root@master ~]# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml</code></pre>
<p>修改kube-flannel.yml中net-conf.json下面的网段为上面init pod-network-cidr的网段地址（必须正确否则会导致集群网络问题）</p>
<pre><code class="language-shell">[root@master ~]# sed -i 's/10.244.0.0/10.240.0.0/' kube-flannel.yml</code></pre>
<p>安装插件</p>
<pre><code class="language-shell">[root@master ~]# kubectl apply -f kube-flannel.yml
[root@master k8s]# kubectl get pods -n kube-flannel
NAME                    READY   STATUS    RESTARTS   AGE
kube-flannel-ds-2dlk6   1/1     Running   0          33s
kube-flannel-ds-nq549   1/1     Running   0          33s
kube-flannel-ds-tjg7r   1/1     Running   0          33s</code></pre>
<p>查看nodes节点状态已经都变成ready了</p>
<p>[root@master k8s]# kubectl get nodes<br />
NAME STATUS ROLES AGE VERSION<br />
master Ready control-plane 16h v1.28.2<br />
node1 Ready 103m v1.28.2<br />
node2 Ready 68m v1.28.2</p>
<h1>六、集群测试</h1>
<p>创建一个pod，并确实是否运行正常</p>
<pre><code class="language-shell">[root@master k8s]# kubectl create deployment nginx --image=nginx
deployment.apps/nginx created

[root@master k8s]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-7854ff8877-nl4t2   1/1     Running   0          34s

[root@master k8s]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed

[root@master k8s]# kubectl get svc
NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.140.0.1       &lt;none&gt;        443/TCP        17h
service/nginx        NodePort    10.140.115.205   &lt;none&gt;        80:31726/TCP   30s</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/2334163/202403/2334163-20240306145334184-361652042.png" alt="img" /></p>
<p>另外两个节点查看service</p>
<pre><code class="language-shell">[root@node1 ~]#  kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.140.0.1       &lt;none&gt;        443/TCP        20h
nginx        NodePort    10.140.115.205   &lt;none&gt;        80:31726/TCP   173m

[root@node2 ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.140.0.1       &lt;none&gt;        443/TCP        20h
nginx        NodePort    10.140.115.205   &lt;none&gt;        80:31726/TCP   178m</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/2334163/202403/2334163-20240306145319986-462961479.png" alt="img" /></p>
<p>至此k8s快速部署完成</p>
<h1>七、k8s常用命令</h1>
<p>查看pod，service，endpoints，secret等等的状态</p>
<pre><code class="language-shell">kubectl get 组件名      # 例如kubectl get pod   查看详细信息可以加上-o wide   其他namespace的指定 -n namespace名</code></pre>
<p>创建，变更一个yaml文件内资源，也可以是目录，目录内包含一组yaml文件（实际使用中都是以yaml文件为主，直接使用命令创建pod的很少，推荐多使用yaml文件）</p>
<pre><code class="language-shell">kubectl apply -f xxx.yaml    # 例如kubectl apply -f nginx.yaml   这里是如果没有则创建，如果有则变更，比create好用</code></pre>
<p>删除一个yaml文件内资源，也可以是目录，目录内包含一组yaml文件</p>
<pre><code class="language-shell">kubectl delete -f xxx.yaml    # 例如kubectl delete -f nginx.yaml</code></pre>
<p>查看资源状态，比如有一组deployment内的pod没起来，一般用于pod调度过程出现的问题排查</p>
<pre><code class="language-shell">kubectl describe pod pod名     # 先用kubectl get pod查看  有异常的复制pod名使用这个命令</code></pre>
<p>查看pod日志，用于pod状态未就绪的故障排查</p>
<pre><code class="language-shell">kubectl logs pod名     # 先用kubectl get pod查看  有异常的复制pod名使用这个命令</code></pre>
<p>查看node节点或者是pod资源（cpu，内存资源）使用情况</p>
<pre><code class="language-shell">kubectl top 组件名     # 例如kubectl top node  kubectl top pod</code></pre>
<p>进入pod内部</p>
<pre><code class="language-shell">kubectl exec -ti pod名 /bin/bash      # 先用kubectl get pod查看  有需要的复制pod名使用这个命令</code></pre>]]></description>
    <pubDate>Thu, 23 Jan 2025 16:15:45 +0800</pubDate>
    <dc:creator>墨客</dc:creator>
    <guid>https://thunisoft.wiki/K8Skusubushu.html</guid>
</item>
<item>
    <title>利用python分析nginx日志</title>
    <link>https://thunisoft.wiki/?post=8</link>
    <description><![CDATA[<p>最近在学习python，写了个脚本分析nginx日志，练练手。写得比较粗糙，但基本功能可以实现。</p>
<p>脚本功能：查找出当天访问次数前十位的IP，并获取该IP来源，并将分析结果发送邮件到指定邮箱。</p>
<p>实现前两项功能的脚本内容如下：</p>
<pre><code class="language-shell">#!/usr/bin/env python
# coding:utf-8
# date:2015-12-10
# author:eivll0m

import urllib
import json

url = 'http://ip.taobao.com/service/getIpInfo.php?ip='

def ip_find(ip):
    data = urllib.urlopen(url + ip).read()
    datadict = json.loads(data)
    for oneinfo in datadict:
        if 'code' == oneinfo:
            if datadict[oneinfo] == 0:
                return datadict['data']['country'] + datadict['data']['region'] + datadict['data']['city'] + '\t' + datadict['data']['isp']

def sort_value(s):
    d = sorted(s.iteritems(),key=lambda t:t[1],reverse=True)
    return d

if __name__ == '__main__':
    with open('access.log') as f:
        d = {}
        for line in f:
            field = line.split()
            if field[0] not in d:
                d.setdefault(field[0],[])
            d[field[0]].append(field[0])

        s = {}
        for k in d:
            s[k] = len(d[k])
        s = sort_value(s)[0:10]
        print '访问IP\t\t\t访问次数\t\tIP来源'
        print '----------------------------------------------------------------------------'
        for ip,con in s:
            print str(ip) + '\t\t' + str(con) + '\t\t' + ip_find(ip)</code></pre>
<p>执行效果如下：</p>
<p><a href="http://thunisoft.wiki/content/uploadfile/202412/616c1733203626.png"><img src="http://thunisoft.wiki/content/uploadfile/202412/616c1733203626.png" alt="" /></a></p>
<p>加入发送邮件功能，最终版本：</p>
<pre><code class="language-shell">#!/usr/bin/env python
# coding:utf-8
# date:2015-12-10
# author:eivll0m

import urllib
import json
import time
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib

url = 'http://ip.taobao.com/service/getIpInfo.php?ip='

def ip_find(ip):
    data = urllib.urlopen(url + ip).read()
    datadict = json.loads(data)
    for oneinfo in datadict:
        if 'code' == oneinfo:
            if datadict[oneinfo] == 0:
                return datadict['data']['country'] + datadict['data']['region'] + datadict['data']['city'] + '\t' + datadict['data']['isp']

def sort_value(s):
    d = sorted(s.iteritems(),key=lambda t:t[1],reverse=True)
    return d

def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr(( \
        Header(name, 'utf-8').encode(), \
        addr.encode('utf-8') if isinstance(addr, unicode) else addr))

if __name__ == '__main__':
    date_time = time.strftime('%Y-%m-%d %H:%M:%S')
    from_addr = 'xxxxxx@163.com'
    password = 'uoodfdnddaeqjq'
    to_addr = 'xxxxxxx@qq.com'
    smtp_server = 'smtp.163.com'
    with open('access.log') as f:
        d = {}
        for line in f:
            field = line.split()
            if field[0] not in d:
                d.setdefault(field[0],[])
            d[field[0]].append(field[0])

        s = {}
        for k in d:
            s[k] = len(d[k])
        s = sort_value(s)[0:10]
        text = date_time + '\n'
        text = text + '\n' + u'访问IP\t\t\t访问次数\t\tIP来源' 
        text = text + '\n' + '----------------------------------------------------------------------------'
        for ip,con in s:
            text = text + '\n' + str(ip) + '\t\t' + str(con) + '\t\t' + ip_find(ip)
        text =  text + '\n' '----------------------------------------------------------------------------'

        msg = MIMEText(text, 'plain', 'utf-8')
        msg['From'] = _format_addr(u'监控 ' % from_addr)
        msg['To'] = _format_addr(u'管理员 ' % to_addr)
        msg['Subject'] = Header(u'Nginx日志分析……', 'utf-8').encode()

        server = smtplib.SMTP(smtp_server, 25)
        server.set_debuglevel(1)
        server.login(from_addr, password)
        server.sendmail(from_addr, [to_addr], msg.as_string())
        server.quit()</code></pre>
<p>执行脚本后收到邮件：<br />
<a href="http://thunisoft.wiki/content/uploadfile/202412/72d21733203605.png"><img src="http://thunisoft.wiki/content/uploadfile/202412/72d21733203605.png" alt="" /></a></p>]]></description>
    <pubDate>Tue, 03 Dec 2024 13:15:52 +0800</pubDate>
    <dc:creator>墨客</dc:creator>
    <guid>https://thunisoft.wiki/?post=8</guid>
</item>
<item>
    <title>pip安装地址--清华源(国内常用镜像源)</title>
    <link>https://thunisoft.wiki/?post=7</link>
    <description><![CDATA[<p>pip安装地址--清华源(国内常用镜像源)</p>
<p>国内常用镜像源</p>
<p>清华大学 ：<a href="https://pypi.tuna.tsinghua.edu.cn/simple/">https://pypi.tuna.tsinghua.edu.cn/simple/</a><br />
阿里云：<a href="http://mirrors.aliyun.com/pypi/simple/">http://mirrors.aliyun.com/pypi/simple/</a><br />
中国科学技术大学 ：<a href="http://pypi.mirrors.ustc.edu.cn/simple/">http://pypi.mirrors.ustc.edu.cn/simple/</a><br />
华中科技大学：<a href="http://pypi.hustunique.com/">http://pypi.hustunique.com/</a><br />
豆瓣源：<a href="http://pypi.douban.com/simple/">http://pypi.douban.com/simple/</a><br />
腾讯源：<a href="http://mirrors.cloud.tencent.com/pypi/simple">http://mirrors.cloud.tencent.com/pypi/simple</a><br />
华为镜像源：<a href="https://repo.huaweicloud.com/repository/pypi/simple/">https://repo.huaweicloud.com/repository/pypi/simple/</a></p>
<p>————————————————<br />
1、临时使用</p>
<p>pip install [包名] -i [pip源URL]</p>
<h1>示例</h1>
<p>pip install pytest -i <a href="https://pypi.tuna.tsinghua.edu.cn/simple">https://pypi.tuna.tsinghua.edu.cn/simple</a></p>
<h1>或</h1>
<p>pip install -i <a href="https://pypi.tuna.tsinghua.edu.cn/simple">https://pypi.tuna.tsinghua.edu.cn/simple</a> pytest</p>
<h1>或</h1>
<p>pip install -r requirements.txt -i <a href="https://pypi.tuna.tsinghua.edu.cn/simple">https://pypi.tuna.tsinghua.edu.cn/simple</a></p>
<p>2、永久使用<br />
前提pip版本 (&gt;=10.0.0) 方可使用此命令进行配置：</p>
<p>升级 pip 到最新的版本</p>
<p>pip install pip -U</p>
<h1>或</h1>
<p>python -m pip install --upgrade pip<br />
修改pip源为清华源</p>
<p>pip config set global.index-url <a href="https://pypi.tuna.tsinghua.edu.cn/simple">https://pypi.tuna.tsinghua.edu.cn/simple</a></p>]]></description>
    <pubDate>Tue, 03 Dec 2024 09:13:00 +0800</pubDate>
    <dc:creator>墨客</dc:creator>
    <guid>https://thunisoft.wiki/?post=7</guid>
</item>
<item>
    <title>Ubuntu 22.04基于lnmp环境部署Zabbix 6.0 LTS</title>
    <link>https://thunisoft.wiki/zabbix2.html</link>
    <description><![CDATA[<p><strong>一、lnmp简介</strong></p>
<p>LNMP代表的就是：Linux系统下（Nginx+MySQL(MariaDB)+PHP）这种网站服务器架构。</p>
<p>Linux是一类Unix计算机操作系统的统称，是目前最流行的免费操作系统。代表版本有：ubuntu、centos、ubuntu、fedora、gentoo等。</p>
<p>Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器，同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点（俄文：Рамблер）开发。</p>
<p>MySQL是一个关系型数据库管理系统，由瑞典MySQL AB公司开发，属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一，在WEB应用方面，MySQL是最好的RDBMS（Relational Database Management System，关系数据库管理系统）应用软件之一。</p>
<p>PHP（Hypertext Preprocessor）是一种广泛使用的开源服务器端脚本语言，尤其适用于Web开发。它最初由Rasmus Lerdorf于1994年创建，旨在简化网页开发过程。PHP可以嵌入到HTML中，并与多种数据库集成，最常用的是MySQL。其灵活性、易学性和强大的社区支持使得PHP成为开发动态网页和Web应用程序的首选语言之一。PHP代码在服务器上执行，生成的HTML发送到客户端，从而实现网页的动态交互。它广泛应用于各种Web开发项目，包括内容管理系统、电子商务平台和社交媒体网站。</p>
<p>这四种软件均为免费开源软件，组合到一起，成为一个免费、高效、扩展性强的网站服务系统。</p>
<p><strong>二、Zabbix简介</strong></p>
<p>zabbix（[`zæbiks]）是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。</p>
<p>zabbix能监视各种网络参数，保证服务器系统的安全运营；并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。</p>
<p>zabbix由2部分构成，zabbix server与可选组件zabbix agent。</p>
<p>zabbix server可以通过SNMP，zabbix agent，ping，端口监视等方法提供对远程服务器/网络状态的监视，数据收集等功能，它可以运行在Linux，Solaris，HP-UX，AIX，Free BSD，Open BSD，OS X等平台上。</p>
<p><strong>三、Ubuntu 22.04基于lnmp环境部署Zabbix</strong></p>
<p><strong>1、安装Nginx</strong></p>
<p>1）安装Nginx</p>
<p>root@ubuntu:~# apt -y update</p>
<p>root@ubuntu:~# apt -y install nginx</p>
<p><strong>2、安装MySQL</strong></p>
<p>1）安装MySQL</p>
<p>root@ubuntu:~# apt -y install mysql-server</p>
<p>2）登录MySQL</p>
<p>root@ubuntu:~# mysql</p>
<p>Welcome to the MySQL monitor. Commands end with ; or \g.</p>
<p>Your MySQL connection id is 8</p>
<p>Server version: 8.0.40-0ubuntu0.22.04.1 (Ubuntu)</p>
<p>Copyright (c) 2000, 2024, Oracle and/or its affiliates.</p>
<p>Oracle is a registered trademark of Oracle Corporation and/or its</p>
<p>affiliates. Other names may be trademarks of their respective</p>
<p>owners.</p>
<p>Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.</p>
<p>mysql&gt; select version();</p>
<p>+-------------------------+</p>
<p>| version() |</p>
<p>+-------------------------+</p>
<p>| 8.0.40-0ubuntu0.22.04.1 |</p>
<p>+-------------------------+</p>
<p>1 row in set (0.00 sec)</p>
<p>3）配置MySQL</p>
<p>root@ubuntu:~# cp /etc/mysql/mysql.conf.d/mysqld.cnf{,_bak}</p>
<p>root@ubuntu:~# sed -i '/pid-file/s/# //' /etc/mysql/mysql.conf.d/mysqld.cnf</p>
<p>root@ubuntu:~# sed -i '/socket/s/# //' /etc/mysql/mysql.conf.d/mysqld.cnf</p>
<p>root@ubuntu:~# sed -i '/3306/s/# //' /etc/mysql/mysql.conf.d/mysqld.cnf</p>
<p>root@ubuntu:~# sed -i '/bind-address/s/127.0.0.1/0.0.0.0/g' /etc/mysql/mysql.conf.d/mysqld.cnf</p>
<p>root@ubuntu:~# sed -i '/datadir/s/# //' /etc/mysql/mysql.conf.d/mysqld.cnf</p>
<p>root@ubuntu:~# sed -i -e '/max_connections/s/# //' -e '/max_connections/s/151/1000/' /etc/mysql/mysql.conf.d/mysqld.cnf</p>
<p>root@ubuntu:~# sed -i '/general_log/s/# //g' /etc/mysql/mysql.conf.d/mysqld.cnf</p>
<p>root@ubuntu:~# sed -i '/slow_query_log/s/# //g' /etc/mysql/mysql.conf.d/mysqld.cnf</p>
<p>root@ubuntu:~# sed -i '/server-id/s/# //' /etc/mysql/mysql.conf.d/mysqld.cnf</p>
<p>root@ubuntu:~# sed -i '/log_bin/s/# //' /etc/mysql/mysql.conf.d/mysqld.cnf</p>
<p>root@ubuntu:~# sed -i '/binlog_expire_logs_seconds/s/# //' /etc/mysql/mysql.conf.d/mysqld.cnf</p>
<p>root@ubuntu:~# sed -i '/max_binlog_size/s/100M/512M/' /etc/mysql/mysql.conf.d/mysqld.cnf</p>
<p>4）重启MySQL</p>
<p>root@ubuntu:~# systemctl restart mysql</p>
<p>5）配置root密码</p>
<p>root@ubuntu:~# mysql -u root 2&gt;/dev/null -e &quot;ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'G7#Wv8eDQbwdEBCL';&quot;</p>
<p>root@ubuntu:~# mysql -uroot -pG7#Wv8eDQbwdEBCL</p>
<p>mysql: [Warning] Using a password on the command line interface can be insecure.</p>
<p>Welcome to the MySQL monitor. Commands end with ; or \g.</p>
<p>Your MySQL connection id is 9</p>
<p>Server version: 8.0.40-0ubuntu0.22.04.1 (Ubuntu)</p>
<p>Copyright (c) 2000, 2024, Oracle and/or its affiliates.</p>
<p>Oracle is a registered trademark of Oracle Corporation and/or its</p>
<p>affiliates. Other names may be trademarks of their respective</p>
<p>owners.</p>
<p>Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.</p>
<p>mysql&gt;</p>
<p><strong>3、安装PHP</strong></p>
<p>1）安装PHP</p>
<p>root@ubuntu:~# apt -y install php-fpm php-mysqli php-redis php-mbstring php-gd php-xml php-bcmath php-ldap php-mysql</p>
<p>2）配置PHP</p>
<p># 配置www.conf</p>
<p>root@ubuntu:~# cp /etc/php/8.1/fpm/pool.d/www.conf{,_bak}</p>
<p>root@ubuntu:~# sed -i 's/^listen = .*/listen = 0.0.0.0:9000/' /etc/php/8.1/fpm/pool.d/www.conf</p>
<p>root@ubuntu:~# sed -i -e &quot;/pm.max_requests/s/;//&quot; -e '/pm.max_requests/s/500/3000/' /etc/php/8.1/fpm/pool.d/www.conf</p>
<p>root@ubuntu:~# sed -i '/pm.status_listen/s/;//' /etc/php/8.1/fpm/pool.d/www.conf</p>
<p>root@ubuntu:~# sed -i '/pm.status_path/s/;//' /etc/php/8.1/fpm/pool.d/www.conf</p>
<p>root@ubuntu:~# sed -i 's/www-data/nginx/g' /etc/php/8.1/fpm/pool.d/www.conf</p>
<p># 配置php.ini</p>
<p>root@ubuntu:~# cp /etc/php/8.1/fpm/php.ini{,_bak}</p>
<p>root@ubuntu:~# sed -i 's#;date.timezone =#date.timezone = Asia/Shanghai#' /etc/php/8.1/fpm/php.ini</p>
<p>root@ubuntu:~# sed -i '/post_max_size/s/8M/16M/' /etc/php/8.1/fpm/php.ini</p>
<p>root@ubuntu:~# sed -i '/max_execution_time/s/30/300/' /etc/php/8.1/fpm/php.ini</p>
<p>root@ubuntu:~# sed -i '/max_input_time/s/60/300/' /etc/php/8.1/fpm/php.ini</p>
<p>root@ubuntu:~# useradd -s /sbin/nologin nginx</p>
<p>3）重启PHP-FPM</p>
<p>root@ubuntu:~# systemctl restart php8.1-fpm.service</p>
<p>root@ubuntu:~# systemctl status php8.1-fpm.service</p>
<p><strong>4、安装Zabbix</strong></p>
<p>1）安装依赖包</p>
<p>root@ubuntu:~# apt -y update</p>
<p>root@ubuntu:~# apt -y install snmp gcc make libmysqlclient-dev libghc-curl-dev libxml2 libxml2-dev libsnmp-dev libopenipmi-dev libevent-dev libpcre3 libpcre3-dev</p>
<p>2）下载Zabbix软件包</p>
<p>root@ubuntu:~# apt -y install wget</p>
<p>root@ubuntu:~# wget -c <a href="https://cdn.zabbix.com/zabbix/sources/stable/6.0/zabbix-6.0.36.tar.gz">https://cdn.zabbix.com/zabbix/sources/stable/6.0/zabbix-6.0.36.tar.gz</a></p>
<p>3）安装中文语言包</p>
<p>root@ubuntu:~# apt -y install language-pack-zh-hans</p>
<p>root@ubuntu:~# sed -i &quot;/zh_CN.UTF-8/s/# //&quot; /etc/locale.gen</p>
<p>4）安装常用中文字体</p>
<p>root@ubuntu:~# apt -y install fonts-wqy-microhei fonts-wqy-zenhei xfonts-wqy</p>
<p>5）解压</p>
<p>root@ubuntu:~# tar xf zabbix-6.0.36.tar.gz</p>
<p>6）预编译</p>
<p>root@ubuntu:~# cd zabbix-6.0.36/</p>
<p>root@ubuntu:~/zabbix-6.0.36# ./configure --prefix=/usr/local/zabbix --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-openipmi</p>
<p>7）编译及安装</p>
<p>root@ubuntu:~/zabbix-6.0.36# make &amp;&amp; make install</p>
<p>8）配置Zabbix</p>
<p>root@ubuntu:~/zabbix-6.0.36# cp /usr/local/zabbix/etc/zabbix_server.conf{,_bak}</p>
<p>root@ubuntu:~/zabbix-6.0.36# cp /usr/local/zabbix/etc/zabbix_agentd.conf{,_bak}</p>
<p>9）创建软连接</p>
<p>root@ubuntu:~/zabbix-6.0.36# ln -sf /usr/local/zabbix/sbin/zabbix_* /usr/local/sbin/</p>
<p>10）拷贝Web到Nginx发布目录</p>
<p>root@ubuntu:~/zabbix-6.0.36# cp -a ~/zabbix-6.0.36/ui /usr/share/nginx/html/zabbix-6.0.36</p>
<p>11）授权</p>
<p>root@ubuntu:~/zabbix-6.0.36# chown -R nginx:nginx /usr/share/nginx/html/zabbix-6.0.36/</p>
<p>12）配置Zabbix_Server</p>
<p>root@ubuntu:~/zabbix-6.0.36# vim /usr/local/zabbix/etc/zabbix_server.conf</p>
<p>LogFile=/tmp/zabbix_server.log</p>
<p>PidFile=/tmp/zabbix_server.pid</p>
<p>DBHost=localhost</p>
<p>DBName=zabbix</p>
<p>DBUser=zabbix</p>
<p>DBPassword=www.yangxingzhen.com</p>
<p>Timeout=30</p>
<p>LogSlowQueries=3000</p>
<p>13）配置Zabbix_Agent</p>
<p>root@ubuntu:~/zabbix-6.0.36# vim /usr/local/zabbix/etc/zabbix_agentd.conf</p>
<p>LogFile=/tmp/zabbix_agentd.log</p>
<p>Server=localhost</p>
<p>ServerActive=localhost</p>
<p>Hostname=192.168.3.137</p>
<p>UnsafeUserParameters=1</p>
<p>AllowKey=system.run[*]</p>
<p>LogFileSize=10</p>
<p>Timeout=30</p>
<p>14）配置系统服务</p>
<p>root@ubuntu:~/zabbix-6.0.36# cp misc/init.d/tru64/zabbix_* /etc/init.d/</p>
<p>root@ubuntu:~/zabbix-6.0.36# chmod +x /etc/init.d/zabbix_*</p>
<p>15）创建Zabbix用户</p>
<p>root@ubuntu:~/zabbix-6.0.36# useradd -s /sbin/nologin zabbix</p>
<p>16）创建Zabbix数据库</p>
<p>root@ubuntu:~/zabbix-6.0.36# mysql -uroot -pG7#Wv8eDQbwdEBCL 2&gt;/dev/null -e &quot;create database zabbix character set utf8 collate utf8_bin;&quot;</p>
<p>root@ubuntu:~/zabbix-6.0.36# mysql -uroot -pG7#Wv8eDQbwdEBCL 2&gt;/dev/null -e &quot;create user zabbix@'localhost' identified by 'www.yangxingzhen.com';&quot;</p>
<p>root@ubuntu:~/zabbix-6.0.36# mysql -uroot -pG7#Wv8eDQbwdEBCL 2&gt;/dev/null -e &quot;grant all on zabbix.* to zabbix@'localhost';&quot;</p>
<p>root@ubuntu:~/zabbix-6.0.36# mysql -uroot -pG7#Wv8eDQbwdEBCL 2&gt;/dev/null -e &quot;flush privileges;&quot;</p>
<p>17）导入Zabbix数据库</p>
<p>root@ubuntu:~/zabbix-6.0.36# mysql -uroot -p&quot;G7#Wv8eDQbwdEBCL&quot; 2&gt;/dev/null zabbix</p>
<p>root@ubuntu:~/zabbix-6.0.36# mysql -uroot -p&quot;G7#Wv8eDQbwdEBCL&quot; 2&gt;/dev/null zabbix</p>
<p>root@ubuntu:~/zabbix-6.0.36# mysql -uroot -p&quot;G7#Wv8eDQbwdEBCL&quot; 2&gt;/dev/null zabbix</p>
<p>18）启动Zabbix</p>
<p>root@ubuntu:~/zabbix-6.0.36# /etc/init.d/zabbix_server start</p>
<p>Zabbix server started.</p>
<p>root@ubuntu:~/zabbix-6.0.36# /etc/init.d/zabbix_agentd start</p>
<p>Zabbix agent started.</p>
<p>19）查看Zabbix进程和端口</p>
<p>root@ubuntu:~/zabbix-6.0.36# netstat -lntup |egrep &quot;10050|10051&quot;</p>
<p>root@ubuntu:~/zabbix-6.0.36# ps -ef |egrep &quot;zabbix_server|zabbix_agentd&quot;</p>
<p>20）配置Nginx</p>
<p>root@ubuntu:~/zabbix-6.0.36# vim /etc/nginx/nginx.conf</p>
<p>user nginx nginx;</p>
<p>worker_processes auto;</p>
<p>pid /var/run/nginx.pid;</p>
<p>events {</p>
<p>use epoll;</p>
<p>worker_connections 10240;</p>
<p>multi_accept on;</p>
<p>}</p>
<p>http {</p>
<p>include mime.types;</p>
<p>default_type application/octet-stream;</p>
<p>log_format json escape=json</p>
<p>'{&quot;访问者IP&quot;:&quot;$remote_addr&quot;,'</p>
<p>'&quot;访问时间&quot;:&quot;$time_iso8601&quot;,'</p>
<p>'&quot;访问页面&quot;:&quot;$uri&quot;,'</p>
<p>'&quot;请求返回时间&quot;:&quot;$request_time/S&quot;,'</p>
<p>'&quot;请求方法类型&quot;:&quot;$request_method&quot;,'</p>
<p>'&quot;请求状态&quot;:&quot;$status&quot;,'</p>
<p>'&quot;请求体大小&quot;:&quot;$body_bytes_sent/B&quot;,'</p>
<p>'&quot;访问者搭载的系统配置和软件类型&quot;:&quot;$http_user_agent&quot;,'</p>
<p>'&quot;虚拟服务器IP&quot;:&quot;$server_addr&quot;}';</p>
<p>access_log /var/log/nginx/access.log json;</p>
<p>error_log /var/log/nginx/error.log warn;</p>
<p>sendfile on;</p>
<p>tcp_nopush on;</p>
<p>keepalive_timeout 120;</p>
<p>tcp_nodelay on;</p>
<p>server_tokens off;</p>
<p>gzip on;</p>
<p>gzip_min_length 1k;</p>
<p>gzip_buffers 4 64k;</p>
<p>gzip_http_version 1.1;</p>
<p>gzip_comp_level 4;</p>
<p>gzip_types text/plain application/x-javascript text/css application/xml;</p>
<p>gzip_vary on;</p>
<p>client_max_body_size 512m;</p>
<p>client_body_buffer_size 128k;</p>
<p>proxy_connect_timeout 90;</p>
<p>proxy_send_timeout 90;</p>
<p>proxy_buffer_size 4k;</p>
<p>proxy_buffers 4 32k;</p>
<p>proxy_busy_buffers_size 64k;</p>
<p>large_client_header_buffers 4 4k;</p>
<p>client_header_buffer_size 4k;</p>
<p>open_file_cache_valid 30s;</p>
<p>open_file_cache_min_uses 1;</p>
<p>include /etc/nginx/conf.d/*.conf;</p>
<p>}</p>
<p># 创建引用目录</p>
<p>root@ubuntu:~/zabbix-6.0.36# mkdir -p /etc/nginx/conf.d</p>
<p># 创建Zabbix配置文件</p>
<p>root@ubuntu:~/zabbix-6.0.36# vim /etc/nginx/conf.d/zabbix.conf</p>
<p>server {</p>
<p>listen 80;</p>
<p>server_name localhost;</p>
<p>access_log /var/log/nginx/access_zabbix.log json;</p>
<p>error_log /var/log/nginx/error_zabbix.log warn;</p>
<p>location / {</p>
<p>root /usr/share/nginx/html/zabbix-6.0.36;</p>
<p>index index.php index.html index.htm;</p>
<p>}</p>
<p>location ~* \.php$ {</p>
<p>root /usr/share/nginx/html/zabbix-6.0.36;</p>
<p>fastcgi_connect_timeout 300s;</p>
<p>fastcgi_send_timeout 300s;</p>
<p>fastcgi_read_timeout 300s;</p>
<p>fastcgi_buffer_size 64k;</p>
<p>fastcgi_buffers 4 64k;</p>
<p>fastcgi_busy_buffers_size 128k;</p>
<p>fastcgi_temp_file_write_size 256k;</p>
<p>fastcgi_pass 127.0.0.1:9000;</p>
<p>fastcgi_index index.php;</p>
<p>fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;</p>
<p>include fastcgi_params;</p>
<p>}</p>
<p>}</p>
<p>21）重载Nginx</p>
<p>root@ubuntu:~/zabbix-6.0.36# nginx -t</p>
<p>nginx: the configuration file /etc/nginx/nginx.conf syntax is ok</p>
<p>nginx: configuration file /etc/nginx/nginx.conf test is successful</p>
<p>root@ubuntu:~/zabbix-6.0.36# systemctl reload nginx</p>
<p>root@ubuntu:~/zabbix-6.0.36# systemctl status nginx</p>
<p>22）Zabbix Web配置</p>
<p>1、浏览器访问：<a href="http://172.16.80.195/，如下图所示">http://172.16.80.195/，如下图所示</a></p>
<p><img src="http://thunisoft.wiki/content/uploadfile/202412/fe071733203952.png" alt="" /><br />
<img src="http://thunisoft.wiki/content/uploadfile/202412/d9b61733203962.png" alt="" /></p>
<p>2、填写数据库主机、数据库端口、数据库名、用户名、密码</p>
<p><img src="http://thunisoft.wiki/content/uploadfile/202412/9a111733204076.png" alt="" /></p>
<p>3、填写Host、Port、Name</p>
<p><img src="http://thunisoft.wiki/content/uploadfile/202412/96751733204091.png" alt="" /><br />
<img src="http://thunisoft.wiki/content/uploadfile/202412/79d51733204100.png" alt="" /><br />
4、安装完成</p>
<p><img src="http://thunisoft.wiki/content/uploadfile/202412/5f3b1733204110.png" alt="" /></p>
<p>5、登录Zabbix</p>
<p># 默认用户名：Admin、密码：zabbix，如下图所示</p>
<p><img src="http://thunisoft.wiki/content/uploadfile/202412/afc81733204120.png" alt="" /></p>
<p><img src="http://thunisoft.wiki/content/uploadfile/202412/0b3e1733204197.png" alt="" /></p>
<p>6、修改界面语言为中文</p>
<p><img src="http://thunisoft.wiki/content/uploadfile/202412/12b91733204206.png" alt="" /><br />
<img src="http://thunisoft.wiki/content/uploadfile/202412/586e1733204215.png" alt="" /></p>]]></description>
    <pubDate>Mon, 02 Dec 2024 08:24:18 +0800</pubDate>
    <dc:creator>墨客</dc:creator>
    <guid>https://thunisoft.wiki/zabbix2.html</guid>
</item>
<item>
    <title>Linux安装lnmp环境+Zabbix 4.0 LTS</title>
    <link>https://thunisoft.wiki/zabbix.html</link>
    <description><![CDATA[<h4>一、lnmp简介</h4>
<p>LNMP代表的就是：Linux系统下Nginx+MySQL+PHP这种网站服务器架构。</p>
<p>Linux是一类Unix计算机操作系统的统称，是目前最流行的免费操作系统。代表版本有：debian、centos、ubuntu、fedora、gentoo等。</p>
<p>Nginx是一个高性能的HTTP和反向代理服务器，也是一个IMAP/POP3/SMTP代理服务器。</p>
<p>Mysql是一个小型关系型数据库管理系统。</p>
<p>PHP是一种在服务器端执行的嵌入HTML文档的脚本语言。</p>
<p>这四种软件均为免费开源软件，组合到一起，成为一个免费、高效、扩展性强的网站服务系统。</p>
<h4>二、Zabbix简介</h4>
<p>zabbix（[`zæbiks]）是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。</p>
<p>zabbix能监视各种网络参数，保证服务器系统的安全运营；并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。</p>
<p>zabbix由2部分构成，zabbix server与可选组件zabbix agent。</p>
<p>zabbix server可以通过SNMP、zabbix agent、ping端口监视等方法提供对远程服务器/网络状态的监视，数据收集等功能，它可以运行在Linux，Solaris，HP-UX，AIX，Free BSD，Open BSD，OS X等平台上。</p>
<h4>三、Centos 7安装lnmp、zabbix</h4>
<h5><strong>1**</strong>、**Yum安装Nginx</h5>
<p>1）配置Centos 7 Nginx Yum源仓库</p>
<p>[root@localhost ~]# rpm -Uvh <a href="http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm">http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm</a></p>
<p>Retrieving <a href="http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm">http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm</a></p>
<p>warning: /var/tmp/rpm-tmp.PiXlZn: Header V4 RSA/SHA1 Signature, key ID 7bd9bf62: NOKEY</p>
<p>Preparing... ################################# [100%]</p>
<p>Updating / installing...</p>
<p>1:nginx-release-centos-7-0.el7.ngx ################################# [100%]</p>
<p>2）安装Nginx</p>
<p>[root@localhost ~]# yum -y install nginx</p>
<p><a href="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ1.png"><img src="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ1.png" alt="" /></a></p>
<p>3）启动Nginx</p>
<p>[root@localhost ~]# systemctl start nginx</p>
<p>4）访问Nginx</p>
<p><a href="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ2.png"><img src="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ2.png" alt="" /></a></p>
<p>5）Nginx默认地址和配置</p>
<p>/etc/nginx/nginx.conf # Yum安装Nginx默认主配置文件</p>
<p>/usr/share/nginx/html # Nginx默认存放目录</p>
<p>/usr/share/nginx/html/index.html # Nginx默认主页路径</p>
<p>6）常用基本操作</p>
<p>1、启动Nginx</p>
<p>[root@localhost ~]# systemctl start nginx</p>
<p>2、停止Nginx</p>
<p>[root@localhost ~]# systemctl stop nginx</p>
<p>3、重载Nginx</p>
<p>[root@localhost ~]# systemctl reload nginx</p>
<p>4、重启Nginx</p>
<p>[root@localhost ~]# systemctl restart nginx</p>
<p>5、查询Nginx运行状态</p>
<p>[root@localhost ~]# systemctl status nginx</p>
<p>6、查询Nginx进程</p>
<p>[root@localhost ~]# ps -ef |grep nginx</p>
<p>7、查询Nginx监听端口</p>
<p>[root@localhost ~]# netstat -lntup |grep nginx</p>
<p>8、卸载Nginx</p>
<p>[root@localhost ~]# yum -y remove nginx</p>
<p>9、RPM方式安装升级指定版本Nginx</p>
<p>[root@localhost ~]# rpm -Uvh <a href="http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.22.0-1.el7.ngx.x86_64.rpm">http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.22.0-1.el7.ngx.x86_64.rpm</a></p>
<h5><strong>2**</strong>、**Yum安装MySQL</h5>
<p>1）配置清华大学Yum源</p>
<p>[root@localhost ~]# vim /etc/yum.repos.d/mysql-community.repo</p>
<pre><code class="language-shell">[mysql-connectors-community]
name=MySQL Connectors Community
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-connectors-community-el7-$basearch/
enabled=1
gpgcheck=1
gpgkey=https://repo.mysql.com/RPM-GPG-KEY-mysql

[mysql-tools-community]
name=MySQL Tools Community
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-tools-community-el7-$basearch/
enabled=1
gpgcheck=1
gpgkey=https://repo.mysql.com/RPM-GPG-KEY-mysql

[mysql-5.7-community]
name=MySQL 5.7 Community Server
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-5.7-community-el7-$basearch/
enabled=1
gpgcheck=0
gpgkey=https://repo.mysql.com/RPM-GPG-KEY-mysql</code></pre>
<p>2）安装MySQL-5.7</p>
<p>[root@localhost ~]# yum -y install mysql-community-server</p>
<p>3）启动MySQL</p>
<p>[root@localhost ~]# systemctl start mysqld</p>
<p>4）登录MySQL</p>
<p>1、查看初始化后生成的密码</p>
<p>[root@localhost ~]# grep 'password' /var/log/mysqld.log</p>
<p>2023-03-25T12:54:39.593636Z 1 [Note] A temporary password is generated for root@localhost: hiPZY4U6yZ_6</p>
<p>2、登录MySQL</p>
<p>[root@localhost ~]# mysql -uroot -p'hiPZY4U6yZ_6'</p>
<p>mysql: [Warning] Using a password on the command line interface can be insecure.</p>
<p>Welcome to the MySQL monitor. Commands end with ; or \g.</p>
<p>Your MySQL connection id is 2</p>
<p>Server version: 5.7.41</p>
<p>Copyright (c) 2000, 2023, Oracle and/or its affiliates.</p>
<p>Oracle is a registered trademark of Oracle Corporation and/or its</p>
<p>affiliates. Other names may be trademarks of their respective</p>
<p>owners.</p>
<p>Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.</p>
<p># 初始化后需重置密码才能执行sql</p>
<p>mysql&gt; set password=password('Aa123456@!');</p>
<p>Query OK, 0 rows affected, 1 warning (0.00 sec)</p>
<p>mysql&gt; flush privileges;</p>
<p>Query OK, 0 rows affected (0.00 sec)</p>
<p>mysql&gt; exit</p>
<p># 验证修改后的密码是否正常登陆</p>
<p>[root@localhost ~]# mysql -uroot -p'Aa123456@!'</p>
<p>mysql: [Warning] Using a password on the command line interface can be insecure.</p>
<p>Welcome to the MySQL monitor. Commands end with ; or \g.</p>
<p>Your MySQL connection id is 4</p>
<p>Server version: 5.7.41 MySQL Community Server (GPL)</p>
<p>Copyright (c) 2000, 2023, Oracle and/or its affiliates.</p>
<p>Oracle is a registered trademark of Oracle Corporation and/or its</p>
<p>affiliates. Other names may be trademarks of their respective</p>
<p>owners.</p>
<p>Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.</p>
<p>mysql&gt; select version();</p>
<p>+------------+</p>
<p>| version()|</p>
<p>+------------+</p>
<p>| 5.7.41 |</p>
<p>+------------+</p>
<p>1 row in set (0.00 sec)</p>
<h5><strong>3**</strong>、**Yum安装PHP</h5>
<p>1）安装remi扩展源</p>
<p>remi源是Remi repository是包含最新版本PHP和MySQL包的Linux源，由Remi 提供维护。有这个源之后，使用YUM安装或更新PHP、MySQL、phpMyAdmin等服务器相关程序的时候就非常方便了。</p>
<p>[root@localhost ~]# yum -y install epel-release</p>
<p>[root@localhost ~]# yum -y install <a href="http://rpms.remirepo.net/enterprise/remi-release-7.rpm">http://rpms.remirepo.net/enterprise/remi-release-7.rpm</a></p>
<p>2）安装YUM管理工具</p>
<p>[root@localhost ~]# yum -y install yum-utils</p>
<p>3）安装PHP</p>
<p>[root@localhost ~]# yum -y install php74-php-cli php74-php-common php74-php-devel php74-php-embedded php74-php-fpm php74-php-gd php74-php-mbstring php74-php-mysqlnd php74-php-pdo php74-php-opcache php74-php-xml php74-php-soap php74-php-bcmath</p>
<p>4）查看是否安装成功及php配置文件以及对应目录</p>
<p>[root@localhost ~]# rpm -qa |grep php74</p>
<p>[root@localhost ~]# rpm -ql php74-php-fpm</p>
<p><a href="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ3.png"><img src="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ3.png" alt="Linux安装lnmp环境+Zabbix 4.0 LTS-图片1" /></a></p>
<p>5）建立软连接</p>
<p>[root@localhost ~]# ln -sf /opt/remi/php74/root/usr/bin/php* /usr/local/bin</p>
<p>6）查看PHP版本</p>
<p>[root@localhost ~]# php -v</p>
<p>PHP 7.4.33 (cli) (built: Feb 14 2023 08:49:52) ( NTS )</p>
<p>Copyright (c) The PHP Group</p>
<p>Zend Engine v3.4.0, Copyright (c) Zend Technologies</p>
<p>with Zend OPcache v7.4.33, Copyright (c), by Zend Technologies</p>
<p>7）启动PHP-FPM</p>
<p>[root@localhost ~]# systemctl start php74-php-fpm</p>
<p>8）设置开机自启动</p>
<p>[root@localhost ~]# systemctl enable php74-php-fpm</p>
<p>9）常用基本操作</p>
<p>1、启动PHP</p>
<p>[root@localhost ~]# systemctl start php74-php-fpm</p>
<p>2、停止PHP</p>
<p>[root@localhost ~]# systemctl stop php74-php-fpm</p>
<p>3、重载PHP</p>
<p>[root@localhost ~]# systemctl reload php74-php-fpm</p>
<p>4、重启PHP</p>
<p>[root@localhost ~]# systemctl restart php74-php-fpm</p>
<p>5、查询PHP运行状态</p>
<p>[root@localhost ~]# systemctl status php74-php-fpm</p>
<p>6、查询PHP进程</p>
<p>[root@localhost ~]# ps -ef |grep php-fpm</p>
<p>7、查询PHP监听端口</p>
<p>[root@localhost ~]# netstat -lntup |grep php-fpm</p>
<p>8、卸载PHP</p>
<p>[root@localhost ~]# yum -y remove php74*</p>
<h5><strong>4**</strong>、**源码安装Zabbix 4.0 LTS</h5>
<p>1）安装依赖包</p>
<p>[root@localhost ~]# yum -y install wget net-snmp net-snmp-devel perl-DBI curl curl-devel libevent libevent-devel gcc gcc-c++ mysql-devel pcre pcre-devel OpenIPMI-devel</p>
<p>2）下载Zabbix软件包</p>
<p>[root@localhost ~]# wget <a href="https://cdn.zabbix.com/zabbix/sources/stable/4.0/zabbix-4.0.44.tar.gz">https://cdn.zabbix.com/zabbix/sources/stable/4.0/zabbix-4.0.44.tar.gz</a></p>
<p>3）解压</p>
<p>[root@localhost ~]# tar xf zabbix-4.0.44.tar.gz</p>
<p>4）预编译</p>
<p>[root@localhost ~]# cd zabbix-4.0.44</p>
<p>[root@localhost zabbix-4.0.44]# ./configure --prefix=/usr/local/zabbix --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2 --with-openipmi</p>
<p>5）安装Zabbix</p>
<p>[root@localhost zabbix-4.0.44]# make install</p>
<p>6）配置Zabbix</p>
<p>1、备份配置文件</p>
<p>[root@localhost zabbix-4.0.44]# cp /usr/local/zabbix/etc/zabbix_server.conf{,_bak}</p>
<p>[root@localhost zabbix-4.0.44]# cp /usr/local/zabbix/etc/zabbix_agentd.conf{,_bak}</p>
<p>2、创建软链接</p>
<p>[root@localhost zabbix-4.0.44]# ln -sf /usr/local/zabbix/sbin/zabbix_* /usr/local/sbin</p>
<p>3、拷贝Web到Nginx发布目录</p>
<p>[root@localhost zabbix-4.0.44]# cp -a frontends/php /usr/share/nginx/html/zabbix</p>
<p>4、授权</p>
<p>[root@localhost zabbix-4.0.44]# chown -R nginx.nginx /usr/share/nginx/html/zabbix</p>
<p>5、配置Zabbix Server</p>
<p>[root@localhost zabbix-4.0.44]# vim /usr/local/zabbix/etc/zabbix_server.conf</p>
<pre><code class="language-shell">LogFile=/tmp/zabbix_server.log
PidFile=/tmp/zabbix_server.pid
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=Aa123456@
Timeout=30
LogSlowQueries=3000</code></pre>
<p>6、配置Zabbix Agentd</p>
<p>[root@localhost zabbix-4.0.44]# vim /usr/local/zabbix/etc/zabbix_agentd.conf</p>
<pre><code class="language-shell">LogFile=/tmp/zabbix_agentd.log
Server=localhost
ServerActive=localhost
Hostname=172.16.80.199
EnableRemoteCommands=1
UnsafeUserParameters=1
LogFileSize=10
Timeout=30</code></pre>
<p>7、配置系统服务</p>
<p>[root@localhost zabbix-4.0.44]# cp misc/init.d/tru64/zabbix_* /etc/init.d</p>
<p>[root@localhost zabbix-4.0.44]# chmod +x /etc/init.d/zabbix_*</p>
<p>8、创建Zabbix用户</p>
<p>[root@localhost zabbix-4.0.44]# useradd -s /sbin/nologin zabbix</p>
<p>9、创建Zabbix数据库</p>
<p>[root@localhost zabbix-4.0.44]# mysql -hlocalhost -uroot -p'Aa123456@!' 2&gt;/dev/null -e &quot;create database zabbix character set utf8 collate utf8_bin;&quot;</p>
<p>[root@localhost zabbix-4.0.44]# mysql -hlocalhost -uroot -p'Aa123456@!' 2&gt;/dev/null -e &quot;grant all on zabbix.* to zabbix@'localhost' identified by 'Aa123456@';&quot;</p>
<p>[root@localhost zabbix-4.0.44]# mysql -hlocalhost -uroot -p'Aa123456@!' 2&gt;/dev/null -e &quot;flush privileges;&quot;</p>
<p>10、导入Zabbix数据和创建表</p>
<p>[root@localhost zabbix-4.0.44]# mysql -hlocalhost -uzabbix -pAa123456@ 2&gt;/dev/null zabbix</p>
<p>[root@localhost zabbix-4.0.44]# mysql -hlocalhost -uzabbix -pAa123456@ 2&gt;/dev/null zabbix</p>
<p>[root@localhost zabbix-4.0.44]# mysql -hlocalhost -uzabbix -pAa123456@ 2&gt;/dev/null zabbix</p>
<p>11、启动Zabbix Server和Zabbix Agentd</p>
<p>[root@localhost zabbix-4.0.44]# /etc/init.d/zabbix_server start</p>
<p>Zabbix server started.</p>
<p>[root@localhost zabbix-4.0.44]# /etc/init.d/zabbix_agentd start</p>
<p>Zabbix agent started.</p>
<p>12、查看Zabbix Server和Zabbix Agentd监听端口</p>
<p>[root@localhost zabbix-4.0.44]# netstat -lntup |egrep &quot;10050|10051&quot;</p>
<p>13、配置开机自启动</p>
<p>[root@localhost zabbix-4.0.44]# sed -i '/#!\/bin\/sh/a#chkconfig: - 30 90' /etc/init.d/zabbix_server</p>
<p>[root@localhost zabbix-4.0.44]# sed -i '/#!\/bin\/sh/a#description: Zabbix Server' /etc/init.d/zabbix_server</p>
<p>[root@localhost zabbix-4.0.44]# chkconfig --add zabbix_server</p>
<p>[root@localhost zabbix-4.0.44]# chkconfig zabbix_server on</p>
<p>[root@localhost zabbix-4.0.44]# sed -i '/#!\/bin\/sh/a#chkconfig: - 40 95' /etc/init.d/zabbix_agentd</p>
<p>[root@localhost zabbix-4.0.44]# sed -i '/#!\/bin\/sh/a#description: Zabbix Agentd' /etc/init.d/zabbix_agentd</p>
<p>[root@localhost zabbix-4.0.44]# chkconfig --add zabbix_agentd</p>
<p>[root@localhost zabbix-4.0.44]# chkconfig zabbix_agentd on</p>
<p>7）配置nginx.conf</p>
<p>[root@localhost ~]# vim /etc/nginx/nginx.conf</p>
<pre><code class="language-shell">    user nginx nginx;
    worker_processes auto;
    pid /var/run/nginx.pid;
events {
    use epoll;
    worker_connections 10240;
    multi_accept on;
    }
http {
    include       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;
    error_log /var/log/nginx/error.log warn;
    sendfile        on;
    tcp_nopush          on;
    keepalive_timeout  120;
    tcp_nodelay         on;
    server_tokens off;
    gzip    on;
    gzip_min_length 1k;
    gzip_buffers    4 64k;
    gzip_http_version 1.1;
    gzip_comp_level 4;
    gzip_types      text/plain application/x-javascript text/css application/xml;
    gzip_vary       on;
    client_max_body_size 10m;
    client_body_buffer_size 128k;
    proxy_connect_timeout 90;
    proxy_send_timeout 90;
    proxy_buffer_size 4k;
    proxy_buffers 4 32k;
    proxy_busy_buffers_size 64k;
    large_client_header_buffers 4 4k;
    client_header_buffer_size 4k;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 1;
server {
    listen  80;
    server_name localhost;
    location / {
    root    /usr/share/nginx/html/zabbix;
    index index.php index.html index.htm;
    }
    location ~* \.php$ {
    root    /usr/share/nginx/html/zabbix;
    fastcgi_connect_timeout 300s;
    fastcgi_send_timeout 300s;
    fastcgi_read_timeout 300s;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 256k;
    fastcgi_pass    127.0.0.1:9000;
    fastcgi_index   index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }
  }
}</code></pre>
<p>8）重载Nginx</p>
<p>[root@localhost zabbix-4.0.44]# systemctl reload nginx</p>
<p>9）配置php.ini</p>
<p>[root@localhost zabbix-4.0.44]# sed -i 's/post_max_size = 8M/post_max_size = 16M/' /etc/opt/remi/php74/php.ini</p>
<p>[root@localhost zabbix-4.0.44]# sed -i 's/max_execution_time = 30/max_execution_time = 300/' /etc/opt/remi/php74/php.ini</p>
<p>[root@localhost zabbix-4.0.44]# sed -i 's/max_input_time = 60/max_input_time = 300/' /etc/opt/remi/php74/php.ini</p>
<p>[root@localhost zabbix-4.0.44]# sed -i 's#;date.timezone =#date.timezone = Asia/Shanghai#' /etc/opt/remi/php74/php.ini</p>
<p>[root@localhost zabbix-4.0.44]# sed -i 's/apache/nginx/g' /etc/opt/remi/php74/php-fpm.d/www.conf</p>
<p>10）重载php-fpm</p>
<p>[root@localhost zabbix-4.0.44]# systemctl reload php74-php-fpm</p>
<p>[root@localhost zabbix-4.0.44]# chown -R nginx.nginx /var/opt/remi/php74/lib/php/session</p>
<p>11）Zabbix安装配置</p>
<p>1、浏览器访问：<a href="http://172.16.80.199/，如下图所示">http://172.16.80.199/，如下图所示</a></p>
<p><a href="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ4.png"><img src="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ4.png" alt="" /></a></p>
<p><a href="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ5.png"><img src="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ5.png" alt="" /></a></p>
<p>2、填写数据库主机、数据库端口、数据库名、用户名、密码</p>
<p><a href="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ6.png"><img src="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ6.png" alt="" /></a></p>
<p>3、填写Host、Port、Name</p>
<p><a href="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ7.png"><img src="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ7.png" alt="" /></a></p>
<p><a href="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ8.png"><img src="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ8.png" alt="" /></a></p>
<p>4、安装完成</p>
<p><a href="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ9.png"><img src="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ9.png" alt="" /></a></p>
<p>5、登录Zabbix</p>
<p># 默认用户名：Admin、密码：zabbix，如下图所示</p>
<p><a href="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ10.png"><img src="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ10.png" alt="" /></a></p>
<p><a href="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ11.png"><img src="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ11.png" alt="" /></a></p>
<p>6、修改界面语言为中文</p>
<p><a href="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ12.png"><img src="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ12.png" alt="" /></a></p>
<p><a href="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ13.png"><img src="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ13.png" alt="" /></a></p>
<h4>四、Centos 6安装lnmp、zabbix</h4>
<h5><strong>1**</strong>、**Yum安装Nginx</h5>
<p>1）配置Centos 6 Nginx Yum源仓库</p>
<p>[root@localhost ~]# rpm -Uvh <a href="http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm">http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm</a></p>
<p>Retrieving <a href="http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm">http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm</a></p>
<p>warning: /var/tmp/rpm-tmp.xRiIYI: Header V4 RSA/SHA1 Signature, key ID 7bd9bf62: NOKEY</p>
<p>Preparing... ########################################### [100%]</p>
<p>1:nginx-release-centos ########################################### [100%]</p>
<p>2）安装Nginx</p>
<p>[root@localhost ~]# yum -y install nginx</p>
<p><a href="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ14.png"><img src="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ14.png" alt="" /></a></p>
<p>3）启动Nginx</p>
<p>[root@localhost ~]# /etc/init.d/nginx start</p>
<p>4）访问Nginx</p>
<p><a href="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ15.png"><img src="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ15.png" alt="" /></a></p>
<p>5）Nginx默认地址和配置</p>
<p>/etc/nginx/nginx.conf # Yum安装Nginx默认主配置文件</p>
<p>/usr/share/nginx/html # Nginx默认存放目录</p>
<p>/usr/share/nginx/html/index.html # Nginx默认主页路径</p>
<p>6）常用基本操作</p>
<p>1、启动Nginx</p>
<p>[root@localhost ~]# /etc/init.d/nginx start</p>
<p>2、停止Nginx</p>
<p>[root@localhost ~]# /etc/init.d/nginx stop</p>
<p>3、重载Nginx</p>
<p>[root@localhost ~]# /etc/init.d/nginx reload</p>
<p>4、重启Nginx</p>
<p>[root@localhost ~]# /etc/init.d/nginx restart</p>
<p>5、查询Nginx运行状态</p>
<p>[root@localhost ~]# /etc/init.d/nginx status</p>
<p>6、查询Nginx进程</p>
<p>[root@localhost ~]# ps -ef |grep nginx</p>
<p>7、查询Nginx监听端口</p>
<p>[root@localhost ~]# netstat -lntup |grep nginx</p>
<p>8）卸载Nginx</p>
<p>[root@localhost ~]# yum -y remove nginx</p>
<p>9）RPM方式安装升级指定版本Nginx</p>
<p>[root@localhost ~]# rpm -Uvh <a href="http://nginx.org/packages/centos/6/x86\_64/RPMS/nginx-1.18.0-1.el6.ngx.x86\_64.rpm">http://nginx.org/packages/centos/6/x86\_64/RPMS/nginx-1.18.0-1.el6.ngx.x86\_64.rpm</a></p>
<h5><strong>2**</strong>、**Yum安装MySQL</h5>
<p>1）配置清华大学Yum源</p>
<p>[root@localhost ~]# vim /etc/yum.repos.d/mysql-community.repo</p>
<pre><code class="language-shell">[mysql-connectors-community]
name=MySQL Connectors Community
baseurl=http://repo.mysql.com/yum/mysql-connectors-community/el/6/$basearch
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

[mysql-tools-community]
name=MySQL Tools Community
baseurl=http://repo.mysql.com/yum/mysql-tools-community/el/6/$basearch
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

[mysql-5.7-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/6/$basearch
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql</code></pre>
<p>2）安装MySQL-5.7</p>
<p>[root@localhost ~]# yum -y install mysql-community-server</p>
<p>3）启动MySQL</p>
<p>[root@localhost ~]# service mysqld start</p>
<p>4）登录MySQL</p>
<p>1、查看初始化后生成的密码</p>
<p>[root@localhost ~]# grep 'password' /var/log/mysqld.log</p>
<p>2023-03-25T12:55:13.893771Z 1 [Note] A temporary password is generated for root@localhost: GTP9ME3Pfb=y</p>
<p>2、登录MySQL</p>
<p>[root@localhost ~]# mysql -uroot -p'GTP9ME3Pfb=y'</p>
<p>mysql: [Warning] Using a password on the command line interface can be insecure.</p>
<p>Welcome to the MySQL monitor. Commands end with ; or \g.</p>
<p>Your MySQL connection id is 4</p>
<p>Server version: 5.7.41</p>
<p>Copyright (c) 2000, 2023, Oracle and/or its affiliates.</p>
<p>Oracle is a registered trademark of Oracle Corporation and/or its</p>
<p>affiliates. Other names may be trademarks of their respective</p>
<p>owners.</p>
<p>Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.</p>
<p># 初始化后需重置密码才能执行sql</p>
<p>mysql&gt; set password=password('Aa123456@!');</p>
<p>Query OK, 0 rows affected, 1 warning (0.00 sec)</p>
<p>mysql&gt; flush privileges;</p>
<p>Query OK, 0 rows affected (0.00 sec)</p>
<p>mysql&gt; exit</p>
<p># 验证修改后的密码是否正常登陆</p>
<p>[root@localhost ~]# mysql -uroot -p'Aa123456@!'</p>
<p>mysql: [Warning] Using a password on the command line interface can be insecure.</p>
<p>Welcome to the MySQL monitor. Commands end with ; or \g.</p>
<p>Your MySQL connection id is 4</p>
<p>Server version: 5.7.41 MySQL Community Server (GPL)</p>
<p>Copyright (c) 2000, 2023, Oracle and/or its affiliates.</p>
<p>Oracle is a registered trademark of Oracle Corporation and/or its</p>
<p>affiliates. Other names may be trademarks of their respective</p>
<p>owners.</p>
<p>Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.</p>
<p>mysql&gt; select version();</p>
<p>+------------+</p>
<p>| version()|</p>
<p>+------------+</p>
<p>| 5.7.41 |</p>
<p>+------------+</p>
<p>1 row in set (0.00 sec)</p>
<h5><strong>3**</strong>、**Yum安装PHP</h5>
<p>1）安装remi扩展源</p>
<p>remi源是Remi repository是包含最新版本PHP和MySQL包的Linux源，由Remi 提供维护。有这个源之后，使用YUM安装或更新PHP、MySQL、phpMyAdmin等服务器相关程序的时候就非常方便了。</p>
<p>[root@localhost ~]# yum -y install epel-release</p>
<p>[root@localhost ~]# yum -y install <a href="http://rpms.remirepo.net/enterprise/remi-release-6.rpm">http://rpms.remirepo.net/enterprise/remi-release-6.rpm</a></p>
<p>2）安装YUM管理工具</p>
<p>[root@localhost ~]# yum -y install yum-utils</p>
<p>3）安装PHP</p>
<p>[root@localhost ~]# yum -y install php73-php-cli php73-php-common php73-php-devel php73-php-embedded php73-php-fpm php73-php-gd php73-php-mbstring php73-php-mysqlnd php73-php-pdo php73-php-opcache php73-php-xml php73-php-soap php73-php-bcmath</p>
<p>4）查看是否安装成功及php配置文件以及对应目录</p>
<p>[root@localhost ~]# rpm -qa |grep php73</p>
<p>[root@localhost ~]# rpm -ql php73-php-fpm</p>
<p><a href="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ16.png"><img src="https://www.yangxingzhen.com/wp-content/uploads/2023/03/032723_0736_LinuxlnmpZ16.png" alt="Linux安装lnmp环境+Zabbix 4.0 LTS-图片2" /></a></p>
<p>5）建立软连接</p>
<p>[root@localhost ~]# ln -sf /opt/remi/php73/root/usr/bin/php* /usr/local/bin</p>
<p>6）查看PHP版本</p>
<p>[root@localhost ~]# php -v</p>
<p>PHP 7.3.25 (cli) (built: Nov 24 2020 14:22:04) ( NTS )</p>
<p>Copyright (c) 1997-2018 The PHP Group</p>
<p>Zend Engine v3.3.25, Copyright (c) 1998-2018 Zend Technologies</p>
<p>with Zend OPcache v7.3.25, Copyright (c) 1999-2018, by Zend Technologies</p>
<p>7）启动PHP-FPM</p>
<p>[root@localhost ~]# service php73-php-fpm start</p>
<p>8）设置开机自启动</p>
<p>[root@localhost ~]# chkconfig php73-php-fpm on</p>
<p>9）常用基本操作</p>
<p>1、启动PHP</p>
<p>[root@localhost ~]# service php73-php-fpm start</p>
<p>2、停止PHP</p>
<p>[root@localhost ~]# service php73-php-fpm stop</p>
<p>3、重载PHP</p>
<p>[root@localhost ~]# service php73-php-fpm reload</p>
<p>4、重启PHP</p>
<p>[root@localhost ~]# service php73-php-fpm restart</p>
<p>5、查询PHP运行状态</p>
<p>[root@localhost ~]# service php73-php-fpm status</p>
<p>6、查询PHP进程</p>
<p>[root@localhost ~]# ps -ef |grep php-fpm</p>
<p>7、查询PHP监听端口</p>
<p>[root@localhost ~]# netstat -lntup |grep php-fpm</p>
<p>8、卸载PHP</p>
<p>[root@localhost ~]# yum -y remove php73*</p>
<h5><strong>4**</strong>、**源码安装Zabbix 4.0 LTS</h5>
<p>1）安装依赖包</p>
<p>[root@localhost ~]# yum -y install wget net-snmp net-snmp-devel perl-DBI curl curl-devel libevent libevent-devel gcc gcc-c++ mysql-devel pcre pcre-devel OpenIPMI-devel</p>
<p>2）下载Zabbix软件包</p>
<p>[root@localhost ~]# wget <a href="https://cdn.zabbix.com/zabbix/sources/stable/4.0/zabbix-4.0.44.tar.gz">https://cdn.zabbix.com/zabbix/sources/stable/4.0/zabbix-4.0.44.tar.gz</a></p>
<p>3）解压</p>
<p>[root@localhost ~]# tar xf zabbix-4.0.44.tar.gz</p>
<p>4）预编译</p>
<p>[root@localhost ~]# cd zabbix-4.0.44</p>
<p>[root@localhost zabbix-4.0.44]# ./configure --prefix=/usr/local/zabbix --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2 --with-openipmi</p>
<p>5）安装Zabbix</p>
<p>[root@localhost zabbix-4.0.44]# make install</p>
<p>6）配置Zabbix</p>
<p>1、备份配置文件</p>
<p>[root@localhost zabbix-4.0.44]# cp /usr/local/zabbix/etc/zabbix_server.conf{,_bak}</p>
<p>[root@localhost zabbix-4.0.44]# cp /usr/local/zabbix/etc/zabbix_agentd.conf{,_bak}</p>
<p>2、创建软链接</p>
<p>[root@localhost zabbix-4.0.44]# ln -sf /usr/local/zabbix/sbin/zabbix_* /usr/local/sbin</p>
<p>3、拷贝Web到Nginx发布目录</p>
<p>[root@localhost zabbix-4.0.44]# cp -a frontends/php /usr/share/nginx/html/zabbix</p>
<p>4、授权</p>
<p>[root@localhost zabbix-4.0.44]# chown -R nginx.nginx /usr/share/nginx/html/zabbix</p>
<p>5、配置Zabbix Server</p>
<p>[root@localhost zabbix-4.0.44]# vim /usr/local/zabbix/etc/zabbix_server.conf</p>
<pre><code class="language-shell">LogFile=/tmp/zabbix_server.log
PidFile=/tmp/zabbix_server.pid
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=Aa123456@
Timeout=30
LogSlowQueries=3000</code></pre>
<p>6、配置Zabbix Agentd</p>
<p>[root@localhost zabbix-4.0.44]# vim /usr/local/zabbix/etc/zabbix_agentd.conf</p>
<pre><code class="language-shell">LogFile=/tmp/zabbix_agentd.log
Server=localhost
ServerActive=localhost
Hostname=172.16.80.195
EnableRemoteCommands=1
UnsafeUserParameters=1
LogFileSize=10
Timeout=30</code></pre>
<p>7、配置系统服务</p>
<p>[root@localhost zabbix-4.0.44]# cp misc/init.d/tru64/zabbix_* /etc/init.d</p>
<p>[root@localhost zabbix-4.0.44]# chmod +x /etc/init.d/zabbix_*</p>
<p>8、创建Zabbix用户</p>
<p>[root@localhost zabbix-4.0.44]# useradd -s /sbin/nologin zabbix</p>
<p>9、创建Zabbix数据库</p>
<p>[root@localhost zabbix-4.0.44]# mysql -hlocalhost -uroot -p'Aa123456@!' 2&gt;/dev/null -e &quot;create database zabbix character set utf8 collate utf8_bin;&quot;</p>
<p>[root@localhost zabbix-4.0.44]# mysql -hlocalhost -uroot -p'Aa123456@!' 2&gt;/dev/null -e &quot;grant all on zabbix.* to zabbix@'localhost' identified by 'Aa123456@';&quot;</p>
<p>[root@localhost zabbix-4.0.44]# mysql -hlocalhost -uroot -p'Aa123456@!' 2&gt;/dev/null -e &quot;flush privileges;&quot;</p>
<p>10、导入Zabbix数据和创建表</p>
<p>[root@localhost zabbix-4.0.44]# mysql -hlocalhost -uzabbix -pAa123456@ 2&gt;/dev/null zabbix</p>
<p>[root@localhost zabbix-4.0.44]# mysql -hlocalhost -uzabbix -pAa123456@ 2&gt;/dev/null zabbix</p>
<p>[root@localhost zabbix-4.0.44]# mysql -hlocalhost -uzabbix -pAa123456@ 2&gt;/dev/null zabbix</p>
<p>11、启动Zabbix Server和Zabbix Agentd</p>
<p>[root@localhost zabbix-4.0.44]# /etc/init.d/zabbix_server start</p>
<p>Zabbix server started.</p>
<p>[root@localhost zabbix-4.0.44]# /etc/init.d/zabbix_agentd start</p>
<p>Zabbix agent started.</p>
<p>12、查看Zabbix Server和Zabbix Agentd监听端口</p>
<p>[root@localhost zabbix-4.0.44]# netstat -lntup |egrep &quot;10050|10051&quot;</p>
<p>13、配置开机自启动</p>
<p>[root@localhost zabbix-4.0.44]# sed -i '/#!\/bin\/sh/a#chkconfig: - 30 90' /etc/init.d/zabbix_server</p>
<p>[root@localhost zabbix-4.0.44]# sed -i '/#!\/bin\/sh/a#description: Zabbix Server' /etc/init.d/zabbix_server</p>
<p>[root@localhost zabbix-4.0.44]# chkconfig --add zabbix_server</p>
<p>[root@localhost zabbix-4.0.44]# chkconfig zabbix_server on</p>
<p>[root@localhost zabbix-4.0.44]# sed -i '/#!\/bin\/sh/a#chkconfig: - 40 95' /etc/init.d/zabbix_agentd</p>
<p>[root@localhost zabbix-4.0.44]# sed -i '/#!\/bin\/sh/a#description: Zabbix Agentd' /etc/init.d/zabbix_agentd</p>
<p>[root@localhost zabbix-4.0.44]# chkconfig --add zabbix_agentd</p>
<p>[root@localhost zabbix-4.0.44]# chkconfig zabbix_agentd on</p>
<p>7）配置nginx.conf</p>
<p>[root@localhost zabbix-4.0.44]# vim /etc/nginx/nginx.conf</p>
<pre><code class="language-shell">    user nginx nginx;
    worker_processes auto;
    pid /var/run/nginx.pid;
events {
    use epoll;
    worker_connections 10240;
    multi_accept on;
    }
http {
    include       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;
    error_log /var/log/nginx/error.log warn;
    sendfile        on;
    tcp_nopush          on;
    keepalive_timeout  120;
    tcp_nodelay         on;
    server_tokens off;
    gzip    on;
    gzip_min_length 1k;
    gzip_buffers    4 64k;
    gzip_http_version 1.1;
    gzip_comp_level 4;
    gzip_types      text/plain application/x-javascript text/css application/xml;
    gzip_vary       on;
    client_max_body_size 10m;
    client_body_buffer_size 128k;
    proxy_connect_timeout 90;
    proxy_send_timeout 90;
    proxy_buffer_size 4k;
    proxy_buffers 4 32k;
    proxy_busy_buffers_size 64k;
    large_client_header_buffers 4 4k;
    client_header_buffer_size 4k;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 1;
server {
    listen  80;
    server_name localhost;
    location / {
    root    /usr/share/nginx/html/zabbix;
    index index.php index.html index.htm;
    }
    location ~* \.php$ {
    root    /usr/share/nginx/html/zabbix;
    fastcgi_connect_timeout 300s;
    fastcgi_send_timeout 300s;
    fastcgi_read_timeout 300s;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 256k;
    fastcgi_pass    127.0.0.1:9000;
    fastcgi_index   index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    }
  }
}</code></pre>
<p>8）重载Nginx</p>
<p>[root@localhost zabbix-4.0.44]# service nginx reload</p>
<p>9）配置php.ini</p>
<p>[root@localhost zabbix-4.0.44]# sed -i 's/post_max_size = 8M/post_max_size = 16M/' /etc/opt/remi/php73/php.ini</p>
<p>[root@localhost zabbix-4.0.44]# sed -i 's/max_execution_time = 30/max_execution_time = 300/' /etc/opt/remi/php73/php.ini</p>
<p>[root@localhost zabbix-4.0.44]# sed -i 's/max_input_time = 60/max_input_time = 300/' /etc/opt/remi/php73/php.ini</p>
<p>[root@localhost zabbix-4.0.44]# sed -i 's#;date.timezone =#date.timezone = Asia/Shanghai#' /etc/opt/remi/php73/php.ini</p>
<p>[root@localhost zabbix-4.0.44]# sed -i 's/apache/nginx/g' /etc/opt/remi/php73/php-fpm.d/www.conf</p>
<p>10）重载php-fpm</p>
<p>[root@localhost zabbix-4.0.44]# service php73-php-fpm reload</p>
<p>[root@localhost zabbix-4.0.44]# chown -R nginx.nginx /var/opt/remi/php73/lib/php/session</p>
<p>11）Zabbix安装配置</p>
<p>1、浏览器访问：<a href="http://172.16.80.195/，如下图所示">http://172.16.80.195/，如下图所示</a></p>
<p><img src="http://thunisoft.wiki/content/uploadfile/202412/fe071733203952.png" alt="" /><br />
<img src="http://thunisoft.wiki/content/uploadfile/202412/d9b61733203962.png" alt="" /></p>
<p>2、填写数据库主机、数据库端口、数据库名、用户名、密码</p>
<p><img src="http://thunisoft.wiki/content/uploadfile/202412/9a111733204076.png" alt="" /></p>
<p>3、填写Host、Port、Name</p>
<p><img src="http://thunisoft.wiki/content/uploadfile/202412/96751733204091.png" alt="" /><br />
<img src="http://thunisoft.wiki/content/uploadfile/202412/79d51733204100.png" alt="" /><br />
4、安装完成</p>
<p><img src="http://thunisoft.wiki/content/uploadfile/202412/5f3b1733204110.png" alt="" /></p>
<p>5、登录Zabbix</p>
<p># 默认用户名：Admin、密码：zabbix，如下图所示</p>
<p><img src="http://thunisoft.wiki/content/uploadfile/202412/afc81733204120.png" alt="" /></p>
<p><img src="http://thunisoft.wiki/content/uploadfile/202412/0b3e1733204197.png" alt="" /></p>
<p>6、修改界面语言为中文</p>
<p><img src="http://thunisoft.wiki/content/uploadfile/202412/12b91733204206.png" alt="" /><br />
<img src="http://thunisoft.wiki/content/uploadfile/202412/586e1733204215.png" alt="" /></p>]]></description>
    <pubDate>Mon, 02 Dec 2024 08:18:24 +0800</pubDate>
    <dc:creator>墨客</dc:creator>
    <guid>https://thunisoft.wiki/zabbix.html</guid>
</item>
<item>
    <title>Linux（centos7.6）下升级python3.8</title>
    <link>https://thunisoft.wiki/?post=3</link>
    <description><![CDATA[<p>1.先去这个网址 <code>https://www.python.org/ftp/python/3.8.0/</code>,找到相应的版本，找到.tgz结尾的文件。<br />
2.我找到的是py3.8的，下载链接为<code>https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tgz</code> <strong><code>补充：最好以root身份登录，避免不必要的麻烦</code></strong><br />
3.去linux下找到一个下载的目录（任意都行），执行下面的代码</p>
<pre><code class="language-shell">wget https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tgz
# -C 后面的路径是你需要解压到的位置，根据实际情况填写即可,我这里是在/usr/local/python3
tar -zxvf Python-3.8.0.tgz -C  /usr/local/python3
# 将里面的文件 移动到python3文件夹中
mv /usr/local/python3/Python-3.8.0/* /usr/local/python3
# 删除Python-3.8.0文件夹
rm -rf /usr/local/python3/Python-3.8.0
</code></pre>
<p>4.先安装一个C的编辑器和一些必备环境，没有yum源自行百度，先进行搭建</p>
<pre><code class="language-shell">yum -y update
yum -y groupinstall "Development Tools"
yum -y install gcc openssl-devel bzip2-devel libffi-devel
yum -y install zlib*
</code></pre>
<p>如果是apt 就用这个</p>
<pre><code class="language-shell">sudo apt update
sudo apt install build-essential
sudo apt install gcc libssl-dev libbz2-dev libffi-dev
sudo apt install zlib1g-dev
</code></pre>
<p>5.进入python3文件夹,然后配置安装</p>
<pre><code class="language-shell">cd  /usr/local/python3
# --with-ssl 是配置https协议，--with-ensurepip=install是安装pip工具
./configure prefix=/usr/local/python3  --with-ssl --with-ensurepip=install
# 在编译前需要进行编译配置，./configure --enable-optimizations  --with-ssl --with-ensurepip=install，
#官方文档有提到加--enable-optimizations参数可以提升后期python百分之10的运行速度，不过我加上后发现会编译失败,所以去掉了
#如果你加了以后执行下面的命令报错了，可以执行 `make clean`,然后再执行` make &amp;&amp; make install `
make &amp;&amp; make install
</code></pre>
<p>6.备份原来的python链接，配置软连接</p>
<pre><code class="language-shell">cd /usr/bin
mv python python.bak
ln -s /usr/local/python3/bin/python3 /usr/bin/python
</code></pre>
<p>7.查看python版本 <code>python -V</code> 8.配置pip</p>
<pre><code class="language-shell"># 进入到python3的bin目录
cd /usr/local/python3/bin
</code></pre>
<pre><code class="language-shell"># 给pip3建立软连接为pip
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
</code></pre>
<p>之后输入<code>pip -V</code>,<code>pip3 -V</code>就都可以使用了 9.设置国内源（可自行百度，这里介绍方法和一个例子） <code>pip config</code>主要包含以下子命令：set、get、edit、list、unset。 <code>pip config set</code> 这个命令允许我们以name=value的形式配置某些项，比如设置镜像源：</p>
<pre><code class="language-shell">pip config set global.index-url https://mirrors.cloud.tencent.com/pypi/simple
</code></pre>
<p><code>pip config get</code> 这个命令允许我们查看某个配置项的值，比如查看镜像源配置：</p>
<pre><code class="language-shell">pip config get global.index-url
</code></pre>
<p>编辑配置文件采用这个命令：<code>pip config --editor=vi edit</code> 查看配置信息<code>pip config list</code></p>
<pre><code class="language-shell">global.index-url='https://mirrors.cloud.tencent.com/pypi/simple'
</code></pre>
<p><code>pip config unset</code> 这个命令允许我们删除一个配置，比如下面命令删除了镜像的配置：</p>
<pre><code class="language-shell">pip config unset global.index-url
</code></pre>
<p><code>最简单的方法是，输入:</code> <code>pip config --editor=vi edit</code>,然后把下面的复制过去，然后保存即可。</p>
<pre><code class="language-shell">[global]
index = https://pypi.tuna.tsinghua.edu.cn/
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn
timeout = 6000         
</code></pre>
<p>10.补充一下，yum是没法用了的问题，需要解决版本冲突问题 输入<code>vi /usr/libexec/urlgrabber-ext-down</code>，将python改为python2,修改第一行，然后退出保存</p>
<pre><code class="language-shell">#! /usr/bin/python2
</code></pre>
<p>修改yum的内容 输入<code>vim /usr/bin/yum</code>,将python改为python2,修改第一行，然后退出保存</p>
<pre><code class="language-shell">#! /usr/bin/python2
</code></pre>
<p>然后yum就可以使用了，如果不想改的话，可以升级yum，请自行百度，不做演示。</p>]]></description>
    <pubDate>Wed, 27 Nov 2024 11:50:44 +0800</pubDate>
    <dc:creator>墨客</dc:creator>
    <guid>https://thunisoft.wiki/?post=3</guid>
</item>
</channel>
</rss>