. 配置nginx使用FastCGI
首先,打开终端并输入以下命令以编辑nginx配置文件:
```bash
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;
}
}
```
保存并退出文件。然后,重启nginx服务以使更改生效:
```bash
systemctl restart nginx.service
```
2. C版本:返回两种方式
以下是一个C语言版本的示例,展示了如何实现两种不同的返回方式:
```c
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
```
```c
#include
#include
#include
#include
#include
int main(int argc, char *argv[]) {
int count = 0;
while (FCGI_Accept() >= 0) {
printf("Content-type: text/html
");
printf("
printf("
Fast CGI Hello FCGI!
");printf("Request number %d running on host %s
", ++count, getenv("SERVER_NAME"));
char m_data[1024] = {0};
sprintf(m_data, " SCRIPT_FILENAME: %s
QUERY_STRING: %s
REQUEST_METHOD: %s
CONTENT_TYPE: %s
CONTENT_LENGTH: %s
SCRIPT_NAME: %s
REQUEST_URI: %s
DOCUMENT_URI: %s
DOCUMENT_ROOT: %s
SERVER_PROTOCOL: %s
GATEWAY_INTERFACE: %s
SERVER_SOFTWARE: %s
REMOTE_ADDR: %s
REMOTE_PORT: %s
SERVER_ADDR: %s
SERVER_PORT: %s
SERVER_NAME: %s
", 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;
}
```
. C++版本:返回两种方式
在C++中,我们可以使用两种主要的方式来实现函数的返回值。这两种方式分别是:直接返回值和通过引用返回值。下面分别介绍这两种方法。
### 1. 直接返回值
直接返回值是指在函数内部使用`return`语句将一个值返回给调用者。这种方式适用于简单的情况,例如计算两个数的和、字符串的拼接等。
示例代码:
```cpp
#include
using namespace std;
int add(int a, int b) {
return a + b;
}
int main() {
int result = add(3, 4);
cout << "The sum is: " << result << endl;
return 0;
}
```
### 2. 通过引用返回值
通过引用返回值是指在函数内部使用`return`语句将一个变量的引用返回给调用者。这种方式适用于需要修改外部变量的情况,例如交换两个数的值、统计字符串中字符的个数等。
示例代码:
```cpp
#include
using namespace std;
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 3, y = 4;
cout << "Before swapping: x = " << x << ", y = " << y << endl;
swap(x, y);
cout << "After swapping: x = " << x << ", y = " << y << endl;
return 0;
}
```
```cpp
#include
#include
#include
#include
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
";
cout << "
";
cout << "
echo-cpp
";
cout << "Request Number: " << ++count << " running on host " << FCGX_GetParam("SERVER_NAME", request.envp) << endl; // cout<<"Content-type: application/json
"; // cout<<"{\"title\":\"name\"}"; cout< char m_data[1024] = {0}; sprintf(m_data, "SCRIPT_FILENAME: %s QUERY_STRING: %s REQUEST_METHOD: %s CONTENT_TYPE: %s CONTENT_LENGTH: %s SCRIPT_NAME: %s REQUEST_URI: %s DOCUMENT_URI: %s DOCUMENT_ROOT: %s SERVER_PROTOCOL: %s GATEWAY_INTERFACE: %s SERVER_SOFTWARE: %s REMOTE_ADDR: %s REMOTE_PORT: %s SERVER_ADDR: %s SERVER_PORT: %s SERVER_NAME: %s", // 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++库。 ```bash gcc main.cpp -o a.out -lfcgi -lfcgi++ ``` 运行方式:使用spawn-fcgi命令运行程序,指定nginx配置中的fastcgi-pass的IP地址、端口号和可执行文件路径。具体配置如下: ```bash spawn-fcgi -a 127.0.0.1 -p 9000 -f ./a.out ``` 运行成功提示:如果看到"spawn-fcgi: child spawned successfully: PID: 7896",则表示程序已成功运行。 4. 在网页中输入以下地址:`http://127.0.0.1:8888/login/test`,即可返回响应的信息,同时log文件会存储响应的信息。 5. 要访问自己的web网页,需要修改nginx的配置文件。编辑`/etc/nginx/sites-available/default`文件,添加以下内容: ```nginx 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 / { try_files $uri $uri/ =404; } location ^~ /cgi-bin/entry.cgi/ { include fastcgi.conf; fastcgi_pass 127.0.0.1:9000; } } ``` 保存文件后,重启nginx服务以使更改生效。