Pergunta

Depois de fazer alguma pesquisa aqui, eu encontrei ao lado de nenhuma pergunta sobre o desenvolvimento de um servidor web.

Estou principalmente vai estar fazendo isso por duas razões. Como um projeto paralelo e para saber mais sobre o desenvolvimento de um programa de servidor. Isso não vai se transformar em um aplicativo útil, mais uma ferramenta de aprendizagem

Assim, as perguntas são simples.

  • Você desenvolveu um servidor web? (Não importa o idioma)
  • Quais são as armadilhas e outras dicas boas que você pode fornecer

Os links para sites úteis são bem-vindos, mas não link para um projeto de trabalho que é de código aberto, uma vez que este é sobre o processo de aprendizagem.

Foi útil?

Solução

Um servidor web começa como sendo uma peça extremamente simples de código:

  • abram um soquete TCP / IP na porta 80
  • enquanto não finalizado
    • espera para conexões em que o soquete
    • Quando alguém lhe envia cabeçalhos HTTP
      • encontrar o caminho para o arquivo
      • copiar o arquivo para o soquete

Assim, o esboço do código é fácil.

Agora, você tem algumas complexidades de lidar com:

  • na versão mais simples do código, enquanto você está falando com um navegador, todos os outros não podem se conectar. Você precisa vir para cima com alguma forma de lidar com múltiplas conexões.
  • muitas vezes é conveniente para ser capaz de enviar algo mais do que apenas um arquivo estático (embora os primeiros servidores HTTP fez exatamente isso), então você precisa ser capaz de executar outros programas.

Como manusear a possibilidade de múltiplas conexões também é relativamente fácil, com um número de escolhas possíveis.

  • a versão mais simples (mais uma vez, esta é a forma como foi feito originalmente) é ter o código que escuta a porta 80 configurar uma tomada específica para essa conexão, então desembolsar uma cópia de si mesmo para lidar com isso uma conexão. Esse processo é executado até que o soquete é fechado, e depois termina. No entanto, isso é relativamente caro:. Um garfo leva dezenas de milissegundos, em geral, de modo que os limites de quão rápido você pode correr
  • A segunda opção é criar um processo leve - a / k / a um fio -. Para processar o pedido

A execução de um programa é realmente bastante fácil também. Em geral, você define um caminho especial para um diretório CGI; um URL que tenha um caminho através desse diretório, em seguida, interpreta o nome do caminho como o caminho para um programa. O servidor, então, criar um subprocesso usando fork / exec, com STDOUT ligado à tomada. O programa funciona então, enviar saída para STDOUT, e é enviado para o navegador do cliente.

Este é o padrão básico; tudo o resto servidor de web faz é apenas adicionando babados e funcionalidade adicional para este padrão básico.

Aqui estão algumas outras fontes para exemplo de código:


Ele praticamente não faz nada do que você realmente queria, mas para simples que é difícil de bater esta de http: // www .commandlinefu.com :

$ python -m SimpleHTTPServer

Outras dicas

Em primeiro lugar, por favor, não deixe que isso se torne um projeto utilizável -. Acertar segurança para servidores web é realmente difícil

Ok, aqui estão as coisas para manter em mente:

  1. O segmento que aceita conexões precisa entregar a threads em segundo plano assim que possível.
  2. Você não pode ter um fio para cada conexão única - com grandes volumes que você vai ficar sem o seu enrosque limite.
  3. Use algum tipo de piscina segmento de trabalho para lidar com o seu solicitações de.
  4. Certifique-se de esfregar URL quando você receber um HTTP GET solicitação. Então eu não podia fazer alguma coisa gostar http: //localhost/../../Users/blah/ para obter acesso ao nível superior.
  5. Certifique-se que você sempre definir o relevante conteúdo e mime tipos.

Boa sorte -. Este é um inferno de um trabalho

A rede et al são justas bastante normal, por isso não se preocupe tanto com isso. (Existem vários "instantânea", servidores de rede de amostra em mais qualquer idioma.)

Em vez disso, se concentrar em realmente implementar a especificação HTTP. Você vai se surpreender com a) o que você não conhece e b) quanto as coisas que são supostamente para ser HTTP compatível, realmente não são, mas falso-lo bem.

Em seguida, você vai se maravilhar que a web funciona em tudo.

Quando você é feito com HTTP, desfrutar tentando implementar IMAP.

Eu escrevi um servidor web leve em Python alguns anos atrás, também como um projeto de aprendizagem.

A parte mais simples de conselho que posso dar, especialmente como um projeto de aprendizagem, é construir um núcleo que funciona, design, em seguida, iterativa em cima disso. Não aponte para a direita lua fora do hop, começar muito pequeno, em seguida, adicione featuers, refinar e continuar. Eu recomendaria usar uma ferramenta que incentiva expermentation, como Python, onde você pode literalmente escrever e testar o código ao mesmo tempo.

O curso que TAED tinha uma atribuição de proxy para que eu possa tipo de lançar alguma luz aqui, eu acho.

Então, você vai acabar fazendo um monte de cabeçalho mudando apenas para facilitar a sua vida. Ou seja, HTTP / 1.0 é wayyy mais fácil de lidar do que HTTP / 1.1. Você não quer ter que lidar com gerenciamento de tempo limite e manter-alives e coisas assim. Uma conexão por transação é mais fácil.

Você vai estar fazendo lotes e lotes de análise. Análise é difícil em C. Eu aconselho você a escrever uma função que é algo como

int readline(char *buff, int maxLen) {
    while((c = readNextCharFromSocket(&s)) && c != '\n' && i < maxLen)
      buff[i++] = c;
    return i;
}

e manipulá-lo uma linha de cada vez, apenas porque é mais fácil de usar as funções de cadeias existentes C em uma linha de cada vez. Além disso, lembre linhas são \ r \ n separados e cabeçalhos são terminados com um \ r \ n \ r \ n.

A principal coisa difícil será a análise, desde que você pode ler arquivos tudo vai funcionar então como esperado.

Para a depuração, você provavelmente vai querer imprimir cabeçalhos que são passados ??em torno de teste de sanidade los quando breaks coisas.

-web-servidor local é um exemplo de um servidor web de desenvolvimento simples escrito em node.js .. é mais confiável e tem mais recursos do que python -m SimpleHTTPServer

Eu estava pensando em começar o mesmo projeto como uma maneira de aprender Python melhor. Há um BaseHTTPServer classe que é um bom ponto de partida bonita.

Eis alguns artigos de estilo tutorial: 1 & 2

Eu já desenvolveu um servidor Web que executa (HTML e PHP) usando a linguagem C Não é que complicado você deve saber como usar soquetes IP / TCP, Linha, a fim de lidar com vários pedidos, processa fork (você precisa criar uma criança por linha de comando php execução (i usado execvp))

Eu acho que a parte mais strugling é lidar com cordas em c langage e enviar POST / GET pedidos em linha de comando.

Boa sorte

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top