前言
服務(wù)器每次重啟,都需要手動(dòng)啟動(dòng)一些服務(wù),這不是一個(gè)程序員可以忍受的,難怪大家都喜歡寫腳本。接下來(lái)三篇文章,分別記錄一下nginx、tomcat和mysql的開機(jī)自啟動(dòng)配置。
systemd
systemd簡(jiǎn)介
CentOS7已不再使用chkconfig管理啟動(dòng)項(xiàng),而是使用systemd。關(guān)于systemd的衍生和發(fā)展,可以參見(jiàn)《CentOS7/RHEL7 systemd詳解》和《CentOS7進(jìn)程管理systemd詳解》。簡(jiǎn)單介紹如下:
Linux系統(tǒng)從啟動(dòng)到提供服務(wù)的過(guò)程是這樣,先是機(jī)器加電,然后通過(guò)MBR或者UEFI加載GRUB,再啟動(dòng)內(nèi)核,內(nèi)核啟動(dòng)服務(wù),然后開始對(duì)外服務(wù)。
SysV init、UpStart、systemd主要是解決服務(wù)引導(dǎo)管理的問(wèn)題。
SysV init是最早的解決方案,依靠劃分不同的運(yùn)行級(jí)別,啟動(dòng)不同的服務(wù)集,服務(wù)依靠腳本控制,并且是順序執(zhí)行的。在CentOS5中使用,配置文件為/etc/inittab。
SysV init方案的優(yōu)點(diǎn)是:原理簡(jiǎn)單,易于理解;依靠shell腳本控制,編寫服務(wù)腳本門檻比較低。
缺點(diǎn)是:服務(wù)順序啟動(dòng),啟動(dòng)過(guò)程比較慢;不能做到根據(jù)需要來(lái)啟動(dòng)服務(wù),比如通常希望插入U(xiǎn)盤的時(shí)候,再啟動(dòng)USB控制的服務(wù),這樣可以更好的節(jié)省系統(tǒng)資源。
為了解決系統(tǒng)服務(wù)的即插即用,UpStart應(yīng)運(yùn)而生,在CentOS6系統(tǒng)中,SysV init和UpStart是并存的,UpStart主要解決了服務(wù)的即插即用。服務(wù)順序啟動(dòng)慢的問(wèn)題,UpStart的解決辦法是把相關(guān)的服務(wù)分組,組內(nèi)的服務(wù)是順序啟動(dòng),組之間是并行啟動(dòng)。在CentOS6系統(tǒng)中,配置文件為/etc/inittab和/etc/init/*.conf。
但是隨著移動(dòng)互聯(lián)網(wǎng)的到來(lái),SysV init服務(wù)啟動(dòng)慢的問(wèn)題顯得越來(lái)越突出,許多移動(dòng)設(shè)備都是基于Linux內(nèi)核,比如安卓。移動(dòng)設(shè)備啟動(dòng)比較頻繁,每次啟動(dòng)都要等待服務(wù)順序啟動(dòng),顯然難以接受,systemd就是為了解決這個(gè)問(wèn)題誕生的。在CentOS7中使用,其配置文件為/usr/lib/systemd/system/ 和 /etc/systemd/system/ 中的文件。
systemd的設(shè)計(jì)思路是:盡可能的快速啟動(dòng)服務(wù);盡可能的減少系統(tǒng)資源占用。
systemd使用
在CentOS7中,systemctl命令主要負(fù)責(zé)控制systemd系統(tǒng)和服務(wù)管理器?;救〈藄ervice和chkconfig命令,雖然service和chkconfig命令依然保留,但是據(jù)說(shuō)已經(jīng)被閹割過(guò)。
參考《Centos7下的systemctl命令與service和chkconfig》,整理常用命令如下:
-
systemctl --version,查看版本。 -
whereis systemctl,查看位置。 -
systemctl list-unit-files,列出所有可用單元(服務(wù))。 -
systemctl list-units,列出所有運(yùn)行中的單元。 -
systemctl --failed,列出所有失敗的單元。 -
systemctl list-unit-files | grep enable,查看自啟動(dòng)的軟件。 -
systemctl is-enabled mysqld.service,查看某個(gè)單元是否開機(jī)啟動(dòng)。 -
systemctl status mysqld.service,查看某個(gè)單元的狀態(tài)。 -
systemctl start mysqld.service,啟動(dòng)某個(gè)單元。 -
systemctl restart mysqld.service,重啟某個(gè)單元。 -
systemctl stop mysqld.service,停止某個(gè)單元。 -
systemctl daemon-reload,修改了某個(gè)單元的配置文件后,重載配置文件。 -
systemctl reload mysqld.service,重載某個(gè)單元。 -
systemctl enable mysqld.service,設(shè)置開機(jī)自啟動(dòng)。 -
systemctl disable mysqld.service,關(guān)閉開機(jī)自啟動(dòng)。 -
systemctl kill mysqld,殺死單元。
nginx
yum安裝nginx
參考《如何在CentOS 7上安裝Nginx》,安裝nginx,安裝成功后使用systemctl命令設(shè)置自啟動(dòng)。
手動(dòng)安裝nginx
參考《Centos7安裝Nginx實(shí)戰(zhàn)》,安裝步驟如下:
1、安裝gcc等編譯環(huán)境
yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
2、下載nginx1.12.0并解壓
wget http://nginx.org/download/nginx-1.12.0.tar.gz
tar -xzvf nginx-1.12.0.tar.gz
cd nginx-1.12.0
3、創(chuàng)建目錄
mkdir -p /var/temp
mkdir -p /var/temp/nginx
mkdir -p /var/temp/run/nginx
chmod a+wrx -R temp
4、配置編譯選項(xiàng)
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/temp/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
切記,pid-path不能設(shè)置為/var/run/nginx/nginx.pid。因?yàn)镃entOS每次重啟后,都會(huì)刪除/var/run目錄中的自建目錄和文件,從而導(dǎo)致nginx自啟動(dòng)失敗。
5、編譯安裝
make && make install
進(jìn)入/usr/local/nginx查看文件是否存在conf、sbin、html文件夾,若存在則安裝成功
6、測(cè)試啟動(dòng)
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
如果不指定-c,nginx在啟動(dòng)時(shí)默認(rèn)加載conf/nginx.conf文件。
7、測(cè)試訪問(wèn)
curl localhost
瀏覽器如果不能訪問(wèn),就打開防火墻或者開端口。
關(guān)閉防火墻,systemctl stop firewalld.service
開放端口,firewall-cmd --zone=public --add-port=80/tcp --permanent,firewall-cmd --reload
設(shè)置開機(jī)啟動(dòng)
手動(dòng)安裝的nginx,該怎樣設(shè)置開機(jī)自啟動(dòng)?參照《Nginx+Center OS 7.2 開機(jī)啟動(dòng)設(shè)置(轉(zhuǎn)載)》,步驟如下:
1、在系統(tǒng)服務(wù)目錄里創(chuàng)建nginx.service文件
vi /usr/lib/systemd/system/nginx.service
2、寫入內(nèi)容如下:
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[Unit]:服務(wù)的說(shuō)明
Description:描述服務(wù)
After:描述服務(wù)類別
[Service]服務(wù)運(yùn)行參數(shù)的設(shè)置
Type=forking是后臺(tái)運(yùn)行的形式
ExecStart為服務(wù)的具體運(yùn)行命令
ExecReload為重啟命令
ExecStop為停止命令
PrivateTmp=True表示給服務(wù)分配獨(dú)立的臨時(shí)空間
注意:[Service]的啟動(dòng)、重啟、停止命令全部要求使用絕對(duì)路徑
[Install]運(yùn)行級(jí)別下服務(wù)安裝的相關(guān)設(shè)置,可設(shè)置為多用戶,即系統(tǒng)運(yùn)行級(jí)別為3
3、設(shè)置開機(jī)自啟動(dòng)
systemctl enable nginx.service
4、查看nginx狀態(tài)
systemctl status nginx.service
很奇怪,明明啟動(dòng)成功了,為什么顯示Active: inactive (dead)?
5、殺死nginx重啟nginx
pkill -9 nginx
ps aux | grep nginx
systemctl start nginx
再次查看狀態(tài),變成了active,搞定。
6、重啟服務(wù)器
reboot
7、再次連接后,查看服務(wù)狀態(tài)
systemctl status nginx.service
看到nginx已經(jīng)啟動(dòng),至此,nginx自啟動(dòng)配置成功。