Nginx學習之一-第一個程序Hello World
睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接
本例子實現了一個簡單的hello world程序。運行效果:
虛擬機Ubuntu中:
win7中chrome瀏覽器:
一、config文件編寫 Nginx提供了一種簡單的方式將第三方的模塊編譯到Nginx中。首先把源代碼文件全部放到一個目錄下,同時在該目錄中編寫一個文件用于通知Nginx如何編譯本模塊,這個文件名必須為config。 然后,在configure腳本執行時加入參數--add-module=PATH(新模塊源代碼以及config文件存放目錄),就可以在執行政策編譯安裝流程時完成Nginx編譯工作。 config文件格式 config文件其實是一個可執行的Shell腳本,如果只想開發一個HTTP模塊,需要定義三個變量: (1)ngx_adon_name。 僅在configure執行時使用,一般設置為模塊名稱。 (2)HTTP_MODULES。 保存所有的HTTP模塊名稱。每個模塊間由空格相連。在重新設置這個變量時,不要直接覆蓋,因此要如下設置: "$HTTP_MODULES ngx_http_mytest_module" (3)NGX_ADDON_SRCS。 用于指定新模塊的源代碼,多個待編譯的源代碼之間可以用空格相連。 注意,在設置這個變量時可以使用$ngx_addon_dir變量,它等價于configure執行時--add-module=PATH的PATH參數。 因此本例中的config文件內容如下: [cpp] view plaincopyprint?
- ngx_addon_name=ngx_http_mytest_module
- HTTP_MODULES="$HTTP_MODULES ngx_http_mytest_module"
- NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_mytest_module.c"
三、定義HTTP模塊及處理用戶請求 源代碼: [cpp] view plaincopyprint?
- #include <ngx_config.h>
- #include <ngx_core.h>
- #include <ngx_http.h>
- static ngx_int_t ngx_http_mytest_handler(ngx_http_request_t *r);
- static char *
- ngx_http_mytest(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
- //處理配置項
- static ngx_command_t ngx_http_mytest_commands[] = {
- {
- ngx_string("mytest"),
- NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_NOARGS,
- ngx_http_mytest,
- NGX_HTTP_LOC_CONF_OFFSET,
- 0,
- NULL
- },
- ngx_null_command
- };
- //模塊上下文
- static ngx_http_module_t ngx_http_mytest_module_ctx = {
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL
- };
- //新模塊定義
- ngx_module_t ngx_http_mytest_module = {
- NGX_MODULE_V1,
- &ngx_http_mytest_module_ctx,
- ngx_http_mytest_commands,
- NGX_HTTP_MODULE,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NGX_MODULE_V1_PADDING
- };
- //配置項對應的回調函數
- static char *
- ngx_http_mytest(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
- {
- ngx_http_core_loc_conf_t *clcf;
- clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);
- clcf->handler = ngx_http_mytest_handler;
- return NGX_CONF_OK;
- }
- //實際完成處理的回調函數
- static ngx_int_t ngx_http_mytest_handler(ngx_http_request_t *r)
- {
- if (!(r->method & (NGX_HTTP_GET | NGX_HTTP_HEAD))) {
- return NGX_HTTP_NOT_ALLOWED;
- }
- ngx_int_t rc = ngx_http_discard_request_body(r);
- if (rc != NGX_OK) {
- return rc;
- }
- ngx_str_t type = ngx_string("text/plain");
- ngx_str_t response = ngx_string("Hello World");
- r->headers_out.status = NGX_HTTP_OK;
- r->headers_out.content_length_n = response.len;
- r->headers_out.content_type = type;
- rc = ngx_http_send_header(r);
- if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
- return rc;
- }
- ngx_buf_t *b;
- b = ngx_create_temp_buf(r->pool, response.len);
- if (b == NULL) {
- return NGX_HTTP_INTERNAL_SERVER_ERROR;
- }
- ngx_memcpy(b->pos, response.data, response.len);
- b->last = b->pos + response.len;
- b->last_buf = 1;
- ngx_chain_t out;
- out.buf = b;
- out.next = NULL;
- return ngx_http_output_filter(r, &out);
- }
四、編譯安裝新模塊
編譯安裝新模塊的命令如下:
[cpp] view plaincopyprint?
- ./configure --prefix=/usr/local/nginx(指定安裝部署后的根目錄) --add-module=/home/nginx(新模塊存放目錄)
- make
- sudo make install
五、參考資料:
《深入理解Ngnix》
from:http://blog.csdn.net/xiajun07061225/article/details/9130237
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成