Ubuntu nginx+fcgi使用方法

文章介绍了如何在Nginx服务器中配置FastCGI,使用C和C++两种语言实现CGI接口,以及如何处理HTTP请求并记录日志。涉及了Nginx配置文件的编辑、FastCGI模块的调用和CGI环境变量的获取。
摘要由CSDN通过智能技术生成

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;
	}

}

重启服务

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以按照以下步骤配置Ubuntu上的Nginx和uWSGI开机启动: 1. 确保您已经安装了Nginx和uWSGI。如果尚未安装,请使用以下命令进行安装: ``` sudo apt update sudo apt install nginx uwsgi uwsgi-plugin-python3 ``` 2. 创建一个uWSGI的配置文件。可以使用任何文本编辑器创建一个名为`myapp.ini`的文件,并将以下内容添加到文件中(注意替换`/path/to/your/app`为您的应用程序路径): ``` [uwsgi] plugin = python3 socket = /tmp/myapp.sock chdir = /path/to/your/app wsgi-file = myapp.py processes = 4 threads = 2 master = true chmod-socket = 660 vacuum = true die-on-term = true ``` 3. 确保Nginx已经停止运行: ``` sudo systemctl stop nginx ``` 4. 创建一个Nginx的配置文件。可以使用任何文本编辑器创建一个名为`myapp.conf`的文件,并将以下内容添加到文件中(注意替换`/path/to/your/app`为您的应用程序路径): ``` server { listen 80; server_name example.com; location / { include uwsgi_params; uwsgi_pass unix:/tmp/myapp.sock; } } ``` 5. 将Nginx配置文件移动到Nginx的配置目录中: ``` sudo mv myapp.conf /etc/nginx/sites-available/ ``` 6. 创建一个符号链接以启用该配置文件: ``` sudo ln -s /etc/nginx/sites-available/myapp.conf /etc/nginx/sites-enabled/ ``` 7. 启动Nginx和uWSGI,并设置它们在开机时自动启动: ``` sudo systemctl start nginx sudo systemctl enable nginx sudo uwsgi --ini /path/to/your/app/myapp.ini sudo systemctl enable uwsgi ``` 现在,每当您的Ubuntu系统启动时,Nginx和uWSGI将自动启动,并且您的应用程序将可通过Nginx进行访问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值