Domanda

In Tomcat 6 ho un servlet che esegue openbluedragon, tutto si compila e server in modo discreto, ad eccezione delle immagini, hanno un ritardo significativo. Qualche suggerimento per l'ottimizzazione della pubblicazione di immagini?

Ecco il mio server.xml:

    <Service name="Catalina">

      <Connector port="8009" protocol="AJP/1.3" />
      <Connector port="8080" maxThreads="100" protocol="HTTP/1.1" connectionTimeout="20000" />
      <Engine name="Standalone" defaultHost="hostname.whatever" jvmRoute="ajp13">

      <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
      <Host name="hostname.whatever"  appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
        ...context
      </Host>

    </Engine>
  </Service>
È stato utile?

Soluzione

Un'altra opzione è usare apache come frontend, collegando tomcat a mod_jk. In questo modo puoi consentire ad apache di pubblicare contenuti statici (ad es. Immagini, css, javascript) e consentire a tomcat di generare i contenuti dinamici. Potrebbe lasciare un po 'di lavoro per separare i contenuti statici da quelli dinamici, ma funziona benissimo per me.

Su Unix, avere un apache come frontend è una buona opzione perché essendo legato alla porta 80 sei spesso costretto ad eseguire come root. Apache sa come eliminare i permessi di root dopo aver associato una porta, Tomcat no. Non vuoi che un server rivolto al pubblico venga eseguito come root.

(È simile alla risposta del proxy inverso, ma non comporta un proxy ma mod_jk)

Altri suggerimenti

Stai offrendo sempre lo stesso set di immagini? In tal caso l'aggiunta di un filtro servlet che aggiunge un'intestazione Expires ragionevole potrebbe far risparmiare molto lavoro a Tomcat. Non aumenterà la velocità dell'immagine servita, ma farà solo il numero di richieste che deve gestire di meno. Molti esempi per questo sul web.

Se si dispone dell'opzione, è possibile aggiungere un proxy inverso prima dell'applicazione. Al lavoro ho un server web Apache che riceve tutte le connessioni HTTP in entrata. In base all'URL, inoltra la richiesta a un altro server o pubblica il contenuto stesso. Ho usato questo approccio per accelerare la pubblicazione di contenuti statici per un sito Trac. Le direttive ProxyPass e ProxyPassReverse sono un buon punto di partenza per cercare di seguire questa strada.

Come semplice esempio, se hai una directory virtuale chiamata / images, Apache potrebbe servire qualsiasi richiesta per qualcosa in quella directory e inoltrare tutto il resto alla tua istanza Tomcat. La sintassi è piuttosto completa. Se esiste un metodo per identificare il contenuto statico, questo è un approccio che funzionerà.

Apache non è l'unica scelta qui. Penso che tutti i moderni server Web includano funzionalità simili. Se stavo iniziando oggi probabilmente guarderei LigHTTPd, solo perché fa di meno.

Potrebbero anche esserci dei proxy inversi nella cache che lo scopriranno automaticamente. Non ho familiarità con nessuno di essi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top