proyek nginx dalam subfolder

10

Saya merasa frustrasi dengan konfigurasi nginx saya dan karenanya saya meminta bantuan dalam menulis file konfigurasi saya untuk melayani beberapa proyek dari sub-direktori di root yang sama. Ini bukan hosting virtual karena mereka semua menggunakan nilai host yang sama. Mungkin contoh akan menjelaskan upaya saya:

  • permintaan 192.168.1.1/harus melayani index.phpdari/var/www/public/
  • permintaan 192.168.1.1/wiki/harus melayani index.phpdari/var/www/wiki/public/
  • permintaan 192.168.1.1/blog/harus melayani index.phpdari/var/www/blog/public/

Proyek-proyek ini menggunakan PHP dan menggunakan fastcgi.

Konfigurasi saya saat ini sangat minim.

server {
    listen 80 default;
    server_name localhost;

    access_log /var/log/nginx/localhost.access.log;

    root /var/www;
    index index.php index.html;

    location ~ \.php$ {
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME /var/www$fastcgi_script_name;
        include fastcgi_params;
    }
}

Saya sudah mencoba berbagai hal dengan aliasdan rewritetetapi tidak dapat mengatur semuanya dengan benar untuk fastcgi. Tampaknya harus ada cara yang lebih fasih daripada menulis blok lokasi dan duplikasi root, index, SCRIPT_FILENAME, dll

Setiap petunjuk untuk mengarahkan saya ke arah yang benar dihargai.

Timotius
sumber
Karena penasaran, URL apa yang Anda harapkan dapat mengakses file /var/www/public/wiki/foo.html di?
natacado
Poin yang bagus, natacado. direktori publik utama hanya akan menjadi beberapa file lain-lain dan seharusnya tidak pernah benar-benar digunakan. Ini adalah pengaturan internal sehingga saya akan mengendalikannya. Mudah-mudahan kita tidak perlu mencari tahu :)
Timothy

Jawaban:

16

Karena proyek Anda sebenarnya tidak di root yang sama, Anda harus menggunakan beberapa lokasi untuk ini.

location /wiki {
    root /var/www/wiki/public;
}

location ~ /wiki/.+\.php$ {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_param  SCRIPT_FILENAME /var/www/wiki/public$fastcgi_script_name;
}

location /blog {
    root /var/www/blog/public;
}

location ~ /blog/.+\.php$ {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_param  SCRIPT_FILENAME /var/www/blog/public$fastcgi_script_name;
}

Juga, letakkan fastcgi_index di file fastcgi_params Anda dan sertakan di tingkat server, dengan cara itu Anda menjaga lokasi php sekecil mungkin.

Martin Fjordvald
sumber
1
Ini persis jenis konfigurasi yang saya harapkan untuk menghindari ... duplikasi. Sayangnya, jika ini "tepat" dari itu yang akan saya lakukan. Terima kasih atas bantuan Anda, Martin!
Timothy
7

Dipecahkan oleh lokasi + alias:


location / {
   root /var/www/public;
   index index.php;
}
location /blog/ {
   alias /var/www/blog/public/;
   index index.php;
}
location /wiki/ {
   alias /var/www/wiki/public/;
   index index.php;
}

location ~ \.php$ {
   #your fastcgi configuration here 
}

Vadim
sumber
0

Inilah yang saya coba, rincian lebih lanjut di http://programmersjunk.blogspot.com/2013/11/nginx-multiple-sites-in-subdirectories.html

    location /Site1/ {
            root /usr/share/nginx/www/Site1;
           try_files $uri $uri/ /index.php?$query_string;
    }

    # the images need a seperate entry as we dont want to concatenate that with index.php      
    location ~ /Site1/.+\.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
            root /usr/share/nginx/www/Site1;
    }
    # pass the PHP scripts to FastCGI server
    location ~ /Site1/.+\.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            allow 127.0.0.1;
    #       # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    #       # With php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_index index.php;
    }

location /Site3/ {
            root    /usr/share/nginx/www/Site3;
    }

    # pass the PHP scripts to FastCGI server
    location ~ /Site3/.+\.php$ {
            allow 127.0.0.1;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            include fastcgi_params;
            #we are directly using the $request_filename as its a single php script
            fastcgi_param SCRIPT_FILENAME $request_filename;
    }
appcoder
sumber