1.配置nginx使用fcgi
vim /etc/nginx/conf.d/nginx_fcgi.conf
server {
listen 8888;
listen [::]:8888;
server_name 127.0.0.1;
location ^~ /login/ {
include fastcgi.conf;
fastcgi_pass 127.0.0.1:9000;
}
}
systemctl restart nginx.service
2. C版本:返回两种方式
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcgi_stdio.h>
int main(int argc, char *argv[]) {
int count = 0;
while (FCGI_Accept() >= 0) {
printf("Content-type: text/html\r\n");
printf("\r\n");
printf("<title>Fast CGI Hello FCGI!</title>");
printf("<h1>Fast CGI Hello FCGI!</h1>");
printf("Request number %d running on host <i>%s</i>\n", ++count, getenv("SERVER_NAME"));
// printf("Content-type: application/json\r\n\r\n");
// printf("{\"title\":\"name\"}");
char m_data[1024] = {0};
sprintf(m_data,
" SCRIPT_FILENAME: %s\n QUERY_STRING: %s\n REQUEST_METHOD: %s\n CONTENT_TYPE: %s\n CONTENT_LENGTH: %s\n"
" SCRIPT_NAME: %s\n REQUEST_URI: %s\n DOCUMENT_URI: %s\n DOCUMENT_ROOT: %s\n SERVER_PROTOCOL: %s\n"
" GATEWAY_INTERFACE: %s\n SERVER_SOFTWARE: %s\n REMOTE_ADDR: %s\n REMOTE_PORT: %s\n SERVER_ADDR: %s\n"
" SERVER_PORT: %s\n SERVER_NAME: %s\n",
getenv("SCRIPT_FILENAME"), getenv("QUERY_STRING"), getenv("REQUEST_METHOD"), getenv("CONTENT_TYPE"), getenv("CONTENT_LENGTH"),
getenv("SCRIPT_NAME"), getenv("REQUEST_URI"), getenv("DOCUMENT_URI"), getenv("DOCUMENT_ROOT"), getenv("SERVER_PROTOCOL"),
getenv("GATEWAY_INTERFACE"), getenv("SERVER_SOFTWARE"), getenv("REMOTE_ADDR"), getenv("REMOTE_PORT"), getenv("SERVER_ADDR"),
getenv("SERVER_PORT"), getenv("SERVER_NAME"));
FCGI_FILE *fp = FCGI_fopen("./fcgi.log", "w");
FCGI_fwrite(m_data, strlen(m_data), 1, fp);
FCGI_fclose(fp);
}
return 0;
}
3. C++版本:返回两种方式
#include <iostream>
#include <string.h>
#include <unistd.h>
#include <fcgio.h>
#include <fcgiapp.h>
using namespace std;
int main() {
int count = 0;
int ret = 0;
streambuf * cin_streambuf = cin.rdbuf();
streambuf * cout_streambuf = cout.rdbuf();
streambuf * cerr_streambuf = cerr.rdbuf();
FCGX_Request request;
FCGX_Init();
FCGX_InitRequest(&request, 0, 0);
while(1) {
ret = FCGX_Accept_r(&request);
if(ret == 0) {
fcgi_streambuf cin_fcgi_streambuf(request.in);
fcgi_streambuf cout_fcgi_streambuf(request.out);
fcgi_streambuf cerr_fcgi_streambuf(request.err);
cin.rdbuf(&cin_fcgi_streambuf);
cout.rdbuf(&cout_fcgi_streambuf);
cerr.rdbuf(&cerr_fcgi_streambuf);
cout << "Content-type: text/html\r\n\r\n";
cout<< "<TITLE>echo-cpp</TITLE>\n"
"<H1>echo-cpp</H1>\n"
"Request Number: " << ++count << " running on host "
<< FCGX_GetParam("SERVER_NAME", request.envp)<<endl;
// cout<<"Content-type: application/json\r\n\r\n";
// cout<<"{\"title\":\"name\"}"<<endl;
char m_data[1024] = {0};
sprintf(m_data,
" SCRIPT_FILENAME: %s\n QUERY_STRING: %s\n REQUEST_METHOD: %s\n CONTENT_TYPE: %s\n CONTENT_LENGTH: %s\n"
" SCRIPT_NAME: %s\n REQUEST_URI: %s\n DOCUMENT_URI: %s\n DOCUMENT_ROOT: %s\n SERVER_PROTOCOL: %s\n"
" GATEWAY_INTERFACE: %s\n SERVER_SOFTWARE: %s\n REMOTE_ADDR: %s\n REMOTE_PORT: %s\n SERVER_ADDR: %s\n"
" SERVER_PORT: %s\n SERVER_NAME: %s\n",
FCGX_GetParam("SCRIPT_FILENAME", request.envp),//脚本文件请求的路径
FCGX_GetParam("QUERY_STRING", request.envp),//请求的参数如?app=123
FCGX_GetParam("REQUEST_METHOD", request.envp),//请求的动作作(GET/POST)
FCGX_GetParam("CONTENT_TYPE", request.envp),//请求头中的Content-Type字段
FCGX_GetParam("CONTENT_LENGTH", request.envp),//请求头中的Content-lenath字段
FCGX_GetParam("SCRIPT_NAME", request.envp),//脚本名称(就是指令)
FCGX_GetParam("REQUEST_URI", request.envp),//请求的地址不带参数
FCGX_GetParam("DOCUMENT_URI", request.envp),//与$uri相同
FCGX_GetParam("DOCUMENT_ROOT", request.envp),//网站的根目录。在server配置中root指令中指定的值
FCGX_GetParam("SERVER_PROTOCOL", request.envp),//请求使用的协议,通常是HTTP/1.0或HTTP/1.1
FCGX_GetParam("GATEWAY_INTERFACE", request.envp),//cgi 版本
FCGX_GetParam("SERVER_SOFTWARE", request.envp),//nginx 版本号,可修改、隐藏
FCGX_GetParam("REMOTE_ADDR", request.envp),//客户端IP
FCGX_GetParam("REMOTE_PORT", request.envp),//客户端端口
FCGX_GetParam("SERVER_ADDR", request.envp),//服务器IP地址
FCGX_GetParam("SERVER_PORT", request.envp),//服务器端口
FCGX_GetParam("SERVER_NAME", request.envp));//服务器名,域名在server配置中指定的server name
FILE *fp = fopen("./fcgi-cpp.log", "w");
fwrite(m_data, strlen(m_data), 1, fp);
fclose(fp);
cin.rdbuf(cin_streambuf);
cout.rdbuf(cout_streambuf);
cerr.rdbuf(cerr_streambuf);
}
FCGX_Finish_r(&request);
}
return 0;
}
编译方式:gcc/g++ main.cpp -lfcgi -lfcgi++
4. 网页输入:127.0.0.1:8888/login/test
即可返回响应的信息,log文件会存储响应的信息。
5.访问自己的web网页是nginx的配置
vim /etc/nginx/sites-available/default
server {
listen 80;
listen [::]:80;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name 127.0.0.1;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
location ^~ /cgi-bin/entry.cgi/ {
include fastcgi.conf;
fastcgi_pass 127.0.0.1:9000;
}
}
重启服务