一、問題背景
初始需求:只能通過阿里雲的workbench遠程連接,需求是替換網站SSL證書。其他信息均無。奔着兩眼一抹黑的精神大海落枕一把。本想着找到nginx直接看配置文件,然後替換路徑就ok。但是發現這個用户下有兩個ecs,做了轉發?docker端口映射?只猜對了一半。。。。
二、排查階段與核心步驟
階段1:定位80端口監聽進程——排除宿主機標準Nginx
1.1 發現端口監聽但無法找到Nginx命令
netstat -anp顯示80/443端口被nginx: master process監聽,卻無法通過常規命令找到宿主機Nginx安裝路徑。。
- 現象:執行
netstat -anp|grep 80,顯示0.0.0.0:80 LISTEN 29071/nginx: master,但執行which nginx/whereis nginx均提示“無此命令”,nginx -t報錯“command not found”。 - 排除法:排除宿主機通過
yum/apt安裝的標準Nginx(此類安裝會將nginx命令加入PATH),懷疑是:①源碼編譯的Nginx/OpenResty;②Docker容器內的服務;③面板管理的非標準路徑服務。 -
核心命令:
# 查看端口監聽進程 netstat -antp|grep 80 # 或 ss -tulpn|grep 80 # 排查Nginx命令是否存在 which nginx whereis nginx nginx -t # 驗證命令可用性
階段2:追溯進程本質——發現OpenResty與Docker容器關聯
2.1 查看進程詳情,定位服務類型
-
操作:執行
ps -ef | grep nginx,發現進程實際啓動命令為:root 29071 29051 0 2024 ? 00:00:00 nginx: master process /usr/local/openresty/bin/openresty -g daemon off; - 結論:監聽80/443的“Nginx”實際是OpenResty(基於Nginx的擴展服務),但
/usr/local/openresty/bin/openresty路徑不存在,進一步懷疑是Docker容器內的服務。
2.2 驗證Docker容器,確認服務歸屬
- 操作:執行
docker ps,發現容器1Panel-openresty-2jEd(1Panel前綴表明由面板管理),且執行ps -ef | grep openresty時出現docker exec -it 1Panel-openresty-2jEd /bin/bash(曾進入過該容器)。 - 結論:OpenResty運行在
1Panel-openresty-2jEd容器內,而非宿主機直接安裝。 -
核心命令:
# 查看進程完整啓動命令 ps -ef | grep nginx ps -ef | grep openresty # 查看運行中的Docker容器 docker ps
階段3:解析容器配置——Host網絡與宿主機掛載點
3.1 找到Docker Compose配置文件,明確網絡與掛載規則
-
操作:通過
find / -name "docker-compose.yml" | grep openresty定位到配置文件路徑/opt/1panel/apps/openresty/openresty/docker-compose.yml,關鍵配置如下:services: openresty: container_name: ${CONTAINER_NAME} network_mode: host # 容器使用宿主機網絡(直接監聽宿主機80/443) volumes: - ./conf/conf.d:/usr/local/openresty/nginx/conf/conf.d/ # 宿主機配置目錄掛載到容器 - ./www:/www # 宿主機網站目錄掛載到容器 -
核心結論:
network_mode: host:容器無需端口映射,直接使用宿主機80/443端口,因此netstat顯示宿主機進程監聽。volumes掛載:宿主機/opt/1panel/apps/openresty/openresty/conf/conf.d對應容器內Nginx站點配置目錄,./www對應容器內網站/證書目錄(解決“證書路徑在宿主機找不到”問題)。
3.2 定位SSL證書配置與掛載路徑
-
操作:查看宿主機掛載的配置文件
/opt/1panel/apps/openresty/openresty/conf/conf.d/47.***.232.conf,發現證書路徑:ssl_certificate /www/sites/47.***.232/ssl/fullchain.pem; ssl_certificate_key /www/sites/47.***.232/ssl/privkey.pem; - 路徑轉換:因
./www掛載到容器/www,宿主機實際證書路徑為/opt/1panel/apps/openresty/openresty/www/sites/47.***.232/ssl/(無需進入容器即可替換證書)。 -
核心命令:
# 搜索Docker Compose配置文件 find / -name "docker-compose.yml" | grep openresty 2>/dev/null # 查看站點配置文件 cat /opt/1panel/apps/openresty/openresty/conf/conf.d/47.***.232.conf # 確認宿主機掛載的證書目錄 ls -la /opt/1panel/apps/openresty/openresty/www/sites/47.***.232/ssl/
階段4:定位1Panel面板配置——登錄地址與密碼重置
4.1 確定1Panel進程與監聽端口
-
如何確認是1Panel?
- 目錄特徵:服務器存在
/opt/1panel目錄(1Panel默認安裝路徑,包含apps/conf/bin等子目錄,對應面板管理的應用、配置、命令工具)。 - 進程特徵:執行
ps -ef | grep 1panel,顯示1Panel主進程(如/opt/1panel/bin/1panel)。 - 專用命令:執行
1pctl user-info(1Panel專屬命令,直接輸出面板信息,非系統或其他面板命令)。
- 目錄特徵:服務器存在
-
操作:
- 執行
ps -ef | grep 1panel,找到1Panel主進程PID(如1234)。 - 執行
ss -tulpn | grep 1234,顯示監聽端口(如*:12826)。 - 執行
1pctl user-info,直接獲取面板地址:http://服務器IP:12826/81f848ba8f,用户名:d67c5a2cea。
- 執行
4.2 重置1Panel密碼
- 現象:
1pctl user-info顯示密碼為********(加密隱藏,無法直接查看)。 -
操作:執行1Panel專用重置命令:
# 進入1Panel安裝目錄 cd /opt/1panel # 重置密碼(輸出隨機新密碼) ./bin/1panel-cli reset-password - 後續:用新密碼登錄面板後,在“個人設置”中修改為自定義密碼。
-
核心命令:
# 查看1Panel進程 ps -ef | grep 1panel # 查看1Panel監聽端口 ss -tulpn | grep <1Panel進程PID> # 查看1Panel面板信息 1pctl user-info # 重置1Panel密碼 /opt/1panel/bin/1panel-cli reset-password
三、關鍵難點與解決思路
| 難點 | 解決思路 | 排除法應用 | |
|---|---|---|---|
1. 有Nginx進程但無nginx命令 |
從進程啓動命令追溯服務類型(`ps -ef | grep nginx`發現是OpenResty),再排查OpenResty部署方式(Docker/源碼) | 排除宿主機標準Nginx(which無結果),排除源碼編譯(find / -name openresty發現Docker路徑) |
| 2. OpenResty在容器內但監聽宿主機端口 | 查看Docker Compose的network_mode配置,確認host模式(容器直接使用宿主機網絡) |
排除端口映射模式(docker ps無0.0.0.0:80->80/tcp映射),確認host模式後無需找端口映射關係 |
|
| 3. 證書路徑在配置中存在但宿主機找不到 | 查看Docker Compose的volumes掛載,找到宿主機掛載目錄(./www對應容器/www) |
排除容器內獨立目錄(無需進入容器,直接操作宿主機掛載目錄即可) | |
| 4. 找不到1Panel登錄地址 | 利用1Panel目錄特徵(/opt/1panel)、進程特徵(`ps -ef |
grep 1panel)、專用命令(1pctl user-info`) |
排除其他面板(無bt/aaPanel等命令,目錄無對應面板特徵) |
四、核心定位方法總結
- 端口→進程→服務類型:從
netstat/ss查端口監聽進程,再用ps -ef查進程啓動命令,確定服務是Nginx/OpenResty。 - 進程→部署方式:通過進程路徑(如
/usr/local/openresty/bin/openresty)結合find/docker ps,確定是宿主機/容器部署。 - 容器→配置解析:找到Docker Compose文件,分析
network_mode(網絡)和volumes(掛載),明確宿主機與容器的文件/網絡關聯。 - 面板→專屬工具:利用1Panel專用命令(
1pctl)和默認安裝目錄(/opt/1panel),快速定位面板信息,避免全局搜索浪費時間。
五、Linux核心命令清單(按用途分類)
1. 端口與進程查詢
| 命令 | 用途 | 示例 | ||
|---|---|---|---|---|
netstat -antp |
查看所有TCP端口監聽及對應進程 | `netstat -antp | grep 80`(查80端口進程) | |
ss -tulpn |
查看所有監聽端口及進程(比netstat更高效) |
`ss -tulpn | grep 443`(查443端口進程) | |
| `ps -ef | grep <關鍵詞>` | 查看包含關鍵詞的進程詳情 | `ps -ef | grep nginx`(查Nginx相關進程) |
lsof -p <PID> |
查看進程打開的文件(需安裝lsof) |
`lsof -p 29071 | grep .conf`(查進程打開的配置文件) |
2. 文件與路徑搜索
| 命令 | 用途 | 示例 | |
|---|---|---|---|
find / -name <文件名> 2>/dev/null |
全局搜索文件,忽略權限錯誤 | `find / -name "docker-compose.yml" | grep openresty` |
grep -r -i <關鍵詞> <目錄> |
遞歸搜索目錄下包含關鍵詞的文件 | grep -r -i "d***tong" /opt/1panel/apps/openresty |
|
ls -la |
查看目錄下所有文件(含隱藏文件如.env) |
ls -la /opt/1panel/apps/openresty/openresty(查.env文件) |
|
cat <文件路徑> |
查看文件內容 | cat /opt/1panel/conf/1panel.conf(查1Panel配置) |
3. Docker操作
| 命令 | 用途 | 示例 | |
|---|---|---|---|
docker ps |
查看運行中的容器 | `docker ps | grep openresty`(查OpenResty容器) |
docker exec -it <容器名> /bin/bash |
進入容器交互終端 | docker exec -it 1Panel-openresty-2jEd /bin/bash |
|
docker restart <容器名> |
重啓容器 | docker restart 1Panel-openresty-2jEd(重啓OpenResty) |
|
cat <docker-compose.yml路徑> |
查看容器配置(網絡、掛載) | cat /opt/1panel/apps/openresty/openresty/docker-compose.yml |
4. 1Panel專用命令
| 命令 | 用途 | 示例 |
|---|---|---|
1pctl user-info |
查看1Panel面板地址、用户名 | 1pctl user-info |
/opt/1panel/bin/1panel-cli reset-password |
重置1Panel密碼 | /opt/1panel/bin/1panel-cli reset-password |
六、最終操作流程(SSL證書替換)
- 替換證書:將新證書
fullchain.pem/privkey.pem上傳到宿主機路徑/opt/1panel/apps/openresty/openresty/www/sites/47.***.232/ssl/。 - 重啓服務:執行
docker restart 1Panel-openresty-2jEd(或在1Panel面板“應用管理”重啓OpenResty)。 - 驗證:瀏覽器訪問
https://wxapp.d***tong.cn,查看證書是否更新;或執行openssl s_client -connect 47.***.232:443 -servername wxapp.d***tong.cn驗證證書信息。