1. 程式人生 > >nginx iocp(3):scm服務控制

nginx iocp(3):scm服務控制

   為了使nginx支援windows服務,本文闡述以下主要的改進實現。

ngx_main函式
   為了在SCM服務中複用main函式的邏輯,將其重新命名為ngx_main,並新增第3個引數is_scm以相容控制檯執行方式,宣告在core/nginx.h中。    1#if (NGX_WIN32 && NGX_USE_SERVICE)2externintngx_main(int argc,char*const*argv,int is_scm);
3#endif   定義在core/nginx.c中,供main函式和ServiceMain函式呼叫。 1int ngx_cdecl
2#if (NGX_WIN32 && NGX_USE_SERVICE)
3    ngx_main(int argc, char*const*argv, int is_scm)
4#else5    main(int argc, char*const*argv)
6#endif   is_scm為非0表示以SCM服務方式執行,否則以控制檯方式執行。巨集NGX_USE_SERVICE用於支援SCM服務方式的條件編譯。相比老的main函式,ngx_main依次修改了以下幾方面:

   不顯示版本和幫助
   只有以控制檯方式執行時,才能檢視版本和幫助,即這部分程式碼當is_scm為0時才有效。
 1#if (NGX_WIN32 && NGX_USE_SERVICE)
 2if(!is_scm){        
 3  if (ngx_show_version) {
 4      ngx_write_stderr("nginx version: " NGINX_VER NGX_LINEFEED);
 5
 6      if (ngx_show_help) {
 7        
 8      }
 9
10      if (ngx_show_configure) {
11          
12      }
13
14      if (!ngx_test_config) {
15          return0;
16      }
17  }
18}
19#endif
   增加服務初始化

 1log = ngx_log_init(ngx_prefix);
 2if (log == NULL) {
 3  return1;
 4}
 5
 6#if (NGX_WIN32 && NGX_USE_SERVICE)     7if(is_scm){
 8    ngx_service_init(log,argc,argv);
 9}
10#endif   當is_scm為非0即nginx以服務方式執行時,呼叫外部函式ngx_service_init初始化。因為此時ngx_cycle還沒構造,而ngx_service_init須將錯誤記錄在log中,所以應在ngx_log_init完成後呼叫。   

   不測試配置和處理訊號
   與不顯示版本和幫助同理,只有以控制檯方式執行時,這部分處理才有效。
 1#if (NGX_WIN32 && NGX_USE_SERVICE) 2    if(!is_scm){                
 3       if (ngx_test_config) {
 4          if (!ngx_quiet_mode) {
 5               ngx_log_stderr(0"configuration file %s test is successful", cycle->conf_file.data);
 6           }
 7        
 8           return0;
 9       }
10
11    if (ngx_signal) {
12           return ngx_signal_process(cycle, ngx_signal);
13       }
14    }
15#endif
   設定狀態為正在執行
 1#if (NGX_WIN32 && NGX_USE_SERVICE) 2  if(is_scm && ngx_service_update_state(ngx_cycle->log,SERVICE_RUNNING,0,0)){
 3        exit(1);
 4    }
 5#endif 6    ngx_use_stderr =0;
 7
 8if (ngx_process == NGX_PROCESS_SINGLE) {
 9      ngx_single_process_cycle(cycle);
10
11}
else{
12     ngx_master_process_cycle(cycle);
13}
14
15   return0;   為了準確報告服務正在執行的狀態,應在所有初始化完成後進行,所以在最後的主迴圈前呼叫ngx_service_update_state。

   以下5個部分對應的實現函式,都定義在os/win32/ngx_service.c中。
main函式
   nginx程式的啟動入口主函式,可被控制檯或SCM呼叫,當被SCM呼叫時,負責用SCM來註冊服務,以及啟動服務控制排程程式。
 1voidmain(int argc, char*const*argv)
 2{
 3    SERVICE_TABLE_ENTRY st[] ={
 4        "nginx"ngx_service_main },
 5        { NULL, NULL } 6    }
;
 7
 8  /* StartServiceCtrlDispatcher() should be called within 30 seconds */ 9  if (StartServiceCtrlDispatcher(st) ==0{     
10         if(ERROR_FAILED_SERVICE_CONTROLLER_CONNECT==ngx_errno){
11            ngx_main(argc,argv,0);
12         }
13  }
14}
   指定ServiceMain函式為ngx_service_main,有2種情況會以控制檯方式執行:1)在控制檯啟動nginx產生的master和worker程序,2)在SCM中啟動nginx產生的worker程序。當以控制檯方式執行時,StartServiceCtrlDispatcher失敗返回ERROR_FAILED_SERVICE_CONTROLLER_CONNECT錯誤,以is_scm為0呼叫ngx_main函式;當以SCM服務方式執行成功時,會呼叫到ServiceMain函式。

ServiceMain函式
   由SCM生成的一個邏輯執行緒呼叫。
1staticvoid WINAPI ngx_service_main(u_int argc, char**argv)
2{
3    ngx_main(argc,argv,1);    
4    ngx_service_update_state(ngx_cycle->log,SERVICE_STOPPED,0,0);
5}
   以is_scm為1呼叫ngx_main。當ngx_main異常退出時,會呼叫到ngx_exit_handler;當正常返回時直接更新服務狀態為已停止。

服務初始化    
   由ngx_main呼叫。
 1voidngx_service_init(ngx_log_t *log,int argc,char*const*argv)
 2{
 3    atexit(ngx_exit_handler);
 4    
 5    ngx_service = RegisterServiceCtrlHandlerEx("nginx"ngx_service_control, NULL);
 6    if(ngx_service == INVALID_HANDLE_VALUE) {
 7        ngx_log_error(NGX_LOG_EMERG,log,ngx_errno,"RegisterServiceCtrlHandlerEx fail");
 8        exit(1);
 9    }
10    
11    ngx_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
12    ngx_status.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_PARAMCHANGE;
13    ngx_status.dwWin32ExitCode = NO_ERROR;
14    ngx_status.dwServiceSpecificExitCode =0;
15    
16

相關推薦

nginx iocp3scm服務控制

   為了使nginx支援windows服務,本文闡述以下主要的改進實現。ngx_main函式   為了在SCM服務中複用main函式的邏輯,將其重新命名為ngx_main,並新增第3個引數is_scm以相容控制檯執行方式,宣告在core/nginx.h中。    1#if (NGX_

springCloud3服務的註冊與發現Eureka

springcloud 微服務的註冊與發現 eureka 一、簡介服務消費者需要一個強大的服務發現機制,服務消費者使用這種機制獲取服務提供者的網絡信息。即使服務提供者的信息發生變化,服務消費者也無須修改配置。服務提供者、服務消費者、服務發現組件三者之間的關系大致如下: 1.各個微服務在啟動時,將自

SpringCloud3 服務閘道器Zuul

在一個實際業務當中通常都會呼叫多個服務介面,而每個服務介面的ip/埠or域名都不一樣,這樣在實際呼叫中會變得十分繁瑣,而且當服務介面ip/埠or域名修改後,業務系統也需要進行相應的修改,大大增加了開發維護成本,所以一般的做法都是在多個服務介面上游再新增一層,我們

nginx iocp2udp非同步接收

   nginx的域名解析器使用已連線udp(收發前先呼叫ngx_udp_connect)傳送dns查詢、接收dns響應,如上篇tcp非同步連線所講,iocp需要先投遞udp的接收操作,才能引發接收完成的事件,因此要對域名解析器和udp非同步接收作些改進。 傳送後投遞     dns查詢由

nginx iocp1tcp非同步連線

   iocp是Windows NT作業系統的一種高效IO模型,對應於Linux中的epoll和FreeBSD中的kqueue,nginx對ske(select、kqueue和epoll的首寫字母組合)的支援很好,但截止到1.6.2版本,還不支援iocp。由於ske都是反應器模式,即先註冊IO事件

Nginx 教程3SSL 設定

大家好!分享即關懷,我們很樂意與你分享其他的一些知識。我們準備了一個 Nginx 指南,分為三個系列。如果你已經知道一些 Nginx 知識或者想擴充套件你的經驗和認知,這個再合適不過了。 我們將告訴你 Nginx 的運作模式、蘊含的概念,怎樣通過調優 Nginx 來

grpc3使用 golang 開發 grpc 服務端和client

ava 相互調用 相互 localhost rpcclient int err pri nec 1,關於grpc-go golang 能夠能夠做grpc的服務端

Nginx3用作檔案伺服器

這篇文章算摘來的。 nginx.conf server { listen 9000; #埠 server_name localhost; #服務名 charset utf-8; #

淺探微服務—springboot3配置檔案application.properties

先附上springboot官方文件:springboot官方指南,內容很廣泛,全英文,可以翻譯網頁檢視,慢慢看。。。 預設建立spring-boot專案後,會在resources目錄下生成一個空的application.properties配置檔案,springboot啟動

SparkSQL3開啟ThriftServer服務

一、實現功能 SparkSQL的ThriftServer服務其實就是Hive的hiveServer2服務,只是將底層的執行改成spark,同時在spark上啟動。 二、配置 1.修改hive-site.xml的hiveserver2的配置資訊 <property

部署CM報錯3啟動agent報錯Starting cloudera-scm-agent: [FAILED]

一、問題描述 啟動cm的server成功,啟動agent的時候報錯,如下: [[email protected] init.d]# ./cloudera-scm-agent start Starting cloudera-scm-agent: [FAILED] 二、問題原因

Pro Android學習筆記六九HTTP服務3HTTP POST MultiPart

HTTP POST不僅可以通過鍵值對傳遞引數,還可以攜帶更為複雜的引數,例如檔案。HTTP Post支援攜帶body,content-type為multipart。本次我們將嘗試通過http post上傳一個小檔案。 建立測試環境 上傳檔案的測試環境很難找,下載了Tomcat,想裝一個環境,開啟後,發現忘得

Docker筆記常用服務安裝——Nginx、MySql、Redis

開發中經常需要安裝一些常用的服務軟體,如Nginx、MySql、Redis等,如果按照普通的安裝方法,一般都相對比較繁瑣 —— 要經過下載軟體或原始碼包,編譯安裝,配置,啟動等步驟,使用 Docker 來安裝這些服務軟體能極大地簡化安裝過程,且速度也很快。   本文以下操作假定你已經裝好了docke

Istio 運維實戰系列3讓人頭大的『無頭服務』-下

本系列文章將介紹使用者從 Spring Cloud,Dubbo 等傳統微服務框架遷移到 Istio 服務網格時的一些經驗,以及在使用 Istio 過程中可能遇到的一些常見問題的解決方法。 ## 失敗的 Eureka 心跳通知 在上一篇文章中,我們介紹了 Headless Service 和普通 Servi

Pro Android學習筆記一三七Home Screen Widgets3配置Activity

map onclick widgets info xtra ces extends height appwidget 文章轉載僅僅能用於非商業性質,且不能帶有虛擬貨幣、積分、註冊等附加條件。轉載須註明出處http://blog.csdn.net/flowingfly

Windows Phone開發3棋子未動,先觀全局

csdn xaml hone activate 處理程序 為什麽 作業 單擊 不執行 在進行WP開發之前,與其它開發技術一樣,我們需要簡單了解一個WP應用序的生命周期,我們不一定要深入了解,但至少要知道在應用程序生命周期內的每一階段,我們應當做什麽,不推薦哪些操作等,這也是

Akka3 Actor監管 - 細述BackoffSupervisor

system 中一 println setting rtc logging info 其它 text 在上一篇討論中我們談到了監管:在Akka中就是一種直屬父子監管樹結構,父級Actor負責處理直屬子級Actor產生的異常。當時我們把BackoffSuperviso

springCloud1服務簡介

spring cloud 微服務 一、什麽是微服務微服務架構風格是一種將一個單一應用程序開發為一組小型服務的方法,每個服務運行在自己的進程中,服務間通信采用輕量級通信機制(通常用HTTP資源API)。二、微服務架構特性1、每個微服務可獨立運行在自己的進程裏2、一系列獨立運行的微服務共同構建起整個系

[Golang] 從零開始寫Socket Server3 對長、短連接的處理策略模擬心跳

microsoft ted 每次 range 點擊 關閉 ade 而在 href 通過前兩章,我們成功是寫出了一套湊合能用的Server和Client,並在二者之間實現了通過協議交流。這麽一來,一個簡易的socket通訊框架已經初具雛形了,那麽我們接下來做的

python基礎3輸入輸出與運算符

http 占位符 str png blog 方法 image 16px 提示 今天總結一下最基礎的輸入輸出和運算符 輸入: python3裏都是input("") input() name = input() #輸入的值會直接賦值給name name = i