hi-project

hi-project是一个创建hi-nginx模板化工程的脚本。—help可查看使用方法:

  1. $1:project name.
  2. default:demo
  3. $2:type:cpp,python,lua ,php , java, javascript or duktape
  4. default:cpp
  5. $3:hi(nginx) install directory.
  6. default:/usr/local/nginx

它接受三个参数来创建工程,使用make,make cleansudo make install来完成工程构建、清理和安装。必要时,可以通过修改Makefile来添加自定义行为。

举个例子。我想创建一个hi-nginx-cpp工程。

  • 第一步,mkdir test && cd test,test目录作为全部hi-nginx工程的根目录。
  • 第二步,/usr/local/nginx/sbin/hi-project demo cpp /usr/local/nginx,会看到一个demo目录被创建里面有cpp 模板源码和Makefile。后两个参数因为是默认值,可省略。
  • 第三步,make,正确无误就可以sudo make install
  • 第四步, 修改nginx 配置,启用编译生成的demo.so,并reload nginx。
    就这么简单。如果重写了源码,修改了Makefile比如添加依赖库之类,可以make clean重来一次。

cpp模板Makefile如下:

  1. PROJECT=demo.so
  2. SRC=$(shell find . -type f | egrep *.cpp$$)
  3. OBJ=$(patsubst %.cpp,%.o,$(SRC))
  4. ifndef NGINX_INSTALL_DIR
  5. NGINX_INSTALL_DIR=/usr/local/nginx
  6. endif
  7. CXX=g++
  8. CXXFLAGS+=-O3 -std=c++11 -fPIC -Wall -I$(NGINX_INSTALL_DIR)/include
  9. LDLIBS+=
  10. LDFLAGS+=-shared
  11. all:$(PROJECT)
  12. $(PROJECT): $(OBJ)
  13. $(CXX) $(CXXFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)
  14. clean:
  15. rm -f $(OBJ) $(PROJECT)
  16. install:
  17. test -d $(NGINX_INSTALL_DIR)/cpp || mkdir -p $(NGINX_INSTALL_DIR)/cpp
  18. install $(PROJECT) $(NGINX_INSTALL_DIR)/cpp

常常需要自定义的是CXXFLAGS+=LDLIBS+=,可以添加自己需要编译选项和库,比如要添加libfoo.so,它在/opt/lib,那么可以做如下:

  1. CXXFLAGS+=-L/opt/lib
  2. LDLIBS+=-lfoo

如果使用clang++,可以把CXX=g++改成CXX=clang++

cpp模板源码是这样的:

  1. #include "servlet.hpp"
  2. namespace hi{
  3. class hello : public servlet {
  4. public:
  5. void handler(request& req, response& res) {
  6. res.headers.find("Content-Type")->second = "text/plain;charset=UTF-8";
  7. res.content = "hello,world";
  8. res.status = 200;
  9. }
  10. };
  11. }
  12. extern "C" hi::servlet* create() {
  13. return new hi::hello();
  14. }
  15. extern "C" void destroy(hi::servlet* p) {
  16. delete p;
  17. }

要理解和用好cpp servlet类非常简单,只需熟悉STL即可。

sudo make install会把demo.so安装在hi-nginx安装目录下的cpp文件夹。编译出来的demo.so要能够正确运行,除了需要正确配置依赖外,还需要留意它的使用权限。因此,有时需要chmod +x

原文: https://doc.hi-nginx.com/00/0004.html