mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2025-02-08 01:20:07 +08:00
feat: 增加nginx状态页面
This commit is contained in:
parent
ff575e5963
commit
74b28cbf23
@ -1,6 +1,6 @@
|
|||||||
server {
|
server {
|
||||||
listen 80 default_server;
|
listen 80 ;
|
||||||
server_name _;
|
server_name 127.0.0.1;
|
||||||
charset utf-8;
|
charset utf-8;
|
||||||
default_type text/html;
|
default_type text/html;
|
||||||
|
|
||||||
@ -9,5 +9,10 @@ server {
|
|||||||
root /usr/share/nginx/html;
|
root /usr/share/nginx/html;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
location /nginx_status {
|
||||||
|
stub_status on;
|
||||||
|
access_log off;
|
||||||
|
}
|
||||||
|
|
||||||
root /usr/share/nginx/html;
|
root /usr/share/nginx/html;
|
||||||
}
|
}
|
@ -47,3 +47,13 @@ func (b *BaseApi) UpdateNginxConfigBy(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
helper.SuccessWithData(c, nil)
|
helper.SuccessWithData(c, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (b *BaseApi) GetNginxStatus(c *gin.Context) {
|
||||||
|
|
||||||
|
res, err := nginxService.GetStatus()
|
||||||
|
if err != nil {
|
||||||
|
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
helper.SuccessWithData(c, res)
|
||||||
|
}
|
||||||
|
@ -20,6 +20,16 @@ type NginxScopeReq struct {
|
|||||||
Scope NginxKey `json:"scope"`
|
Scope NginxKey `json:"scope"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type NginxStatus struct {
|
||||||
|
Active string `json:"active"`
|
||||||
|
Accepts string `json:"accepts"`
|
||||||
|
Handled string `json:"handled"`
|
||||||
|
Requests string `json:"requests"`
|
||||||
|
Reading string `json:"reading"`
|
||||||
|
Writing string `json:"writing"`
|
||||||
|
Waiting string `json:"waiting"`
|
||||||
|
}
|
||||||
|
|
||||||
type NginxKey string
|
type NginxKey string
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -1,10 +1,13 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"github.com/1Panel-dev/1Panel/backend/app/dto"
|
"github.com/1Panel-dev/1Panel/backend/app/dto"
|
||||||
"github.com/1Panel-dev/1Panel/backend/constant"
|
"github.com/1Panel-dev/1Panel/backend/constant"
|
||||||
|
"github.com/1Panel-dev/1Panel/backend/utils/cmd"
|
||||||
"github.com/1Panel-dev/1Panel/backend/utils/files"
|
"github.com/1Panel-dev/1Panel/backend/utils/files"
|
||||||
"path"
|
"path"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
type NginxService struct {
|
type NginxService struct {
|
||||||
@ -46,3 +49,25 @@ func (n NginxService) UpdateConfigByScope(req dto.NginxConfigReq) error {
|
|||||||
}
|
}
|
||||||
return updateHttpNginxConfig(getNginxParams(req.Params, keys))
|
return updateHttpNginxConfig(getNginxParams(req.Params, keys))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (n NginxService) GetStatus() (dto.NginxStatus, error) {
|
||||||
|
nginxInstall, err := getAppInstallByKey("nginx")
|
||||||
|
if err != nil {
|
||||||
|
return dto.NginxStatus{}, err
|
||||||
|
}
|
||||||
|
res, err := cmd.Exec(fmt.Sprintf("docker exec -i %s curl http://127.0.0.1/nginx_status", nginxInstall.ContainerName))
|
||||||
|
if err != nil {
|
||||||
|
return dto.NginxStatus{}, err
|
||||||
|
}
|
||||||
|
var status dto.NginxStatus
|
||||||
|
resArray := strings.Split(res, " ")
|
||||||
|
status.Active = resArray[2]
|
||||||
|
status.Accepts = resArray[7]
|
||||||
|
status.Handled = resArray[8]
|
||||||
|
status.Requests = resArray[9]
|
||||||
|
status.Reading = resArray[11]
|
||||||
|
status.Writing = resArray[13]
|
||||||
|
status.Waiting = resArray[15]
|
||||||
|
|
||||||
|
return status, nil
|
||||||
|
}
|
||||||
|
@ -18,5 +18,6 @@ func (a *NginxRouter) InitNginxRouter(Router *gin.RouterGroup) {
|
|||||||
groupRouter.GET("", baseApi.GetNginx)
|
groupRouter.GET("", baseApi.GetNginx)
|
||||||
groupRouter.POST("/scope", baseApi.GetNginxConfigByScope)
|
groupRouter.POST("/scope", baseApi.GetNginxConfigByScope)
|
||||||
groupRouter.POST("/update", baseApi.UpdateNginxConfigBy)
|
groupRouter.POST("/update", baseApi.UpdateNginxConfigBy)
|
||||||
|
groupRouter.GET("/status", baseApi.GetNginxStatus)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,4 +14,14 @@ export namespace Nginx {
|
|||||||
scope: string;
|
scope: string;
|
||||||
params?: any;
|
params?: any;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface NginxStatus {
|
||||||
|
accepts: string;
|
||||||
|
handled: string;
|
||||||
|
active: string;
|
||||||
|
requests: string;
|
||||||
|
reading: string;
|
||||||
|
writing: string;
|
||||||
|
waiting: string;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,3 +13,7 @@ export const GetNginxConfigByScope = (req: Nginx.NginxScopeReq) => {
|
|||||||
export const UpdateNginxConfigByScope = (req: Nginx.NginxConfigReq) => {
|
export const UpdateNginxConfigByScope = (req: Nginx.NginxConfigReq) => {
|
||||||
return http.post<any>(`/nginx/update`, req);
|
return http.post<any>(`/nginx/update`, req);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const GetNginxStatus = () => {
|
||||||
|
return http.get<Nginx.NginxStatus>(`/nginx/status`);
|
||||||
|
};
|
||||||
|
@ -769,5 +769,13 @@ export default {
|
|||||||
gzipMinLengthHelper: '最小压缩文件',
|
gzipMinLengthHelper: '最小压缩文件',
|
||||||
gzipCompLevelHelper: '压缩率',
|
gzipCompLevelHelper: '压缩率',
|
||||||
gzipHelper: '是否开启压缩传输',
|
gzipHelper: '是否开启压缩传输',
|
||||||
|
connections: '活动连接(Active connections)',
|
||||||
|
accepts: '总连接次数(accepts)',
|
||||||
|
handled: '总握手次数(handled)',
|
||||||
|
requests: '总握手次数(requests)',
|
||||||
|
reading: '请求数(Reading)',
|
||||||
|
writing: '响应数(Writing)',
|
||||||
|
waiting: '驻留进程(Waiting)',
|
||||||
|
status: '负载状态',
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -10,6 +10,9 @@
|
|||||||
<el-collapse-item :title="$t('website.nginxPer')" name="3">
|
<el-collapse-item :title="$t('website.nginxPer')" name="3">
|
||||||
<NginxPer />
|
<NginxPer />
|
||||||
</el-collapse-item>
|
</el-collapse-item>
|
||||||
|
<el-collapse-item :title="$t('nginx.status')" name="4">
|
||||||
|
<Status />
|
||||||
|
</el-collapse-item>
|
||||||
</el-collapse>
|
</el-collapse>
|
||||||
</LayoutContent>
|
</LayoutContent>
|
||||||
</template>
|
</template>
|
||||||
@ -20,6 +23,7 @@ import Source from './source/index.vue';
|
|||||||
import { ref, watch } from 'vue';
|
import { ref, watch } from 'vue';
|
||||||
import ContainerLog from '@/components/container-log/index.vue';
|
import ContainerLog from '@/components/container-log/index.vue';
|
||||||
import NginxPer from './performance/index.vue';
|
import NginxPer from './performance/index.vue';
|
||||||
|
import Status from './status/index.vue';
|
||||||
|
|
||||||
let activeName = ref('1');
|
let activeName = ref('1');
|
||||||
let dialogContainerLogRef = ref();
|
let dialogContainerLogRef = ref();
|
||||||
|
42
frontend/src/views/website/website/nginx/status/index.vue
Normal file
42
frontend/src/views/website/website/nginx/status/index.vue
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
<template>
|
||||||
|
<el-row>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-descriptions :column="1" border>
|
||||||
|
<el-descriptions-item :width="100" :label="$t('nginx.connections')">
|
||||||
|
{{ data.active }}
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item :label="$t('nginx.accepts')">{{ data.accepts }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item :label="$t('nginx.handled')">{{ data.handled }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item :label="$t('nginx.requests')">{{ data.requests }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item :label="$t('nginx.reading')">{{ data.reading }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item :label="$t('nginx.writing')">{{ data.writing }}</el-descriptions-item>
|
||||||
|
<el-descriptions-item :label="$t('nginx.waiting')">{{ data.waiting }}</el-descriptions-item>
|
||||||
|
</el-descriptions>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { Nginx } from '@/api/interface/nginx';
|
||||||
|
import { GetNginxStatus } from '@/api/modules/nginx';
|
||||||
|
import { onMounted, ref } from 'vue';
|
||||||
|
|
||||||
|
let data = ref<Nginx.NginxStatus>({
|
||||||
|
accepts: '',
|
||||||
|
handled: '',
|
||||||
|
requests: '',
|
||||||
|
reading: '',
|
||||||
|
waiting: '',
|
||||||
|
writing: '',
|
||||||
|
active: '',
|
||||||
|
});
|
||||||
|
|
||||||
|
const get = async () => {
|
||||||
|
const res = await GetNginxStatus();
|
||||||
|
data.value = res.data;
|
||||||
|
};
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
get();
|
||||||
|
});
|
||||||
|
</script>
|
Loading…
x
Reference in New Issue
Block a user