It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center.
Closed 10 years ago.
I'm working on an nginx.conf for running Magento, the site mostly works, magento is run using php-fpm.
But some parts of it are still not working, and I've tried every wiki, blog, etc around the web.
My problem is that where ever I have a Javascript pop-up on CMS pages and blocks, mainly the tiny_mce WYSIWYG editor, (/js/tiny_mce/plugins/advimage/image.htm etc) they open a page not found.
I don't know what should I do so this editor displays correctly.
Also, the downloader doesn't display.
It seems that each of these use its own index.php inside a different folder than root, so should I change the index to that?
like $document_root/downloader/index.php ?
I HIGHLY suggest you read and follow the nginx primer by Martin Fjordvald.
I use the following configuration for Magento. It not only works great, it also turns off access_log for images, etc. and has a special php-fpm configuration. Please note that the server root is specified within the server block. Several configuration files incorrectly specify it within a location block.
Magento nginx configuration file:
(Be sure to replace all paths and domain names accordingly)
server {
listen 80;
#listen 443 default ssl;
server_name DOMAIN.COM;
#rewrite requests to www
rewrite ^ $scheme://www.DOMAIN.COM$request_uri permanent;
}
server {
listen 80;
#listen 443 default ssl;
#ssl_certificate /path/to/ssl.crt;
#ssl_certificate_key /path/to/ssl.key;
server_name www.DOMAIN.COM;
# most likely /var/www/...
root /path/to/files;
include /etc/nginx/restrictions.conf;
location / {
index index.php;
if ($request_uri ~* "\.(ico|css|js|gif|jpe?g|png)$") {
access_log off;
expires max;
}
try_files $uri $uri/ #handler;
}
# protect directories
location /app/ {
deny all;
}
location /includes/ {
deny all;
}
location /lib/ {
deny all;
}
location /lib/minify/ {
allow all;
}
location /media/downloadable/ {
deny all;
}
location /pkginfo/ {
deny all;
}
location /report/config.xml {
deny all;
}
location /var/ {
deny all;
}
location /var/export/ {
# restrict access to admins
auth_basic "Restricted";
auth_basic_user_file htpasswd;
autoindex on;
}
location #handler {
rewrite ^(.*) /index.php?$1 last;
}
# include php specific configuration
include /etc/nginx/php.conf;
}
This is a php-fpm specific configuration file which intercepts error codes and splits the path info correctly so you have access to the correct path parts in PHP. I also use a Unix socket rather than a port due to performance improvements. Also note that you don't need to repeat the fastcgi_params already specified in fastcgi_params.
fastcgi_intercept_errors on;
# this will allow Nginx to intercept 4xx/5xx error codes
# Nginx will only intercept if there are error page rules defined
# -- This is better placed in the http {} block as a default
# -- in that virtual host's server block
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# A handy function that became available in 0.7.31 that breaks down
# The path information based on the provided regex expression
# This is handy for requests such as file.php/some/paths/here/
include fastcgi_params;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/phpfpm.sock;
}
My fastcgi_params configuration file is optimized for a small server (<1GB RAM). Be sure to adjust yours according to your server's performance:
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
fastcgi_connect_timeout 90;
fastcgi_send_timeout 180;
fastcgi_read_timeout 360;
fastcgi_buffer_size 1024k;
fastcgi_buffers 8 512k;
fastcgi_busy_buffers_size 1024k;
fastcgi_temp_file_write_size 1024k;
fastcgi_intercept_errors on;
fastcgi_pass_header *;
We have magento installed to mydomain.com/store, and we use next config for nginx:
server {
listen <needed ip(s)>:80;
server_name mydomain.com;
root /www/mydomain;
location ~ /\. {
deny all;
}
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico)$ {
access_log off;
expires 30d;
}
location /store/ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/store/index.php;
fastcgi_param SCRIPT_NAME /store/index.php;
fastcgi_index index.php;
}
location /store/static/ { }
location /store/skin/ { }
location /store/media/ { }
location /store/errors/ { }
location ~* /store/errors/.*\.xml$ { deny all; }
location ~* /store/errors/.*\.phtml$ { deny all; }
location ~* /store/errors/.*\.php$ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME /store/errors$fastcgi_script_name;
fastcgi_index index.php;
fastcgi_read_timeout 600;
}
location /store/js/ { }
location ~* /store/js/.*\.php$ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/store/js$fastcgi_script_name;
fastcgi_param SCRIPT_NAME /store/js$fastcgi_script_name;
fastcgi_index index.php;
fastcgi_read_timeout 600;
}
}
you have to rewrite all .htaccess rules to ngnix configuration to get this working. Worth to read http://www.nbs-system.co.uk/blog-2/magento-optimization-howto-en.html
Related
If you go to www.example.com/parent/child.php, I want it to rewrite to www.example.com/parent/child
Here is my site's config (without any changes I've made to attempt hiding .php):
server {
listen 80;
server_name example.com;
root /example/root/;
# PHP loaded from here
include /etc/nginx/default.d/php.conf;
location ~* \.(eot|otf|ttc|ttf|woff|woff2)$ {
add_header 'Access-Control-Allow-Origin' '*';
}
location / {
}
Here is the contents of the php.conf file:
index index.php index.html index.htm;
location ~ \.(php|phar|html)(/.*)?$ {
fastcgi_split_path_info ^(.+\.(?:php|phar))(/.*)$;
fastcgi_intercept_errors on;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php-fpm;
}
I've tried all of the first several results on Google and several that popped up on my search here on stackoverflow including the #extensionless-php suggestion that pops up everywhere.
I haven't tried making any alterations to the php.conf file since it's shared across multiple domains.
Any config changes either do nothing or I just start getting a prompt to download the .php file instead.
I'm using Nginx for a PHP project. Here is what I do in /etc/nginx/sites-available/default:
server {
server_name domain_a.com;
include /etc/nginx/main.conf; // listen, php directives, etc.
location ~ (.*)\.php(/|$) {
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
}
}
server {
server_name domain_b.com;
include /etc/nginx/main.conf;
location ~ (.*)\.php(/|$) {
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
// Specific to this domain
auth_basic "Authentication";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
/etc/nginx/main.conf
listen 80;
client_max_body_size 5M;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
root /var/www/web;
I have a lot of repetition in this code : The two location block could be merge in one for the two domains. I think I could use a if statement to add my specific code for domain_b but it's cleary not a recommanded way according to the documentation http://wiki.nginx.org/IfIsEvil
Do you have idea how I can do to respect the DRY concept ?
Thx,
For me I create a folder in my conf and call it includes for example and then you can include this where ever you want, for example
# /etc/nginx/includes/php.conf
location ~ (.*)\.php(/|$) {
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
}
Then in your configurations do something like this
server {
server_name domain_a.com;
include /etc/nginx/main.conf; // listen, php directives, etc.
include /etc/nginx/includes/php.conf;
}
server {
server_name domain_b.com;
include /etc/nginx/main.conf;
include /etc/nginx/includes/php.conf;
auth_basic "Authentication";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
I've got a problem with Nginx. I'm just learning it, so it don't know fix this issue.
One of my plugins is trying to POST to a specific url that ends with a 'PHP'-extension.
The file isn't location in the root of the folder: 'web'. But in the directory:
web/plugins/moxiemanager/api.php. But I'm always receiving a 405.
What do I have to change in the configurations?
Thanks in advance.
My Nginx configurations:
server {
listen 80;
server_name kevin.dev;
root /var/www/html/kevin/web;
location / {
try_files $uri #rewriteapp;
}
location #rewriteapp {
rewrite ^(.*)$ /app.php/$1 last;
}
location ~ ^/(api|app|app_dev|config)\.php(/|$) {
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
#fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
}
error_log /var/log/nginx/kevin_error.log;
access_log /var/log/nginx/kevin_access.log;
}
This may not be the best way to do it, I'm still finding my way with nginx, but it worked for me just now.
I duplicated my existing location block for app.php to cover the moxia script, so for me adding this did the job...
location ~ moxiemanager/api.php$ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SERVER_PORT 80;
include /etc/nginx/fastcgi_params;
}
that covers urls ending with moxiemanager/api.php. I'm not 100% sure of the security implications of doing it like this though.
I am trying to migrate from XAMPP to Nginx webserver. I used to have multiple websites running with Xampp with each web folder residing under xampp/htdocs folder. so for example, I will access sites(yii web sites) as [code]http://myserver/site1[code] and [code]http://myserver/site2[code] and they would be accessed from the site1 and site2 folders under htdocs. But I am having trouble setting this up in nginx. I have setup the default configuration with the root folder as /etc/share/nginx/www (and site1 and site2 folders are under www) and when i access the same way with nginx, the webpage gives an error saying "No Input file specified". I understand that multiple sites are setup in nginx with different domain names and different root folders, but is it possible to have the xampp like configuration? Because i am testing this on my local network and i do not want to setup multiple domain names for this.
Config for latest nginx versions is pretty simple. First you should edit nginx/conf/nginx.conf and make sure you have something like include vhosts/*.conf; inside http { section. That will make nginx look for extra configs under vhosts.
Also it's a good idea to declare the following in http { as well not to repeat it for each individual config:
gzip on;
charset utf-8;
index index.php index.htm index.html;
Then in nginx/conf/vhosts/mydomain.com.conf:
server {
listen 80;
server_name mydomain.com;
root /var/www/mydomain.com/www;
location / {
try_files $uri $uri/ /index.php?$args; # Redirect everything that isn't real file to index.php including arguments.
}
location ~ \.php$ {
include fastcgi.conf; # that's if you have one of latest versions of nginx. If not, see below
fastcgi_pass 127.0.0.1:9000; # or pass through socket if it's how you've configured php-fpm
}
location ~ /\.(ht|svn) {
deny all;
}
}
In case you don't have fastcgi.conf here it is:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
Now the only thing left is to add mydomain.com to your hosts file so it's recognized locally.
That's simple.
Drop your databases, compress them, import them again OR use mysql -u root -p BASENAME < /the/path/BASEDROP.sql
Then simply move your default dir like /var/www/html and set permissions to 0777 or less by using chmod 0777 -R /the/path and also use chown www-data:www-data -R /the/path AND THEN reboot your system.
Well, after struggling through I finally found the ideal configuration. I understand this is not a recommended setup, but this is the give problem for me (nginx with multiple sites as subdirectories) and had to find a solution for it.
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;
}
More details on this blog, http://programmersjunk.blogspot.com/2013/11/nginx-multiple-sites-in-subdirectories.html
I am trying to setup Zurmo CRM on my local machine (Win8x64). After installing all the requirements I want to get started with the actual installation. The problem is that it seems the paths are not correctly passed from NGinx to FastCGI PHP. Here is my Nginx serve configuration:
server {
listen 80;
server_name zurmo.local;
root html/zurmo.local;
set $index "index.php";
charset utf-8;
location / {
index index.html $index;
try_files $uri $uri/ /$index?$args;
}
location ~ ^/(protected|framework|themes/\w+/views) {
deny all;
}
location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
try_files $uri =404;
}
location ~ \.php {
fastcgi_split_path_info ^(.+\.php)(.*)$;
set $fsn /$index;
if (-f $document_root$fastcgi_script_name){
set $fsn $fastcgi_script_name;
}
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fsn;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fsn;
}
location ~ /\.ht {
deny all;
}
}
As a result, when I make a call to zurmo.local (which is added to hosts file) i get "This webpage has a redirect loop" with a URI that looks like this http://zurmo.local/app/app/ [...] /app/app/index.php If instead of $document_root$fsn and I comment the PATH_INFO and PATH_TRANSLATED than I get No input file specified. with a URI that looks like http://zurmo.local/app/app/index.php
Looking further into it, when I have added access_log html/zurmo.local/logs/access.log; the Nginx error.log shows me the following: [timestamp] [emerg] 4064#3660: CreateFile() "[path to stack]\nginx/html/zurmo.local/logs/access.log" failed (3: The system cannot find the path specified). As you can see the directory separator is not consistent.
One last note, my Nginx home directory is situated at nginx/html which is in fact a smlink to of ../home This is purely for keeping my file structure in a way that fits my day to day work.
How can I correctly configure Nginx in order to proceed (with the Zurmo installation) ?
I know this is an old question, but here is what I have done to make nginx + zurmo work.
server {
listen 80;
server_name zurmo.local;
root /home/www/zurmo.local;
access_log /var/log/nginx/zurmo.access.log main;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ ^/(protected|framework|themes/\w+/views) { deny all; }
location ~ /\. { deny all; access_log off; log_not_found off; }
location = /favicon.ico { log_not_found off; access_log off; }
location ~ \.(js|css|png|jpg|gif|ico|pdf|zip|rar)$ {
try_files $uri =404;
}
location ~ \.php {
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_read_timeout 600s;
fastcgi_send_timeout 600s;
}
}
I don't think you need the if() statement in your *.php block. In my nginx setups that's all i ever needed:
# Process PHP files
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# Include the standard fastcgi_params file included with nginx
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}