重灌nginx時遇到的問題
起因
之前在網上看文章提到說,通過apt-get的方式安裝nginx,可能安裝不是最新版本的情況,考慮到在Ubuntu下第一次安裝nginx,以後肯定會有解除安裝重新安裝新版本的需求,剛好剛開始學習nginx,索性練習下解除安裝重灌的過程。
安裝
使用Ubuntu下的包管理工具apt來安裝nginx
$ sudo apt-get install nginx
解除安裝
同樣使用apt來解除安裝nginx
$ sudo apt-get remove nginx
sudo apt-get autoremove
命令幫我們解除安裝不再需要的依賴包
在這裡我們解除安裝nginx相關的依賴包
$ sudo apt-get autoremove
刪除nginx配置資料夾
$ sudo rm -rf /etc/nginx
重新安裝nginx
# 更新源
$ sudo apt update
$ sudo apt-get install nginx
然而控制檯報錯:
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details. invoke-rc.d: initscript nginx, action "start" failed. dpkg: error processing package nginx-core (--configure): subprocess installed post-installation script returned error exit status 1 dpkg: dependency problems prevent configuration of nginx: nginx depends on nginx-core (>= 1.10.3-0ubuntu0.16.04.2) | nginx-full (>= 1.10.3-0ubuntu0.16.04.2) | nginx-light (>= 1.10.3-0ubuntu0.16.04.2) | nginx-extras (>= 1.10.3-0ubuntu0.16.04.2); however: Package nginx-core is not configured yet. Package nginx-full is not installed. Package nginx-light is not installed. Package nginx-extras is not installed. nginx depends on nginx-core (<< 1.10.3-0ubuntu0.16.04.2.1~) | nginx-full (<< 1.10.3-0ubuntu0.16.04.2.1~) | nginx-light (<< 1.10.3-0ubuntu0.16.04.2.1~) | nginx-extras (<< 1.10.3-0ubuntu0.16.04.2.1~); however: Package nginx-core is not configured yet. No apport report written because the error message indicates its a followup error from a previous failure. Package nginx-full is not installed. Package nginx-light is not installed. Package nginx-extras is not installed. dpkg: error processing package nginx (--configure): dependency problems - leaving unconfigured Processing triggers for libc-bin (2.23-0ubuntu9) ... Errors were encountered while processing: nginx-core nginx E: Sub-process /usr/bin/dpkg returned an error code (1)
檢視nginx.service
狀態
$ systemctl status nginx.service
● nginx.service - A high performance web server and a reverse proxy server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Sat 2018-03-17 23:16:40 CST; 1min 18s ago Process: 26795 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=1/FAILURE) Main PID: 18259 (code=exited, status=0/SUCCESS) Mar 17 23:16:40 VM-0-5-ubuntu systemd[1]: Starting A high performance web server and a reverse proxy server... Mar 17 23:16:40 VM-0-5-ubuntu nginx[26795]: nginx: [emerg] open() "/etc/nginx/nginx.conf" failed (2: No such file or direMar 17 23:16:40 VM-0-5-ubuntu nginx[26795]: nginx: configuration file /etc/nginx/nginx.conf test failed Mar 17 23:16:40 VM-0-5-ubuntu systemd[1]: nginx.service: Control process exited, code=exited status=1 Mar 17 23:16:40 VM-0-5-ubuntu systemd[1]: Failed to start A high performance web server and a reverse proxy server. Mar 17 23:16:40 VM-0-5-ubuntu systemd[1]: nginx.service: Unit entered failed state. Mar 17 23:16:40 VM-0-5-ubuntu systemd[1]: nginx.service: Failed with result 'exit-code'.
仔細看報錯資訊,獲取到兩個資訊點:
- Package nginx-core is not configured yet.
- Package nginx-full/nginx-light/nginx-extras is not installed.
於是上網搜,網上找說可能是apache
佔用了80
埠導致報錯
檢視端口占用情況
$ sudo netstat -nlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1287/sshd
udp 0 0 0.0.0.0:68 0.0.0.0:* 891/dhclient
udp 0 0 172.21.0.5:123 0.0.0.0:* 1231/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 1231/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 1231/ntpd
udp6 0 0 :::123 :::* 1231/ntpd
發現80埠沒被佔用,而且systemctl status nginx.service
的提示資訊也沒提及80埠被佔用,如果提示資訊中說80埠被佔用,可以執行以下兩步試試:
終止apache執行
$ sudo service apache2 stop
重新安裝nginx
$ sudo apt-get install nginx
上述情況與我的並不相符,於是換個思路,報錯資訊中提及nginx的配置檔案不存在,思考為什麼解除安裝重灌nginx,卻沒有生成配置檔案?
和第一次安裝的時候不一樣,然後百度上搜nginx解除安裝重灌後配置檔案沒有重新生成
,找到了類似的問題,給出瞭如下的操縱步驟:
解除安裝nginx不保留配置檔案
$ sudo apt-get --purge remove nginx
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
fontconfig-config fonts-dejavu-core libfontconfig1 libgd3 libjbig0 libjpeg-turbo8 libjpeg8 libtiff5 libvpx3 libxpm4
libxslt1.1 nginx-common nginx-core
Use 'sudo apt autoremove' to remove them.
The following packages will be REMOVED:
nginx*
0 upgraded, 0 newly installed, 1 to remove and 205 not upgraded.
2 not fully installed or removed.
After this operation, 37.9 kB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 66386 files and directories currently installed.)
Removing nginx (1.10.3-0ubuntu0.16.04.2) ...
Setting up nginx-core (1.10.3-0ubuntu0.16.04.2) ...
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
invoke-rc.d: initscript nginx, action "start" failed.
dpkg: error processing package nginx-core (--configure):
subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
nginx-core
E: Sub-process /usr/bin/dpkg returned an error code (1)
解除安裝自動安裝且不再需要的依賴包
$ sudo apt-get autoremove
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be REMOVED:
fontconfig-config fonts-dejavu-core libfontconfig1 libgd3 libjbig0 libjpeg-turbo8 libjpeg8 libtiff5 libvpx3 libxpm4
libxslt1.1 nginx-common nginx-core
0 upgraded, 0 newly installed, 13 to remove and 205 not upgraded.
1 not fully installed or removed.
After this operation, 9,745 kB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 66383 files and directories currently installed.)
Removing nginx-core (1.10.3-0ubuntu0.16.04.2) ...
Removing libgd3:amd64 (2.1.1-4ubuntu0.16.04.8) ...
Removing libfontconfig1:amd64 (2.11.94-0ubuntu1.1) ...
Removing fontconfig-config (2.11.94-0ubuntu1.1) ...
Removing fonts-dejavu-core (2.35-1) ...
Removing libtiff5:amd64 (4.0.6-1ubuntu0.2) ...
Removing libjbig0:amd64 (2.1-3.1) ...
Removing libjpeg8:amd64 (8c-2ubuntu8) ...
Removing libjpeg-turbo8:amd64 (1.4.2-0ubuntu3) ...
Removing libvpx3:amd64 (1.5.0-2ubuntu1) ...
Removing libxpm4:amd64 (1:3.5.11-1ubuntu0.16.04.1) ...
Removing libxslt1.1:amd64 (1.1.28-2.1ubuntu0.1) ...
Removing nginx-common (1.10.3-0ubuntu0.16.04.2) ...
Processing triggers for libc-bin (2.23-0ubuntu9) ...
Processing triggers for man-db (2.7.5-1) ...
篩選已安裝軟體包中與nginx有關的
$ dpkg --get-selections | grep nginx
nginx-common deinstall
解除安裝nginx-common
不保留配置檔案
$ sudo apt-get --purge remove nginx-common
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be REMOVED:
nginx-common*
0 upgraded, 0 newly installed, 1 to remove and 205 not upgraded.
After this operation, 0 B of additional disk space will be used.
Do you want to continue? [Y/n] y
(Reading database ... 66243 files and directories currently installed.)
Removing nginx-common (1.10.3-0ubuntu0.16.04.2) ...
Purging configuration files for nginx-common (1.10.3-0ubuntu0.16.04.2) ...
dpkg: warning: while removing nginx-common, directory '/var/www/html' not empty so not removed
重新安裝nginx
$ sudo apt-get install nginx
...
檢視版本號,執行nginx配置檔案語法檢測
$ nginx -v
nginx version: nginx/1.10.3 (Ubuntu)
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
雖然nginx已經重灌好了,但是一路下來還有幾個困惑:
- apt-get autoremove到底是按什麼規則解除安裝軟體?
- 為什麼nginx-common沒有在一開始的時候解除安裝?
1. apt-get autoremove到底是按什麼規則解除安裝軟體?
apt-get autoremove
:刪除,自動安裝的,且不再需要的
(不被其他軟體當作依賴的)軟體包
舉個栗子: 通過apt-get方式安裝nginx時,會通過引導自動安裝所需的依賴包(nginx-core),而當我們解除安裝nginx後,
那些自動安裝的依賴包就成為不再需要的軟體包(nginx-core),通過apt-get autoremove
會自動清理它們
既然會自動刪除不再需要的軟體包,那麼為什麼nginx-common沒被刪除?
2. 為什麼nginx-common沒有在apt-get autoremove
的時候解除安裝?
不知道細心的童鞋發現沒,我們在解除安裝nginx的時候,
手動刪除了nginx的配置資料夾(sudo rm -rf /etc/nginx
)。
那這些配置資料夾和nginx-common
軟體包有什麼關係呢?
按照清單上的目錄手動排查,發現本機上除了手動刪除的/etc/nginx
目錄不存在,檔案清單內的其他檔案都沒有被刪除,
猜測可能是nginx-common軟體包完整性被破壞,導致autoremove
的時候沒有被刪除,當然這隻我的猜測。
問題回答後續補充:
整理完全解除安裝nginx命令時,發現執行如下命令,ngnix的配置檔案並沒有被刪除
$ sudo apt-get remove --purge nginx
查閱ubuntu packages發現,nginx依賴nginx-core,nginx-core依賴nginx-common,且其中nginx的配置檔案屬於nginx-common軟體包配置檔案的一部分。
執行如下命令進一步驗證
# 解除安裝nginx-common ,nginx配置檔案不會被刪除
$ sudo apt-get remove nginx-common
...
# 解除安裝nginx-common,nginx配置檔案已經被刪除(包括但不限於)
$ sudo apt-get remove --purge nginx-common
$ find /etc/nginx/
find: ‘/etc/nginx/’: No such file or directory
推翻之前的猜測:
apt-get autoremove
執行時,nginx-common
軟體包已經被選擇用於解除安裝( deinstall
),但是實際還沒有解除安裝。
$ dpkg --get-selections| grep nginx
nginx-common deinstall
命令彙總
# 完全解除安裝nginx
$ sudo apt-get remove --purge nginx
$ sudo apt-get autoremove --purge
# 更新nginx,保留配置檔案
# 親測nginx.conf不會被刪除和覆蓋,但保險起見還是建議先備份
$ sudo apt-get remove nginx
$ sudo apt-get autoremove
$ sudo apt update
$ sudo apt-get install nginx
# 安裝軟體包
# sudo apt-get install 軟體包名稱`
# eg:
$ sudo apt-get install nginx
# 解除安裝軟體包
# sudo apt-get remove 軟體包名稱
# eg:
$ sudo apt-get remove nginx
# 解除安裝軟體包且不保留配置檔案
# sudo apt-get remove --purge 軟體包名稱
# eg: